從.Net到Java學習第一篇——開篇
所謂工欲善其事,必先利其器,做java開發也一樣,在比較了目前最流行的幾個java IDE(eclipse,myeclipse、IDEA)之後,我果斷選擇IDEA。要知道,寫代碼的水準可以是一坨屎,但是開發工具一定要用最好的,就像一個人武功很差,又不拿一把像樣的兵器在手的話,根本就沒法闖蕩江湖,分分鐘被人砍死了。之前用eclipse,myeclipse的時候,由于和過去用VS的落差太大,弄得我一度想放棄寫java代碼,直到IDEA的出現,猶如黑暗中的一盞明燈。我是一個效率至上的人,原本可以2s鐘撸完的代碼,你偏偏要花10s,我就受不了,這不是浪費生命嗎?打個比方,同樣水準的人搏鬥,一個赤手空拳,一個拿把砍刀,誰的勝算大?除非你内功足夠強大,強大到不滞于物,草木竹石皆可傷人。是以那種拿記事本撸代碼的人,要麼就是足夠牛,要麼就是無形裝逼被緻命。善假于物也,老鳥和菜鳥很大一個差別就是,老鳥會善用各種好用的輔助開發工具。用這些工具是幹嘛的?提升開發效率!産出=時間*效率。時間大家都是8h,你再怎麼加班最多24h,而效率往往是可以超越4倍的,也就是說可能你24h也幹不過别人8h,因為效率不一樣。
srping boot的出現或許可以将java開發人員從996中的魔咒中解脫出來,進而少加班。采用Spring Boot開發實質上也是一個正常的Spring項目開發,隻是利用了Spring Boot啟動程式和自動配置簡化開發過程,提高開發效率。Spring Boot項目開發代碼的實作依然是使用Spring mvc+spring+mybatis等,當然能內建幾乎所有的開源項目。
java環境配置
下載下傳java JDK,建議1.8以上版本。
我這裡下載下傳的是:jdk_8.0.1310.11_64.exe
然後進行安裝,我這裡的安裝目錄是C:\Program Files\Java\jdk1.8.0_131,後面會用的。
配置環境變量
建立系統變量JAVA_HOME,值:C:\Program Files\Java\jdk1.8.0_131

編輯環境變量Path,在變量值的最前面添加%JAVA_HOME%\bin;,注意最後要有一個;分隔。
IDEA安裝及破解
去官網下載下傳最新版本的IDEA,需要注意的是,官網提供了兩個版本一個是社群免費版,一個是旗艦版,我們要下載下傳旗艦版的,因為免費版少了許多功能。
IDEA官網:https://www.jetbrains.com/idea/download/#section=windows
現在最新版是IntelliJ IDEA 2018.2了,我之前下載下傳的是IntelliJ IDEA 2018.1.4 x64,因為我的是win10 64bit系統。
下載下傳完成之後,點選下一步下一步就可以了,但是在最後那一步一定要注意,否則可能破解失敗,那就是在最後出現完成界面的時候,一定要把那個是否馬上運作前面的勾去掉。
(1)編輯電腦上C:\Windows\System32\drivers\etc下的hosts檔案
加入下面一行代碼:
0.0.0.0 account.jetbrains.com
儲存并關閉。
(2)打開http://idea.lanyus.com/,擷取注冊碼
打開IDEA,
IDEA配置
IDEA安裝後之後,我們要來對其進行個性化配置,我覺得最重要的有兩點,一個是快捷鍵的配置,一個是代碼顯示風格的配置,像我習慣了VS的代碼顯示風格,那麼我們可以對其進行自定義修改。
我制作了一個配置檔案,下載下傳位址:https://files.cnblogs.com/files/jiekzou/settings.zip
下載下傳完成之後,解壓之後是一個settings.jar檔案,然後在IDEA中把配置導入進來即可。
最後的顯示效果如下:
關于IDEA的代碼格式化快捷鍵,預設是:Ctrl+Alt+L,這和許多軟體的鎖屏快捷鍵沖突,是以我建議将其進行修改,我這裡已經修改為和VS代碼格式化快捷鍵一樣:Ctrl+K,Ctrl+F。這樣兩個組合快捷鍵。
File——Settings
在VS中代碼提示大小寫是不敏感的,而IDEA預設情況下是敏感的,由于個人習慣,那麼我需要将IDEA的代碼智能提示也修改為大小寫不敏感。
在IDEA中寫的代碼或者複制進去的代碼,其命名空間也就是包會自動引入的,如果出現多個包,那麼就需要自己手動引入,引入方式也很簡單,用滑鼠點到代碼位置處,然後Atl+Enter,選擇指定的包就可以了。雖然java中沒有屬性這個傳說,C#中屬性其實就是像java中一樣是通過一個get方法和一個set方法實作的,隻是C#進行了封裝,而java需要自己寫,不過IDEA中有快捷鍵可以自動生成字段的屬性:Alt+Insert。
不管使用什麼樣的IDE,熟記各種快捷鍵都是必須的,為啥?效率!效率!還是效率!
第一個spring boot web 程式
what's spring boot?
我的了解是:spring boot=spring+spring mvc+一堆java技術棧的相關架構+約定大于配置的思想。
spring boot 并不是一項新的技術,就像ajax一樣,而是各種已有技術的一個組合。它的出現,将極大地提高java應用的開發效率。同時,它的出現,徹底颠覆了以往我對java的認識(除了配置,TMD還是配置)。輕量級、可插拔、微服務。
File——New——Project
關于https://start.spring.io/,我們打開看下這是個啥
這不正是生成項目jar包的界面嗎,直接在這個界面生成jar包,然後用eclipse打開也是一樣的呀。
注意:通過這種方式來建立spring boot項目,會聯網,從網站下載下傳一些jar包。如果你想要通過離線的方式建立項目,可以選擇Maven。
由于是web項目,那麼我們這裡選擇web,關于spring boot版本,最新版本是2.1.0,我這裡用它的上一個穩定版1.5.14。我們看到有些版本後面有SNAPSHOT字樣,表明那是搶鮮版。
一直點選下一步,最終項目結果目錄如下:
我們先來看下pom.xml,它是maven來管理各種jar包依賴的一個配置檔案,maven相當于.net中的nuget,是一個包管理工具。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yujie</groupId>
<artifactId>firstdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>firstdemo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我們看到<parent>節點中申明了版本号,而且它是作為一個父節點,那麼也就意味着它的子節點可以繼承這個父節點的版本依賴。哪些是它的子節點,就是<dependencies>下面groupId和<parent>中groupId一緻的依賴。這個pom.xml中的檔案,正是我們之前可視化配置之後的産物,裡面的一些資訊就是我們之前填寫的。那麼後續,我們需要擴充的時候,隻要直接修改這個配置檔案就可以了。
關于pom.xml詳解,請參考:pom.xml詳解
如果你在pom.xml中添加代碼的時候,沒有智能提示,那麼你需要更新一下。
接下來,我們看下FirstdemoApplication這個類
package com.yujie;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FirstdemoApplication {
public static void main(String[] args) {
SpringApplication.run(FirstdemoApplication.class, args);
}
}
我們看到有一個@SpringBootApplication注解,我們檢視一下它的源碼如下:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "exclude"
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "excludeName"
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
}
View Code
從源碼中可以看出,其實@SpringBootApplication = (預設屬性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
我們依次再分别來看下這三個注解是什麼意思。
@Configuration 是一個類級注釋,訓示對象是一個bean定義的源。@Configuration 類通過 @bean 注解的公共方法聲明bean。 @Configuration的注解類辨別這個類可以使用Spring。
@Bean 注釋是用來表示一個方法執行個體化,配置和初始化是由 Spring IoC 容器管理的一個新的對象。
@Configuration 一般與 @Bean 注解配合使用,用 @Configuration 注解類等價與 XML 中配置 beans,用 @Bean 注解方法等價于 XML 中配置 bean。
@EnableAutoConfiguration 注解的類所在的包有特定的意義,并且作為預設配置使用。
@ComponentScan 注解會自動掃描指定包下的全部标有 @Component注解 的類,并注冊成bean,當然包括@Component下的子注解@Service,@Repository,@Controller。
application.properties
這是應用的配置檔案,跟.net項目中的web.config差不多。但是我個人更習慣于使用application.yml這個檔案來替代application.properties
修改application.properties,命名為application.properties-bak,其實就是讓這個配置檔案失效,但是我又不想直接删除它。
然後在添加一個檔案application.yml,注意要和application.properties在同一級目錄下面。
添加配置項:
server:
port: 8082
我這裡修改tomcat伺服器的啟動端口為8082,由于IDEA srping boot項目中自帶了tomcat,是以我們不需要配置外部的tomcat。
建立一個控制器TestController,它這個控制器的命名規範和.net mvc中規範一緻,都是Controller結尾。代碼如下:
package com.yujie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
// @RequestMapping("/hello")
// @RequestMapping(value = "/hello")
@RequestMapping(value = "/hello",method =RequestMethod.GET)
// @GetMapping("/hello")
public String hello(){
return "hello spring boot!";
}
}
@RequestMapping("/hello")和@RequestMapping(value = "/hello"是等價的。
@RequestMapping(value = "/hello",method =RequestMethod.GET)和 @GetMapping("/hello")是等價的。
@RestController注解相當于@ResponseBody + @Controller。
如果需要傳回到指定頁面,則需要用 @Controller配合視圖解析器InternalResourceViewResolver才行。
如果需要傳回JSON,XML或自定義mediaType内容到頁面,則需要在對應的方法上加上@ResponseBody注解。
注意:@RestController注解,相當于@Controller+@ResponseBody兩個注解的結合,傳回json資料不需要在方法前面加@ResponseBody注解了,但使用@RestController這個注解,就不能傳回jsp,html頁面,視圖解析器無法解析jsp,html頁面
運作程式:
熱部署
在這之前,如果我們每次修改了代碼,都必須重新開機一下伺服器,并重新運作代碼,那麼有了熱部署之後,修改了代碼,我們隻需要在IDEA中點選一下Build,就可以直接看到效果了,不需要重新開機伺服器。
pom.xml檔案中添加如下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
添加依賴之後,在IDEA的右下角會彈出如下提示框
點選“Import Changes"将會自動下載下傳j所依賴的jar包。
修改pom.xml,
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
如果不想每次修改後都要手動去Build,可以在IDEA中配置自動Build
然後按組合鍵:Shift+ALT+Ctrl+/ ,選擇“Registry”,回車,找到“complier.automake.allow.when.app.running”,點選勾選即可。
優點:簡單,支援Spring-boot項目,支援成員級别的修改熱部署。
缺點:隻支援spring-boot項目。
讀取配置檔案
修改配置檔案application.yml,添加如下代碼:
server:
port: 8082
website:
name: 網站名稱
domain: www.yujie.com
msg: 我這是一個部落格網站
建立配置檔案類WebSiteConfig,字段名稱和配置項中的名稱保持一緻。
package com.yujie.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "website")
public class WebSiteConfig {
private String name;
private String domain;
private String msg;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "WebSiteConfig{" +
"name='" + name + '\'' +
", domain='" + domain + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
在控制器類TestController中修改代碼:
@RestController
public class TestController {
@Autowired
private WebSiteConfig webSiteConfig;
// @RequestMapping("/hello")
// @RequestMapping(value = "/hello")
@RequestMapping(value = "/hello",method =RequestMethod.GET)
// @GetMapping("/hello")
public String hello(){
return "hello spring boot!1";
}
@GetMapping("/config")
public String getConfig(){
return webSiteConfig.toString();
}
}
是不是感覺像使用vs開發asp.net mvc項目一樣那麼簡單?甚至比.net 操作配置檔案還友善吧
參考:
Intellij IDEA 4種配置熱部署的方法
部落格位址: | http://www.cnblogs.com/jiekzou/ |
部落格版權: | 本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。 如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步! 再次感謝您耐心的讀完本篇文章。 |
其它: | .net-QQ群4:612347965 java-QQ群:805741535 H5-QQ群:773766020 我的拙作《ASP.NET MVC企業級實戰》《H5+移動應用實戰開發》 《Vue.js 2.x實踐指南》 《JavaScript實用教程 》 《Node+MongoDB+React 項目實戰開發》 已經出版,希望大家多多支援! |