SpringBoot自動裝配原理


SpringBoot自動裝配原理解析: 

 注解結構:

  

 

入口點:SpringBoot的引導類有如下內容:
@SpringBootApplication public class Application {     public static void main(String[] args) {       SpringApplication.run(Application.class,args);    } }

 

@SpringBootApplication注解:

進入@SpringBootApplication的注解類,會發現@SpringBootApplication是一個組合注解,在所包含的注解中重點要
關注如下三個注解:@SpringBootConfifiguration、@EnableAutoConfifiguration、@ComponentScan

  代碼示例:

@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 { ..... }

 

@SpringBootConfifiguration注解:

代碼實例:

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
經過查看會發現在該注解類上有一個大家比較熟悉的注解@Confifiguration,該注解是用來標識某一個類為Spring的
一個配置類,所以@SpringBootConfifiguration和@Confifiguration注解的作用一樣,但是SpringBoot更推薦使用
@SpringBootConfifiguration.
 
 

@EnableAutoConfifiguration注解:

代碼示例:

1 @Target(ElementType.TYPE) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Inherited 5 @AutoConfigurationPackage 6 @Import(AutoConfigurationImportSelector.class) 7 public @interface EnableAutoConfiguration { 8   ...... 9 }
經過查看可發現@EnableAutoConfifiguration也是一個組合注解,其中有兩個注解需要重點理解下,如
@AutoConfifigurationPackage和@Import
 

@AutoConfifigurationPackage注解:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage { }
經過查看可發現該注解通過@Import引入了一個Registrar.class類,那么該類實現了什么功能?在Registrar類中的
registerBeanDefifinitions方法上打個斷點,debug啟動后,會發現該類主要是加載@SpringBootApplication注解所
在類的包結構,並進行存儲,為后期SpringBoot加載資源提供一個掃描的包路徑。
 
 
 

@Import(AutoConfifigurationImportSelector.class)

上述@Import注解引入了一個類AutoConfifigurationImportSelector.class,讀取該類的源代碼會發現,SpringBoot啟
動所在的裝配類都在該注解類所在項目的META-INF/spring.factories文件中讀取
 
 
通過debug啟動后,會發現默認情況下會加載109個自動裝配類,剛好對應的是spring.factoires文件中的自動裝配類 的數量
 
 
 
META-INF/spring.factories中的內容
 
 
 

自動裝配類解析:

我們可以從中抽取一個類,如:
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
打開DispatcherServletAutoConfifiguration看看如下:
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass(DispatcherServlet.class) @AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class) @EnableConfigurationProperties(ServerProperties.class) public class DispatcherServletAutoConfiguration { ...... }  

 

上面的是關於DispatcherServletAutoConfifiguration的定義,通過源碼我們發現在這個類上定義了好幾個注解,其中:
@Confifiguration
@Bean 這兩個注解的作用就是在Spring容器中將需要用到的Bean對象進行創建。
@AutoConfifigureOrder
@AutoConfifigureAfter
@AutoCOnfifigureBefore這三個注解,主要是指定當前類自動裝配的順序和時機。
@ConditionalOnWebApplication :這是一個條件注解,當前項目是web環境的條件下
@ConditionalOnClass:當前類路徑下有指定的類的條件下。
分析完這些注解我們應該能明白的是sprinboot中的自動配置其實是使用這些條件注解來完成,當滿足指定條件后就 可以自動進行配置

常見的條件注解:

@ConditionalOnBean          當容器中存在指定bean的條件下
@ConditionalOnClass         當類路徑下存在指定類的條件下
@ConditionalOnMissingBean     當容器中不存在指定bean的條件下
@ConditionalOnMissingClass    當類路徑下不存在指定類的條件下
@ConditionalOnProperty       指定的屬性是否存在指定的值
@ConditionalOnResource       類路徑下是否有指定的值
@ConditionalOnWebApplication   是web環境的條件下下
@ConditionalOnNotWebApplication 不是web環境的條件下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM