SpringBoot
1:Spring Boot簡介
簡化Spring應用開發的一個框架。
整個Spring技術棧的一個大整合。
JavaEE開發的一站式解決方案。
2:微服務
2014,martin fowler
微服務:架構風格(服務微化)
一個應用應該是一組小型服務;可以通過Http的方式進行互通。
每一個功能元素最終都是一個可獨立替換和獨立升級的軟件單元。
3:YAML語法
一,基本語法
K:V:表示一對鍵值對(空格必須有)
以空格的縮進來控制層級關系;只要是左對齊的一列數據,都是同一個層級的。
server
屬性和值大小寫敏感的。
二,值的寫法
● 字面量:普通的值(數字,字符串,布爾)
k:v:字面直接來寫;
字符串默認不用加上單引號或者雙引號;
"":雙引號;不會轉義字符串里面的特殊字符,特殊字符會作為本身想表示的意思。
name:"zhangsan \n lisi":輸出:zhangsan 換行 lisi
'':單引號;會轉義特殊字符,特殊字符最終只是一個普通的字符串數據。
name:"zhangsan \n lisi":輸出:zhangsan \n lisi
● 對象:Map(屬性和值)(鍵值對)
k:v:在下一行來寫對象的屬性和值的關系;注意縮進
friends:
lastname:zhangsan
age:20
行內寫法:
friends:
● 數組:(List,Set)
用 - 值表示數組中的一個元素
pets
行內寫法:
pets:
三,配置文件值注入
配置文件:
persen
javaBean:
/**
* 將配置文件中配置的每一個屬性的值,映射到這個組件中
* @ConfigurationProperties:告訴SpringBoot將本類中所有屬性和配置文件中相關的配置進行綁定
* (prefix = "persen"):配置文件中那個下面的所有屬性進行一一映射
* 只有這個組件是容器中的組件,才能使用容器提供的功能@ConfigurationProperties
*/
我們可以導入配置文件處理器,以后編寫配置就有提示了:
<!-- 導入配置文件處理器,配置文件進行綁定就會有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
1:@value獲取值和@ConfigurationProperties獲取值比較:
| @ConfigurationProperties | @value | |
|---|---|---|
| 功能 | 批量注入配置文件中的屬性 | 一個個指定 |
| 松散綁定(松散語法) | 支持 | 不支持 |
| SpEl | 不支持 | 支持 |
| JSR303數據校驗 | 支持 | 不支持 |
| 復雜類型封裝 | 支持 | 不支持 |
配置文件yml和properties他們都能獲取到值;
如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@value;
如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;
2:@PropertySource和@ImportResource:
@PropertySource:加載指定的配置文件。
@ImportResource:導入Spring的配置文件,讓配置文件里面的內容生效。
Spring Boot里面沒有Spring的配置文件,我們自己編寫的配置文件也不能自動識別。
想讓Spring的配置文件有效,加載進來;把他@ImportResource標致在配置類上。
Spring Boot推薦給容器添加組件的方式:推薦使用全注解的方式;
● 使用@Bean給容器中添加組件:
/**
* @Configuration:指明當前類是一個配置類,就是來替代之前的Spring配置文件。
* 在配置文件中用<bean></bean>標簽添加組件
*/
4:整合SpringData JPA(java持久層API)
1),編寫一個實體類(bean)和數據表進行映射,并且配置好映射關系。
/**
* 使用JPA注解配置映射關系
*/
2),編寫一個Dao接口來操作實體類對應的數據表(Repository);
//繼承JpaRepository來完成對數據庫的操作
public interface RepositoryDao extends JpaRepository<User, Integer> {
}
3),基本的配置;
spring
Hibernate:
1),是一個全自動的ORM,與數據庫無關,面向對象的。SpringDateJPA --->封裝了Hibernate --->JDKAPI
hibernate 對象有三個狀態:
1,瞬時狀態 ---> 剛創建出來的Hibernate無任何關聯與數據庫無任何關聯。
2,持久化狀態 ---> 被hibernate管理,并且session沒有關閉,內存中存在數據庫中也存在,如果內存中的數據發送變化會去同步數據庫的數據。
3,游離狀態 ---> session關閉了,數據庫中可能存在。
ORM關系對象映射中:
1),OneToOne。
2),OneToMany(默認使用懶加載)。
3),ManyToOne(默認使用急加載)。
4),ManyToMany(兩個oneTomany)。
5:Spring-boot啟動流程;
幾個重要的事件回調機制:
配置在META-INF/spring.factories
ApplicationContextInitializer
ApplicationRunListener
只需要放在ioc容器中
ApplicationRunner
CommandLineRunner
1),創建SpringApplication對象。
public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
return new SpringApplication(sources).run(args);
}
//調用此方法創建SpringApplication對象
public SpringApplication(Object... sources) {
initialize(sources);
}
?
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
//保存主配置類
this.sources.addAll(Arrays.asList(sources));
}
//判斷當前是否是web應用
this.webEnvironment = deduceWebEnvironment();
//從類路徑下找到META-INF/Spring.factories配置的所有ApplicationContextInitializer;然后保存起來;
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInit.class));
//從類路徑下找到META-INF/Spring.factories配置的所有ApplicationLtener
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
//從多個配置類中找到有main方法的主配置類
this.mainApplicationClass = deduceMainApplicationClass();
}
2),運行run方法。
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
//獲取SpringApplicationRunListenners;從類路徑下META-INF/spring.factories
SpringApplicationRunListeners listeners = getRunListeners(args);
//回調所有獲取的SpringApplicationRunListenner.starting方法
listeners.starting();
try {
//封裝命令行參數
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//準備環境
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
//創建環境完成后回調SpringApplicationRunListenners.environmentPrepared()表示環境準備完成
Banner printedBanner = printBanner(environment);
//創建ApplicationContext;決定創建web的ioc還是普通的ioc容器。
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
//準備上下文環境;將environment保存在ioc中;而且applyInitializers();
//applyInitializers():回調之前保存的所有ApplicationContextInitializer的initialize()方法
//回調之前保存好的所有SpringApplicationRunListenner的contextPrepared()方法;
//preparedContext運行完成以后回調所有的SpringApplicationRunListenner的contextLoaded()方法;
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
//刷新容器,ioc容器初始化(如果是web應用還會創建嵌入式的Tomcat);
refreshContext(context);
//從ioc容器中獲取所有的ApplicationRunner和CommandLineRunner進行回調;
//ApplicationRunner先回調
afterRefresh(context, applicationArguments);
//所有的SpringApplicationRunListener回調fineshed()方法;
listeners.finished(context, null);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
//整個Spring-boot啟動完成之后返回啟動的ioc容器
return context;
}
catch (Throwable ex) {
handleRunFailure(context, listeners, analyzers, ex);