目錄
1.1 創建簡單的maven工程,pom.xml導入SpringBoot起步依賴依賴
步驟一:在pom.xml添加Springboot的maven插件依賴
步驟二:在IDEA右側maven工具欄點擊maven打包插件
步驟三:將打包後的jar包複製到指定目錄,在控制檯使用命令啓動應用
2.3.1 @SpringBootApplication註解
2.3.2 @SpringBootConfiguration註解
2.3.3 @EnableAutoConfiguration註解
3.使用Spring Initializer快速創建Spring Boot項目
4.1.3 案例:SpringBoot應用使用application.yml文件配置“值注入”
4.2 application.properties配置方式
4.3 @ConfigurationProperties獲取值與@Value註解注入獲取值的區別
4.7.2 佔位符獲取之前配置的值,如果沒有可以是用:指定默認值
4.8.1 application.properties的多profile文件形式
1.入門程序導向
工具:
IntelliJ IDEA2019.1
maven3.6.1
SpringBoot版本:
1.5.9
1.1 創建簡單的maven工程,pom.xml導入SpringBoot起步依賴依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
1.2 編寫主程序,啓動SpringBoot應用
/**
* @SpringBootApplication 來標註一個主程序類,說明這是一個Spring Boot應用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
// Spring應用啓動起來
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
1.3 編寫相關的Controller、Service
@Controller
public class HelloController {
@ResponseBody
@RequestMapping(value = "/hello")
public String helllo(){
return "Hello World";
}
}
1.4 啓動SpringBoot主程序測試
- 測試結果:
1.5 簡化部署
- 回顧以前的web項目部署
一般一個web項目如果要部署,要先打包成一個war包,然後再把war包放到Tomcat服務器上,如果目標環境沒有tomcat服務器,還得再配置
- SpringBoot項目的部署方式
如果是SpringBoot應用,完全不再需要打包war包,而是使用一個maven插件,看SpringBoot的官方文檔介紹
官網地址:https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/
- 這個插件的作用是,把應用打包成一個可執行的jar包,無需再在目標環境配置tomcat服務器
-
步驟一:在pom.xml添加Springboot的maven插件依賴
<!--這個插件,可以將應用打包成一個可執行的jar包;-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
-
步驟二:在IDEA右側maven工具欄點擊maven打包插件
打包的時候上面添加的maven插件就會介入對項目進行打包
-
步驟三:將打包後的jar包複製到指定目錄,在控制檯使用命令啓動應用
即使目標環境沒有安裝tomcat環境,也沒有關係,因爲SpringBoot自帶了tomcat服務器
只需要你在項目中添加SpringBoot依賴,打包時會把相應的依賴打包進來
啓動命令
java -jar springboot-01-helloworld-1.0-SNAPSHOT.jar
步驟四:啓動成功
2.SpringBoot的結構分析
2.1 pom文件
-
父項目
每個Springboot應用都需要導入的父項目依賴spring-boot-starter-parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
而spring-boot-starter-parent的父項目又是spring-boot-dependencies
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath>../../spring‐boot‐dependencies</relativePath>
</parent>
spring-boot-dependencies的作用是真正管理SpringBoot應用裏面的所有jar包依賴版本,它又稱爲是Springboot的版本仲裁中心
如:commons相關的依賴
如:測試相關的依賴等等
注意:以後我們在SpringBoot應用中導入依賴,默認是不需要寫版本號的(除了那些沒有在dependencies中管理的依賴,這些自然要聲明版本號)
2.2 啓動器
- 舉例:spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
</dependency>
spring-boot-starter:spring-boot場景啓動器;幫我們導入了web模塊正常運行所依賴的組件;
Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啓動器),只需要在項目裏面引入這些starter
相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啓動器
官網:https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/htmlsingle/#using-boot-starter
2.3 主程序類,主入口類
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
//啓動SpringBoot應用
SpringApplication.run(HelloWorldApplication.class,args);
}
}
-
2.3.1 @SpringBootApplication註解
-
作用
Spring Boot應用標註此註解在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啓動SpringBoot應用;
- 源碼
@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 {
-
2.3.2 @SpringBootConfiguration註解
- 作用
Spring Boot的配置類註解;標註在某個類上,表示這是一個Spring Boot的配置類;
- 源碼
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
- @Configuration註解:
配置類上來標註這個註解;配置類 <——相當於——> 配置文件;配置類也是容器中的一個組件;@Component
-
2.3.3 @EnableAutoConfiguration註解
- 作用
開啓自動配置功能;以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration告訴SpringBoot開啓自動配置功能;這樣自動配置才能生效;
- 源碼
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({EnableAutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {
- @AutoConfigurationPackage:自動配置包
源碼:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({Registrar.class}) public @interface AutoConfigurationPackage { }
@Import(AutoConfigurationPackages.Registrar.class):Spring的底層註解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.Registrar.class將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裏面的所有組件掃描到Spring容器;如下圖所示的,掃描與主配置類HelloWorldApplication同一級下的Controller文件夾下的類
- @Import(EnableAutoConfigurationImportSelector.class):給容器中導入組件
EnableAutoConfigurationImportSelector:導入那些組件的選擇器;
將所有需要導入的組件以全類名的方式返回;這些組件就會被添加到容器中;會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入這個場景需要的所有組件,
並配置好這些組件;有了自動配置類,免去了我們手動編寫配置注入功能組件等的工作;
原理:
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);
Spring Boot在啓動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將
這些值作爲自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;以前我們需要自己配置的東
西,自動配置類都幫我們;
J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar的包中
3.使用Spring Initializer快速創建Spring Boot項目
IDE都支持使用Spring的項目創建嚮導快速創建一個Spring Boot項目;
選擇我們需要的模塊;嚮導會聯網創建Spring Boot項目;
默認生成的Spring Boot項目:
- 主程序已經生成好了,我們只需要我們自己的邏輯
- resources文件夾中目錄結構
static:保存所有的靜態資源;如 js css images;相當於以前deweb項目的WebContent
templates:保存所有的模板頁面;(Spring Boot默認jar包使用嵌入式的Tomcat,默認不支持JSP頁面);可以使用模板引擎(freemarker、thymeleaf);
application.properties:Spring Boot應用的配置文件;可以修改一些SpringBoot的默認設置;
4.SpringBoot的配置文件
SpringBoot使用一個全局的配置文件,配置文件名是固定的;
- application.properties
- application.yml
配置文件的作用:修改SpringBoot自動配置的默認值;SpringBoot在底層都給我們自動配置好;
4.1 aplication.yml配置方式
4.1.1 YAML介紹
- YAML A Markup Language:是一個標記語言
- YAML isn't Markup Language:不是一個標記語言;
標記語言:
- 以前的配置文件,大多都使用的是 xxxx.xml文件;
- YAML:以數據爲中心,比json、xml等更適合做配置文件;
YAML與XML對比例子:
YAML:
server:
port: 8081
XML:
<server>
<port>8081</port>
</server>
4.1.2 YAML的基本使用
- 基本語法
k:(空格)v:表示一對鍵值對(空格必須有)
以空格的縮進來控制層級關係;只要是左對齊的一列數據,都是同一個層級的
server:
port: 8081
path: /hello
- – 使用縮進表示層級關係
- – 縮進時不允許使用Tab鍵,只允許使用空格。
- – 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
- – 大小寫敏感
- YAML 支持的三種數據結構
– 對象:鍵值對的集合
– 數組:一組按次序排列的值
– 字面量:單個的、不可再分的值
注意:屬性和值也是大小寫敏感
- 值的寫法
字面量:普通的值(數字,字符串,布爾)
k: v:字面直接來寫;
字符串默認不用加上單引號或者雙引號;
"":雙引號;不會轉義字符串裏面的特殊字符;特殊字符會作爲本身想表示的意思
示例:name: "zhangsan \n lisi" ————輸出:zhangsan 換行 lisi
'':單引號;會轉義特殊字符,特殊字符最終只是一個普通的字符串數據
示例:name: ‘zhangsan \n lisi’ ————輸出:zhangsan \n lisi
- 對象、Map(屬性和值)(鍵值對):
k: v:在下一行來寫對象的屬性和值的關係;注意縮進
對象還是k: v的方式:
friends:
lastName: zhangsan
age: 20
行內寫法:
friends: {lastName: zhangsan,age: 18}
- 數組(List、Set):
用“-”值表示數組中的一個元素
pets:
‐ cat
‐ dog
‐ pig
行內寫法:
pets: [cat,dog,pig]
4.1.3 案例:SpringBoot應用使用application.yml文件配置“值注入”
- 創建Person類
public class Person {
private String lastname;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
...
此處省略get、set方法
...
@Override
public String toString() {
return "Person{" +
"lastname='" + lastname + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
}
- 創建Dog類
public class Dog {
private String name;
private Integer age;
...
此處省略get、set方法
...
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 配置application.yml文件
person:
lastname: zhangsan
age: 18
boss: false
birth: 2020/4/6
maps: {k1: v1,k2: v2}
lists:
- lisi
- wangwu
dog:
name: gouwa
age: 6
- 在Person類中添加@ConfigurationProperties(prefix = "person")註解和@Component註解
@ConfigurationProperties(prefix = "person")註解的作用:
告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定,將配置文件中配置的每一個屬性的值,映射到這個組件中,
prefix = "person":配置文件中哪個下面的所有屬性進行一一映射
@Component註解的作用:
將Person組件添加到容器,只有容器中的組件才能使用容器提供@ConfigurationProperties的功能
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastname;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
......省略部分代碼
}
注意:@ConfigurationProperties的使用需要依賴下面的配置文件處理器,這樣類屬性與配置問導入配置文件處理器,以後編寫配置文件進行屬性綁定就有提示了
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
如:添加了配置文件處理器之後,編寫配置文件時就會有提示
- 編寫測試
此處使用SpringBoot單元測試
@RunWith(SpringRunner.class):註解爲程序使用Spring容器來跑,可以類似於編碼方式在測試期間使用自動注入功能等功能
@SpringBootTest:註解爲SpringBoot的單元測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springbootquick2ApplicationTests {
@Autowired
private Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
- 測試結果
4.2 application.properties配置方式
- 其他保持與上面程序一致,配置application.properties文件
#配置person
person.lastname=zhaosi
person.age=100
person.boss=true
person.birth=2020/04/06
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.dog.name=泰迪
person.dog.age=5
- 測試結果
- 上面的測試結果中顯示的中文亂碼問題:
- 解決:IDEA默認使用的是UTF-8編碼,打開IDEA的settings設置,找到File Encoding
此設置的作用:.properties文件中內容在運行時將會轉換爲ASCII碼,讓程序進行獲取
4.3 @ConfigurationProperties獲取值與@Value註解注入獲取值的區別
@ConfigurationProperties | @Value | |
功能 | 可以批量注入配置文件中的屬性 | 需要逐個指定注入 |
鬆散綁定(鬆散語法) | 支持 | 不支持 |
SpEL(SpringEL表達式) | 不支持 | 支持 |
JSR303數據校驗 | 支持 | 不支持 |
複雜類型封裝 | 支持 | 不支持 |
- 鬆散綁定
是指,屬性名匹配規則比較寬鬆 ,例如:實體類屬性爲lastName,配置文件中配置屬性爲lastname,在屬性值注入時,也能識別
屬性名匹配規則(Relaxed binding)
– person.firstName:使用標準方式
– person.first-name:大寫用-
– person.first_name:大寫用_
– PERSON_FIRST_NAME:推薦系統屬性使用這種寫法
- JSR303數據校驗
回顧Spring原來配置文件屬性注入的方式,是通過@Value註解完成的
使用示例:
public class Person { @Value("${person.lastname}") private String lastname; @Value("${person.age}") private Integer age; private Boolean boss; private Date birth; ...省略部分代碼...
總結:不管是配置文件yml還是properties他們都能獲取到值;
如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;
如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;
4.4 @PropertySource
- 作用:
加載指定的配置文件,並注入屬性值
- 用法:
@PropertySource(value = "classpath:person.properties")
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastname;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
......省略部分代碼
}
4.5 @ImportResource
- 作用:
導入Spring的配置文件,讓配置文件裏面的內容生效;
注意:Spring Boot裏面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;想讓Spring的配置文件生效,加載進來;@ImportResource標註在一個配置類上
- 用法
創建一個HelloService類
在resources下編寫beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="cn.poison.springbootquick2.service.HelloService"></bean>
</beans>
在主配置類中添加@ImportResource註解,導入Spring的配置文件讓其生效
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class Springbootquick2Application {
public static void main(String[] args) {
SpringApplication.run(Springbootquick2Application.class, args);
}
}
4.6 @Bean
SpringBoot推薦給容器中添加組件的方式;推薦使用全註解的方式
1、配置類@Configuration------>Spring配置文件
2、使用@Bean給容器中添加組件
- 用法:
/**
* @Configuration:指明當前類是一個配置類;
* 就是來替代之前的Spring配置文件在配置文件中用<bean><bean/>標籤添加組件
*/
@Configuration
public class MyConfiguration {
//將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置類@Bean給Spring容器注入組件了");
return new HelloService();
}
}
4.7 配置文件佔位符
4.7.1 隨機數
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
用法:
4.7.2 佔位符獲取之前配置的值,如果沒有可以是用:指定默認值
person.last‐name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
4.8 配置Profile多環境支持
Profile是Spring對不同環境提供不同配置功能的支持,可以通過激活、指定參數等方式快速切換環境,如:開發環境、測試環境、生產環境
4.8.1 application.properties的多profile文件形式
- 格式:
application-{profile}.properties/yml:application-dev.properties、application-prod.properties
- 示例
application-dev.properties:開發環境下的配置
server.port=8888
application-prod.properties:生產環境下的配置
server.port=9999
4.8.2 application.yml的多文檔塊形式
server:
port: 8081
spring:
profiles:
active: prod #指定屬於哪個環境
‐‐‐
server:
port: 8083
spring:
profiles: dev
‐‐‐
server:
port: 8084
spring:
profiles: prod
4.8.3 profile多環境支持的激活方式
-
激活方式一:配置文件 spring.profiles.active=dev
application.properties:
#激活開發環境下的配置
spring.profiles.active=dev
#激活生產環境下的配置
spring.profiles.active=prod
測試結果:
- 激活方式二:命令行 --spring.profiles.active=dev
使用maven插件將Springboot應用打包成jar包,使用命令啓動時,指定對應的配置環境
java -jar springbootquick2-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
也可以在IDEA的SpringBoot啓動配置指定配置環境,如下圖
- 激活方式三:jvm參數 –Dspring.profiles.active=dev,在IDEA的Edit Configuration中配置虛擬機參數,然後點擊右上角就可以運行
4.9 配置文件加載位置順序
spring boot 啓動會掃描以下位置的application.properties或者application.yml文件作爲Spring boot的默認配置文件
- – file:./config/
- – file:./
- – classpath:/config/
- – classpath:/
– 以上是按照優先級從高到低的順序,所有位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容,互補配置;
我們還可以通過spring.config.location來改變默認的配置文件位置,項目打包好以後,我們可以使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;這個功能在運維方面很有作用
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
4.10 外部配置加載順序
SpringBoot也可以從以下位置加載配置; 優先級從高到低;高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置
- 1.命令行參數
所有的配置都可以在命令行上進行指定,多個配置用空格分開; --配置項=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
假如項目已經打包好了,這時候要修改項目的一些配置,也可以通過命令行參數進行修改,例如:修改端口號
java -jar springboot-02-config-0.0.1-SNAPSHOT.jar --server.port=8082
- 2.來自java:comp/env的JNDI屬性
- 3.Java系統屬性(System.getProperties())
- 4.操作系統環境變量
- 5.RandomValuePropertySource配置的random.*屬性值
由jar包外向jar包內進行尋找;優先加載帶profile
- 6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
- 7.jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
再來加載不帶profile
- 8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
- 9.jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
其他具體配置參考SpringBoot官方文檔https://spring.io/projects/spring-boot