Java 企業級開發,經歷了從 SSH (Spring + Struts2 + Hibernate)到 SSM(Spring + StringMVC + MyBatis)再到 Spring 全家桶(Spring + Spring Boot + SpringData + Spring Cloud 等)的過程。總之,代碼的封裝程度愈來愈高,開發的複雜度也在愈來愈低。html
Spring 全家桶的底層基礎都是 Spring 框架,一般能夠分爲兩類:前端
Spring Boot 能夠一站式實現 J2EE 企業級開發。vue
Spring Boot 用來簡化 Spring 應用的開發,採用「約定大於配置」的原則,省去了大量複雜的配置,能夠方便快速的建立一個企業級應用。java
Spring Boot 自己是基於 Spring 的,相似於前端框架 Vue 所使用的 vue-cli,快速建立獨立的企業級應用。web
Spring Boot 的特色:redis
由於 Spring Boot 是基於 Spring 框架的二次封裝,若是你不瞭解 Spring 框架的一些底層原理,則在輕鬆入門後,難以精通。spring
Spring Boot 的誕生背景就是微服務的大潮流,這裏先大概提一下微服務這個概念。vue-cli
微服務概念流行以前,大部分應用都是單體應用。單體應用將全部代碼耦合到一個項目中,經過命名空間或直接引入類文件實現類的調用。在項目初期比較小的時候,這種開發方式效率高、部署容易、測試方便、易於實現負載均衡(水平擴容)。可是發展到必定規模後,會出現牽一髮而動全身的問題,各類依賴關係耦合複雜,難以實現新需求,難以修改。json
微服務將應用的每個模塊獨立爲一個服務,服務之間經過 RPC 或 HTTP 方式實現相互調用,從而實現解耦,方便實現各個微服務的獨立擴容。一般會有一個網關對外提供統一的服務入口。瀏覽器
在 Spring 官網 http://spring.io/ 能夠找到各類相關的資源。HelloWorld 示例能夠參考:http://spring.io/guides/gs/actuator-service/
在 Intellij IDEA 中選擇 File-》New Project-》Maven,建立 Maven 類型的項目,選擇合適的SDK 版本後,點擊下一步,輸入 GroupId(例如com.baid)和 ArtifactId(例如 spring_boot_demo,IDEA 不支持中橫線),點擊下一步選擇項目的位置(默認在 C 盤),而後 Finish 完成便可。
項目初始化完成後,IDEA 右下角會彈出「Maven project need to be imported」彈出,選擇「Enable Auto-Import」 便可。這樣當你更新了 Maven 項目的 pom.xml 文件時,IDEA 會自動獲取依賴。
到這裏,Maven 項目就建立完成了,接下來只須要添加 Spring Boot 依賴便可,複製下面的文本到項目根目錄中的 pom.xml 文件的 project 標籤下便可:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent> <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> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency> </dependencies>
在 IDEA 中展開剛纔建立的項目的代碼目錄,在 /src/main/java 目錄右擊,建立新的 Java class,輸入「com.kikakika.SpringBootApplication」這種方式,能夠自動建立包和類,而後編輯類:
package com.kikakika; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 經過註解標註這是一個 Spring Boot 主程序類 */ @SpringBootApplication public class HelloWorldMainApplication { // 啓動 Spring Boot 應用程序 public static void main(String[] args) { SpringApplication.run(HelloWorldMainApplication.class, args); } }
右擊 com.kikakika 包名,建立新的 Java class,輸入 controller.HelloController,在 com.kikakika.controller 包下面建立 HelloController 類:
package com.kikakika.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @ResponseBody @RequestMapping public String Hello() { return "Hello World!!"; } }
回到 SpringBootApplication 文件,右擊,運行便可啓動這個 Java 應用。控制檯會打印啓動日誌,注意看對應的 Tomcat 端口,通常是 8080:
2019-01-01 12:27:20.100 INFO 12380 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2019-01-01 12:27:20.154 INFO 12380 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2019-01-01 12:27:20.160 INFO 12380 --- [ main] com.kikakika.HelloWorldMainApplication : Started HelloWorldMainApplication in 5.598 seconds (JVM running for 8.007)
在瀏覽器中訪問localhost:8080/hello
查看效果。
參考:https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html
首先將 Spring Boot 的用於建立可執行 Jar 文件的 Maven 插件導入項目中:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.1.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
而後,打包。
打包完成後,整個項目,包括 Tomcat 都會被打到一個 Jar 包中,通常放在項目根目錄下的 target 目錄中,能夠直接經過 java -jar
命令運行便可。
C:\Users\kika\Desktop>java -jar spring_boot_demo-1.0-SNAPSHOT.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.5.RELEASE) 2019-01-01 12:50:36.293 INFO 10096 --- [ main] com.kikakika.HelloWorldMainApplication : Starting HelloWorldMainApplication v1.0-SNAPSHOT on DESKTOP-QDO2CMR with PID 10096 (C:\Users\kika\Desktop\spring_boot_demo-1.0-SNAPSHOT.jar started by kika in C:\Users\kika\Desktop) 2019-01-01 12:50:36.301 INFO 10096 --- [ main] com.kikakika.HelloWorldMainApplication : No active profile set, falling back to default profiles: default 2019-01-01 12:50:36.447 INFO 10096 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6d1e7682: startup date [Tue Jan 01 12:50:36 CST 2019]; root of context hierarchy
經過瀏覽器訪問便可,效果跟在 IDEA 中啓動應用同樣。
在項目根目錄下的 pom.xml 文件中,能夠看到 artifactId 以 spring-boot-starter-
開頭的各類項目,無論是在 parent 父項目標籤仍是 dependencies 依賴標籤中。這些項目,就是各類場景下的啓動器,每一個啓動器都內置了完整的依賴。
Spring 提早爲咱們封裝了各類場景下的啓動器,例如針對 ActiveMQ 的 spring-boot-starter-activemq,針對 AOP 的 spring-boot-starter-aop,針對使用 Hibernate 的 Spring Data JPA 的 spring-boot-starter-data-jpa,針對 Redis 的 spring-boot-starter-data-redis,針對郵件的 spring-boot-starter-mail 等。使用的時候,只須要當作依賴導入便可。
例如 web 開發所用到的 spring-boot-starter-web 項目的依賴關係以下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.5.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> <version>2.0.5.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>2.0.5.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.12.Final</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.9.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.9.RELEASE</version> <scope>compile</scope> </dependency> </dependencies>
全部的 Spring Boot 入口類必須添加 @SpringBootApplication
註解,表示這是一個 Spring Boot 應用程序。
按住 Ctrl 後點擊 SpringBootApplication 註解,能夠查看註解的定義。能夠看到這個註解有引入了一堆其餘註解,其中有個 EnableAutoConfiguration 註解,繼續深刻能夠發現 EnableAutoConfiguration 註解又引入了另外一堆註解,其中有 @AutoConfigurationPackage
和 @Import({AutoConfigurationImportSelector.class})
。
查看這個註解的定義時,能夠發現其引入了 @Import({Registrar.class})
註解,進入到 Registrar 類對應代碼,在下面這一行加斷點:
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()); }
在 getPackageName 方法上右擊,選擇「Evaluate Expression」,查看對應信息,這裏會顯示加 @SpringBootApplication
的類所在的包:
綜上,Spring Boot 將主配置類(即便用 @SpringBootApplication
註解標註的類)所在的包及其子包下的全部組件都掃描到 Spring 容器。
@Import({AutoConfigurationImportSelector.class})
註解EnableAutoConfiguration 註解中,還引入了 @Import({AutoConfigurationImportSelector.class})
這個註解。
最終,全部自動加載的依賴,都來自 Maven 倉庫中的 Jar 包指定,若是須要修改,能夠直接改這裏:repository/org/springframework/boot/spring-boot-autoconfigure/2.0.5.RELEASE/spring-boot-autoconfigure-2.0.5.RELEASE.jar!/META-INF/spring.factories
Spring Boot 太流行了,因此各個版本的 IDE 都內置了建立 Spring Boot 項目的快速方式。對於 IDEA,在建立項目 project 時,能夠選擇建立 「Spring Initialize」 項目,IDEA 會在建立項目時提示你導入各類 Starter 啓動器,以後便自動導入依賴。