Spring Boot自動裝配原理詳解
主程序類,主入口類
package com.kuang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootStudyApplication.class, args);
}
}
@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}
)}
)
@SpringBootConfiguration:Spring Boot的配置類;
標注在某個類上,表示這是一個SpringBoot的配置類;
@Configuration:配置類上標注這個注解;
配置類-------配置文件:配置類也是容器中的一個組件;@Component
@EnableAutoConfiguration:開啟自動配置功能:
以前我們需要配置的東西,SpringBoot幫我們自動配置:@EnableAutoConfiguration告訴SpringBoot開啟自動配置功能,這樣自動配置才能生效
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage自動配置包
@Import(AutoConfigurationPackages.Registrar.class):
Spring的底層注解@import,給容器導入一個組件,導入的組件由AutoConfigurationPackages.Registrar.class;
將主配置類(@SpringBootApplication)標注的類的所在包以及下面所有子包里面的所有組件掃描導Spring容器
@Import(AutoConfigurationImportSelector.class):給容器導入組件
AutoConfigurationImportSelector:導入哪些組件的選擇器;
將所有需要導入的組件以全類名的方式返回;這些組件會被添加其中
會給容器中導入非常多的自動配置類(xxxAutoConfiguration):就是給容器中導入這個場景需要的所有組件,並配置好這些組件
有了自動配置類,免去了我們手動編寫配置注入功能組等的工作
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,beanClassLoader)
(loadFactoryNames)方法,用類加載器獲取一個資源
結論: SpringBoot不需要寫配置文件的原因是,SpringBoot所有配置都是在啟動的時候進行掃描並加載,SpringBoot的所有自動配置類都在Spring.factories里面,但是不一定會生效,生效前要判斷條件是否成立,只要導入了對應的start,就有對應的啟動器,有了啟動器就能幫我們進行自動配置類
以前我們需要自己配置的東西,自動配置類幫我們做了
- SpringBoot在啟動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值
- 將這些值作為自動配置類導入容器 , 自動配置類就生效 , 幫我們進行自動配置工作;
- 整個J2EE的整體解決方案和自動配置都在springboot-autoconfigure的jar包中;
- 它會給容器中導入非常多的自動配置類 (xxxAutoConfiguration), 就是給容器中導入這個場景需要的所有組件 , 並配置好這些組件 ;
- 有了自動配置類 , 免去了我們手動編寫配置注入功能組件等的工作;
SpringBoot面試題
談談你對SpringBoot的理解
1.Spring的自動裝配原理:Spring Boot啟動的時候會通過@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自動配置類,並對其進行加載,這些自動配置類都是以AutoConfiguration結尾來命名的,它實際上就是一個JavaConfig形式的Spring容器配置類,通過@Bean導入到Spring容器中,以Properties結尾命名的類是和配置文件進行綁定的。它能通過這些以Properties結尾命名的類中取得在全局配置文件中配置的屬性,我們可以通過修改配置文件對應的屬性來修改自動配置的默認值,來完成自定義配置
2.run方法的作用
1、推斷應用的類型是普通的項目還是Web項目
2、查找並加載所有可用初始化器 , 設置到initializers屬性中
3、找出所有的應用程序監聽器,設置到listeners屬性中
4、推斷並設置main方法的定義類,找到運行的主類