所謂工欲善其事,必先利其器,作java開發也同樣,在比較了目前最流行的幾個java IDE(eclipse,myeclipse、IDEA)以後,我果斷選擇IDEA。要知道,寫代碼的水平能夠是一坨屎,可是開發工具必定要用最好的,就像一我的武功不好,又不拿一把像樣的兵器在手的話,根本就無法闖蕩江湖,分分鐘被人砍死了。以前用eclipse,myeclipse的時候,因爲和過去用VS的落差太大,弄得我一度想放棄寫java代碼,直到IDEA的出現,猶如黑暗中的一盞明燈。我是一個效率至上的人,本來能夠2s鍾擼完的代碼,你恰恰要花10s,我就受不了,這不是浪費生命嗎?打個比方,一樣水平的人搏鬥,一個赤手空拳,一個拿把砍刀,誰的勝算大?除非你內功足夠強大,強大到不滯於物,草木竹石皆可傷人。因此那種拿記事本擼代碼的人,要麼就是足夠牛,要麼就是無形裝逼被致命。善假於物也,老鳥和菜鳥很大一個區別就是,老鳥會善用各類好用的輔助開發工具。用這些工具是幹嗎的?提高開發效率!產出=時間*效率。時間你們都是8h,你再怎麼加班最多24h,而效率每每是能夠超越4倍的,也就是說可能你24h也幹不過別人8h,由於效率不同。java
srping boot的出現或許能夠將java開發人員從996中的魔咒中解脫出來,從而少加班。採用Spring Boot開發實質上也是一個常規的Spring項目開發,只是利用了Spring Boot啓動程序和自動配置簡化開發過程,提升開發效率。Spring Boot項目開發代碼的實現依然是使用Spring mvc+spring+mybatis等,固然能集成幾乎全部的開源項目。web
下載java JDK,建議1.8以上版本。ajax
我這裏下載的是:jdk_8.0.1310.11_64.exespring
而後進行安裝,我這裏的安裝目錄是C:\Program Files\Java\jdk1.8.0_131,後面會用的。apache
新建系統變量JAVA_HOME,值:C:\Program Files\Java\jdk1.8.0_131json
編輯環境變量Path,在變量值的最前面添加%JAVA_HOME%\bin;,注意最後要有一個;分隔。windows
去官網下載最新版本的IDEA,須要注意的是,官網提供了兩個版本一個是社區免費版,一個是旗艦版,咱們要下載旗艦版的,由於免費版少了許多功能。tomcat
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安裝後以後,咱們要來對其進行個性化配置,我以爲最重要的有兩點,一個是快捷鍵的配置,一個是代碼顯示風格的配置,像我習慣了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=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 {}; }
從源碼中能夠看出,其實@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。
這是應用的配置文件,跟.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>
</dependency> <optional>true</optional>
添加依賴以後,在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 操做配置文件還方便吧
參考: