SpringBoot簡介
Springboot
特點
實現容器的獨立執行
可以以jar包形式啟動一個具備spring容器的所有特點的工程
通過main方法執行啟動一個spring容器
內嵌了servlet容器
預設內嵌式tomcat,可以根據依賴替換成jetty,undertow
提供了簡化依賴
例如:開發一個web應用 spring-web,spring-webmvc,jackson-core等
springboot提供spring-boot-starter-web的簡化依賴
核心特性(自動配置)
是由於低層經過了大量程式碼編寫,擴充套件了自動配置的邏輯,會根據使用場景建立記憶體物件
手動搭建一個springboot
pom檔案修改 pom.xml
新增繼承springboot-parent工程
開發web應用,新增開發web應用依賴starter-web
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.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-jdbc</artifactId> </dependency>--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
src/main/java
com.wiscom.controller
package com.wiscom.controller; @RestController public class HelloController { @Autowired private HelloService helloService; @RequestMapping("hello") public String sayHi(String name){ return "controller:"+helloService.sayHi(name); } }
com.wiscom.service
package com.wiscom.service; @Service public class HelloService { public String sayHi(String name) { return "service"+"hello springboot "+name; } }
com.wiscom
package com.wiscom; //springboot的核心註解 @SpringBootApplication public class StarterDemo01 { //當前springboot中唯一的一個入口方法main public static void main(String[] args) { //SpringBoot體工程啟動物件 SpringApplication.run(StarterDemo01.class, args); } }
springboot配置
application.properties
springboot的全域性配置,
絕大多數應用場景使用的屬性都可以在這個配置檔案中配置讀取
實現埠修改
訪問路徑的修改
src/main/resourses
application.properties
properties檔案可以用yaml格式書寫
這是全域性配置
server.port=8090 server.context-path=/1905 #spring.datasource.driverClassName=com.jdbc.mysql.Driver #datasource #mybatis #redis #rabbitmq #elasticsearch
自動配置原理
springboot自動配置利用的註解
@Configuration
定義配置類
@bean
配置bean物件
@ConfigurationProperties
讀取物件需要的屬性
java語言
javaconfig:將xml語言解析成記憶體物件,相當於DOM/SAX解析器
jdk1.5出現,spring利用javaconfig特性,將xml檔案轉化為註解
@Configuration
:表示一個完整的xml檔案
@ComponentScan
:表示xml中<context:compoment-scan>
@Bean
:表示一個xml檔案中的<bean>
標籤.......
spring 需要掌握的標籤
@configuration
@Bean
@ConfigurationProperties
@conditionalOnClass
.....
將xml檔案轉化為註解的形式
src/main/java
com.wiscom
StartDemo.java
package com.wiscom; //springboot的核心註解 @SpringBootApplication public class StartDemo { // springboot中唯一的一個入口方法main public static void main(String[] args) { SpringApplication.run(StartDemo.class, args); } }
com.wiscom.pojo
MyBean.java
package com.wiscom.pojo; // 需要生成bean標籤物件 public class Mybean { private int age; private String name; public Mybean() { System.out.println("Mybean被建立成功"); } }
com.wiscom.config
MyBeanConfig.java
package com.wiscom.config; // 配置類的註解,相當於一個獨立的xml檔案載入的內容 @Configuration public class MybeanConfig { // 相當於 <bean id="initMybean" class="com.wiscom.pojo.Mybean"> @Bean public Mybean initMybean(){ return new Mybean(); } }
com.wiscom.controller
HelloController.java
package com.wiscom.controller; @RestController public class HelloController { @Autowired private HelloService helloService; // 引用bean,檢視是否被建立成功 @Autowired private Mybean mybean; @RequestMapping("hello") public String sayHi(String name){ return "controller:"+helloService.sayHi(name); } }
@ConfigurationProperties的使用
可以讀取配置中的值:
properties/yml
可以定義字首,自動賦值給類中的同名屬性
src/main/resources
application.properties
springboot.conf.test.url=1 springboot.conf.test.username=1 springboot.conf.test.password=1 springboot.conf.test.driver=1
src/main/java
com.wiscom.pojo
Yourbean.java
package com.wiscom.pojo; public class Yourbean { private String url; private String driver; private String username; private String password; public Yourbean(){ System.out.println("YourBean已被建立"); } }
com.wiscom.config
YourBeanConfig.java
其中的屬性值要從配置中讀取
package com.wiscom.config; @Configuration // 配置檔案中的值要以 springboot.conf.test 為字首 @ConfigurationProperties("springboot.conf.test") public class YourBeanConfig { private String url; // springboot.conf.test.url private String username; // springboot.conf.test.username private String password; // springboot.conf.test.password private String driver; // springboot.conf.test.driver @Bean public YourBean initYourBean(){ // YourBean yb=new YourBean(); // 建立一個YourBean物件,給其中的屬性賦值 yb.setUsername(username); yb.setPassword(password); yb.setDriver(driver); yb.setUrl(url); return yb; } }
自動裝配的核心註解
@ConditionalOnClass
:當前環境可以掃描到類時,滿足條件
@ConditionalOnBean
:當前環境存在這個Bean物件時,滿足條件
@ConditionalOnMissingClass
:當環境沒有class時,滿足
@ConditionalOnMissingBean
:當環境滅有bean時,滿足
@ConditionalOnProperties
:當環境具備什麼properties屬性值時,滿足條件
舉例
@ConditionalOnClass
src/main/java
com.wiscom.condition
ConditionalTestbean.java
package com.wiscom.condition; public class ConditionalTestbean { private int age; private String name; public ConditionalTestbean() { System.out.println("ConditionalTestbean物件已被建立"); } }
com.wiscom.config
ConditionalConfig.java
package com.wiscom.config; @Configuration // 只有ConditionalTestbean類被載入後,才會載入這個類 // 如果沒有這個類,會報錯,但不影響執行 @ConditionalOnClass({ConditionalTestbean.class}) public class ConditionalConfig { @Bean public ConditionalTestbean iniMybean(){ return new ConditionalTestbean(); } }
springboot的核心註解:@SpringBootApplication
@SpringBootApplication
是一個組合註解
組合註解
@SpringBootConfiguration
:標識了一個配置類效果等同於
@Configuration
@EnableAutoConfiguration
:自動轉配實現註解可以實現讀取所有springboot擴充套件配置類的全路徑名稱
@ComponentScan
:掃描預設情況是根據註解所在的類的包名實現掃描範圍的
@EnableAutoConfiguration
Import匯入了一個開啟自動配置匯入選擇器的物件
@Import(EnableAutoConfigurationImportSelector.class)
EnableAutoConfigurationImportSelector
的父類
AutoConfigurationImportSelector
中的getCandidateConfigurations
方法獲取了候選的配置類方法中通過
SpringFactoriesLoader
可以載入所有自動配置中的檔案spring.factory
spring.factory
位於
Maven Dependencies
包下 ---->spring-boot-autoconfigure
--->META-INF
(元資料) ---->spring.factories
run方法啟動spring容器的過程
run呼叫
通過啟動類反射物件,收集工程各種環境資訊
收集spring啟動前的各種初始化資訊
利用收集的環境資訊開始建立容器中各種物件
bean
物件,configuratoin factory
(載入配置檔案)收尾工作
將啟動建立過程中的工具銷燬
springboot自動配置原理
啟動順序
run方法啟動
初始化收集環境資訊,通過反射物件獲取核心註解
@SpringBootApplication
根據初始化資訊,建立spring容器中各種物件
將中間物件銷燬,保留spring容器清潔,啟動結束
自動配置
springboot擴充套件了一大批需要自動配置類
每一個配置類的結構需要使用到spring的註解功能
@Configuration
標識一個配置類,相當於載入一個xml檔案
@ConfigurationProperties
物件建立初始化,從配置檔案中讀取屬性
@Conditional
衍生註解,指定載入配置類建立bean物件的詳細條件
只有滿足條件才會建立相應內容
@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingClass
@ConditionalOnMissingBean