javascript
SpringBoot从介绍到各个框架的整合
1.背景:以前假如想創建一個Spring應用, 比如Spring、SpringMVC、Mybatis三大框架的整合, 我們需要一堆繁瑣的步驟:maven導一堆依賴-->寫一堆配置文件-->測試-->打成war包部署到Servlet容器上,可以說是相當繁瑣。SpringBoot就是來簡化這些步驟的。
2.SpringBoot的作用:幫助我們很快的創建一個產品級別的Spring應用,簡化J2EE開發。SpringBoot會自動幫我們配置好Spring
的相關配置,因此用戶可以無需去清楚Spring的配置,就可以從SpringBoot這個微小的入口打開J2EE的大門。
3.歸納一下SpringBoot的優點:
(1)快速創建獨立運行的Spring項目以及與主流框架集成
(2)使用嵌入式的Servlet容器,應用無需打成WAR包跑在servlet容器上。打成Jar包,然后java -jar即可運行
(3)starters自動依賴與版本控制
(4)大量的自動配置,簡化開發,也可以修改默認值
(5)無需配置XML,無代碼生成,開箱即用
(6)準生產環境的運行時應用監控
(7)與云計算的天然集成
4,SpringBoot的缺點:入門容易,精通難。之所以那么說,是因為SpringBoot是基于Spring的一個再封裝,如果你對Spring框架一無所知,那就做不到精通。
5.HelloWord(基于maven創建)
(1)創建一個maven工程。
(2)導入SpringBoot的依賴
(3)建一個類,在類上標注@SpringBootApplication,來告訴SpringBoot這是一個主程序類,說明這是一個SpringBoot應用
(4)再主程序類里添加main方法(idea快捷鍵:psvm),然后在main方法里添加SpringApplication.run(主程序類.class,args);
(5)編寫相關的Controller、Service等。
(6)運行測試:主程序里直接運行main方法即可開啟應用。tomcat8080端口(內置了tomcat)。
(7)部署:導入SpingBoot的Maven插件
這個插件的作用就是將應用打包成可執行的jar包。
(8)運行:java -jar命令即可啟動。即使目標服務器里沒有裝tomcat也沒問題。
5.Spring-Boot-starter(SpringBoot場景啟動器):每個功能場景都有自己的starter,每個starter里面都導入了自己需要的依賴,要用什么功能就導入什么場景啟動器
6.需要將所有組件都放到主配置類(@SpringBootApplication標注的類)所在包及下面所有子包里面,不然不會被掃描到Spring容器里。所有自動配置的信息(比如SpringMVC等)都配置在@SpringBootApplication注解里。
7.使用Spring Initializer快速創建SpringBoot應用:
(1)
(2)
(3)選擇模塊
創建完成之后主程序會自動生成好, 我們只需要寫我們自己的邏輯。
resources文件目錄結構:static:保存所有的靜態資源(js、css、images)
? ? ?templates:保存所有的模板頁面,SpringBoot默認jar包嵌入式的Tomcat,默認不知處jsp頁面)
? 可以使用模板引擎代替。
application.properties:SpringBoot的配置文件。可以在這里修改默認配置。e.g 默認tomcat不想用
? ? ?8080端口了,可以在里面寫上sever.port=8081
8.SpringBoot的配置
有兩種全局配置文件,分別是application.properties和application.yml??? 文件名固定不可變.
配置文件的作用: 修改SpringBoot的自動配置默認值.
yml和xml的對比:
yml:
xml:
很明顯, yml文檔要比xml文檔來的更加簡潔.
8.1yml基本語法
普通的值?????? K:(空格)V ?? 注意:這里的空格必須有. 只要是左對齊的一列數據, 都是同一層級的. 屬性和值是大小寫敏感的.
字符串默認不用加單引號或者雙引號 ?? ""雙引號不會轉義里面的特殊字符, 特殊字符會作為本身想表示的意思 ? 例: "zhangsan /n lisi", 輸出: zhangsan 換行 lisi
''單引號會轉義特殊字符,特殊字符只是一個普通的字符串輸出.例: "zhangsan /n lisi", 輸出: zhangsan /n lisi
對象 ? ? ? ? ? ? friends:
lastName: zhangsan
age: 20
對象(行內寫法) ? ?? friends: {lastName: zhangsan,age: 20}
數組 ? ? ? ? ?? 用-(空格)表示數組中的一個元素 ? ? ? ? ? 例:pets:
- cat
-dog
數組(行內寫法) ? ? pets: [cat,dog]
?
8.2 如何在yml里面配置屬性, 然后注入到bean中.
public class Person {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String,Object> maps;private List<Object> list;private Dog dog;
?
? 定義一個Person類.
? yml配置. ??
接下來要怎樣把yml文件里面的配置信息映射到這個bean中呢?
用@ConfigurationProperties(prefix = "person")? 注解, 這個注解的意義是告訴SpringBoot將本類中的所有屬性和配置文件中的相關屬性進行綁定
@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> list;private Dog dog;
?
此時IDEA會報一個提示,? 沒有在類路徑下找到SpringBoot的配置注釋處理器
只需要點擊Open Documentation, 到達SpringBoot官網, 把依賴添加過來即可. 加入這個插件以后還有個好處就是在yml或者properties里配置信息的時候會有提示
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional> </dependency>
?
注意:這個bean必須要是Spring容器中的組件, 也就是必須加上@Component注解. 此時已經設置完畢, 可以開始進行測試.
到測試包下可以看到一個Test類, 這是SpringBoot的單元測試
注入Person,然后在控制臺輸出一下即可看到效果.? 由此可以得出, 把一些初始化配置配置在yml里面, 修改相當方便.
當然, 我們的配置信息也可以放在application,properties當中, 語法與yml文件略有不同.
person.last-name=張三 person.age=50 person.birth=1992/06/19 person.boss=true person.dog.name=555 person.dog.age=5 person.maps.k1=v1 person.maps..k2=v2 person.list=1,2,3
?
插入之后執行測試, 發現有中文亂碼情況. 原因: idea默認是utf-8, 而application.properties默認的不是utf-8.因此我們輸入的"張三"并不是utf-8格式
解決方法:file->setting->搜索FileEncoding
這樣在輸入時就是utf-8格式, 然后幫我們自動轉化為ascii格式讓程序進行獲取.
?
????? 那么問題來了, application.properties和application.yml都可以進行配置, 那么誰的優先級更高呢? 博主測試了一下, 是application,properties更高!? yml與properties相比較, 看上去更清晰, 更有層次感些.
用@ConfigurationProperties在注入時, 也可以進行數據驗證, 在@ConfigurationProperties下面加上@Validated, 表示注入需要驗證.接下來就可以在各個屬性上添加不一樣的格式(比如@Email)
1 @Component 2 @ConfigurationProperties(prefix = "person") 3 @Validated 4 public class Person { 5 @Email 6 private String lastName;//此時在配置文件中lastName若不是email格式,則會報錯
從配置文件中注入屬性值有兩種方法, 一種是在類上添加@ConfigulationProperties(支持數據校驗), 一種是在屬性上添加@Value(不支持數據校驗)
何時用何種情況:如果說我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值, 使用@Value
如果說我們專門編寫了一個JavaBean來和配置文件進行映射, 我們就直接使用@ConfigulationProperties
?
那么我們所有配置Javabean的信息都配到application.yml(全局配置文件)或者application.properties(全局配置文件)真的好嗎?當然不好, 這樣配置文件也太大了. 我們一般把和SpringBoot無關的配置信息單獨放到別的配置文件中去, 然后通過@PropertySource(value="classpath:***")來注入.
1 @Component 2 @PropertySource(value = "classpath:person.properties")//person.properties放在resources文件夾下 3 @ConfigurationProperties(prefix = "person")//這個注解不能刪除, 不然無法注入, 默認為從全局配置文件中獲取配置信息, 加了@PropertiesSource之后就從這個指定的配置文件中獲取配置信息 4 public class Person { 5 private String lastName; 6 private Integer age; 7 private Boolean boss; 8 private Date birth; 9 10 private Map<String,Object> maps; 11 private List<Object> list; 12 private Dog dog;在配置文件里我們還可以使用占位符${屬性名},占位符里也可以添加SpringBoot提供的一些功能, 比如隨機數/uuid等
1 dog: 2 name: 歡歡${person.birth} 3 age: 1 4 last-name: 一頭生猛的程序猿${random.uuid}?
9.Profile
為了方便我們的多環境配置, 比如測試環境/生產環境, 他們的配置信息肯定是不同的, 如何快速的切換, 就要用到我們的Profile
多profile文件模式: 我們在主配置文件編寫的時候, 文件名可以是:application-{profile}.Properties/yml
例: 現在有Application.properties ?? 設置端口8080
? Application-{test}.properties? 設置端口8081?
? Application-{product}.properties? 設置端口8082
測試跑起來之后, 開啟的端口為8080, 采用了默認設置
此時, 在Application.properties中添加一行 spring.profiles.active=test ? ? ?? //激活test
執行測試發現開啟的端口是8081.? 由此得出, 我們可以在默認全局配置文件Application.Properties中進行靈活的切換, 缺點就是需要新建很多個profile文件(用yml支持多文檔塊方式即可彌補這個缺點)
yml支持多文檔塊方式:以yml作為主配置文件, yml內部可以分為多個文檔塊, 通過"---"進行劃分,這樣就避免了多個profile文件的創建
10.配置文件的加載位置:
SpringBoot啟動會掃描以下位置的application.yml或application,properties作為Spring boot默認配置文件
file:./config/
?
file:./
?
classpath:/config/
?
classpath:/
優先級從上到下是從高到低, 相同的屬性配置, 低優先級的會被高優先級的覆蓋 ; 一些低優先級包含,高優先級不包含的則以低優先級的為準. 也就是互補配置!? 默認打包只會打包類路徑下的, 工程路徑下的不打包.
我們還可以通過spring.config.location來改變默認的配置文件位置(應用場景: 在運維過程中,當項目已經打包, 但是想修改一些配置的時候),注意:這里也是互補配置
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/shenhanboBlog/p/9946946.html
總結
以上是生活随笔為你收集整理的SpringBoot从介绍到各个框架的整合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 属性驱动
- 下一篇: 面试无忧之Zookeeper总结心得