20200308 SpringBoot自動配置學習筆記1

SpringBoot的自動配置

一、BB兩句

很多人都用過SSM和SpringBoot,兩者對比起來,SpringBoot用起來更方便,因爲它簡化了很多配置。爲什麼在SpringBoot中可以省略那麼多配置呢?我們能脫口而出因爲SpringBoot遵循約定大於配置,框架幫我們做了很多默認配置。但是SpringBoot框架具體是怎麼做到默認配置的。我覺得願意去思考這個問題已經說明在成長了。

不過很顯然,搞懂這塊知識並不是一件簡單的事情。這裏記錄下學習過程中的一些筆記,方便自己後續學習。如果大家要學習,建議看文末的參考文章。

二、筆記摘要

springboot相比ssm有兩點改進,第一點是減少配置文件的配置,第二點是通過pom簡化了依賴的jar包的配置。

這裏要講的是第一點:爲什麼可以不用寫這些配置文件?SpringBoot是怎麼幫我們做了這些事情的呢?

SpringBoot使用的是一種約定策略,也就是自動配置策略。它默認幫我們配置了一些信息。如果我們自己有額外的配置,則默認的配置信息就不生效。

它是基於java代碼的bean配置。其中關鍵是用到這幾個註解:
@Configuration
@Bean

這兩個註解一起使用,就可以實現基於java代碼的bean配置。
@Configuration註解的類可以看做是能生成Spring IOC管理的Bean實例的工廠。
@Bean註解是告訴Spring,一個帶有@Bean註解的方法將返回一個對象,該對象應該被註冊到Spring容器中。

傳統的xml的bean配置方法如下:

<beans>  
    <bean id = "car" class="com.itpsc.Car">  
        <property name="wheel" ref = "wheel"></property>  
    </bean>  
    <bean id = "wheel" class="com.itpsc.Wheel"></bean>  
</beans>

它等價於下面的java代碼的配置方式:

@Configuration  
public class Conf {  
    @Bean  
    public Car car() {  
        Car car = new Car();  
        car.setWheel(wheel());  
        return car;  
    }  
    @Bean   
    public Wheel wheel() {  
        return new Wheel();  
    }  
}

我們在springboot中使用mybatis時,不需要去配置SqlSessionFactory和Datasource、TransactionManger這些東西。正是因爲springboot採用了這種自動配置策略。
在我們引入mybatis-spring-boot-starter依賴時,這個包會幫我們引入一個mybatis-spring-boot-autoconfigure包。這個包下有個類叫做MyBatisAutoConfiguration類。它被@Configuration註解修飾,並且它的返回都被@Bean註解修飾。
因此,這個就是一個自動配置類。通過它,實現了mybatis相關依賴類的自動配置。

那bean參數是怎麼獲取的呢?像DataSource數據源的配置參數是怎麼獲取的呢?這就用到@EnableConfigurationProperties註解。
對於DataSource數據源,它的自動配置類是DataSourceAutoConfiguration類,在這個類上,用到了@EnableConfigurationProperties註解,其中參數是DataSourceProperties.class。
而在這個DataSourceProperties類中,有DataSource數據源的各種參數,並且有個註解@ConfigurationProperties(prefix=“spring.datasource”),它指明瞭配置文件的前綴。

這裏涉及到兩個容易混淆的註解:
@EnableConfigurationProperties
@ConfigurationProperties

@ConfigurationProperties註解的作用是把yml或者properties配置文件轉化爲bean。
@EnableConfigurationProperties註解的作用是使@ConfigurationProperties註解生效。如果只配置@ConfigurationProperties註解,在spring容器中是獲取不到yml或者properties配置文件轉化的bean的。

那麼參數呢??默認參數呢??以及如何識別自定義的參數???配置文件呢????????????????????????????????????????????????????????

另外,SpringBoot默認是掃描啓動類所在的包下的主類與子類與子類的所有組件,並沒有掃描依賴包中的類,那麼依賴中的包的bean是如何別發現和加載的呢?通過這個註解:
@EnableAutoConfiguration

@EnableAutoConfiguration註解中引入了@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})這兩個註解。
@AutoConfigurationPackage是用來加載啓動類下的包下的類註冊到SpringIoC容器中,
Import({AutoConfigurationImportSelector.class})是用來加載外部jar包中符合自動配置條件的bean註冊到SpringIoC容器中。

@EnableAutoConfiguration就類似於@EnableScheduling註解,都是通過@Import將相關的bean加載到IoC容器中。

@EnableAutoConfiguration註解的作用就是通過@Import註解將符合自動配置條件的bean定義加載到IoC容器中。
例如我們添加了spring-boot-starter-web依賴,這個web模塊會自動添加Tomcat和SpringMVC的依賴,在@EnableAutoConfiguration註解的作用下,SpringBoot會自動對Tomcat和SpringMVC進行自動配置。這就是自動配置。

總結@EnableAutoConfiguration的作用:
從classpath中搜索所有META-INF/spring.factories配置文件後,將其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key對應的配置項根據條件確定是否要加載到spring容器中。

看這裏看這裏!!!!!!!!!!!!!!!!!!!!!
這篇文章是我想看的:https://www.jianshu.com/p/5cb57be5d0ea

這句話:在spring容器啓動時,會調用到AutoConfigurationImportSelector#getAutoConfigurationEntry
其實就是我還得去看SpringBoot啓動的流程。啓動的過程中就會去調用這些跟@EnableAutoConfiguration有關的方法,就會自動會裝裝載各個自動配置類。

三、參考文章

Spring Boot @EnableAutoConfiguration解析(推薦):https://www.jianshu.com/p/5cb57be5d0ea
@EnableAutoConfiguration自動配置原理分析:https://www.cnblogs.com/NinWoo/p/11300428.html
深入springboot原理——一步步分析springboot啓動機制(starter機制):https://www.cnblogs.com/chongaizhen/p/11151892.html
spring boot啓動原理:https://www.cnblogs.com/xiaopotian/p/11052917.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章