摘要:一源碼分析簡述聲明本人使用的開發工具為了解查看源碼,眼睛掃到,這很關鍵。注版本是,該類繼承了。這說明了依賴于配置文件,文件中鍵為對應的配置項注全類名加載到容器。如果用方法獲得,會報錯,所以呀用的方法。
一、源碼分析簡述
聲明:本人使用的開發工具為IDEA
1、@EnableAutoConfiguration了解
查看源碼,眼睛掃到@Import(AutoConfigurationImportSelector.class),這很關鍵。注版本1.5是EnableAutoConfigurationImportSelector,該類繼承了AutoConfigurationImportSelector。
2、再查看源碼AutoConfigurationImportSelector.java,里面用到了方法getCandidateConfigurations()
然后按住Ctrl點進去,查看方法getCandidateConfigurations(),了解他會到classpath下的讀取META-INF/spring.factories文件的配置,并返回一個字符串數組。這說明了@EnableAutoConfiguration-- 依賴于META-INF/spring.factories配置文件,spring.factories文件中鍵key為 org.springframework.boot.autoconfigure.EnableAutoConfiguration ,對應的配置項(注:全類名)加載到spring容器。
前提:只有spring.boot.enableautoconfiguration為true(默認為true)的時候,才啟用自動配置
該注解@EnableAutoConfiguration還可以進行排除,排除方式有2中,一是根據classes來排除(exclude),二是根據class names(excludeName)來排除
其內部實現的核心關鍵點有二
1)ImportSelector 該接口的方法的返回值都會被納入到spring 的容器管理 2)SpringFactoriesLoader 該類可以從classpath中搜索META-INF/spring.factories配置文件,并讀取配置
二、詳細步驟
1、創建兩個maven Module ,當然你也可以創建一個pom文件主要代碼如下
1)springboot3的maven module 的POM文件UTF-8 1.8 1.8 4.12 org.springframework.boot spring-boot-dependencies 1.5.10.RELEASE import pom 2)springboot3-core-bean的maven module 的POM文件 org.springframework.boot spring-boot-starter com.fai springboot03-core-bean 1.0-SNAPSHOT junit junit ${junit.version} com.fai springboot03-core-bean 1.0-SNAPSHOT UTF-8 1.8 1.8 4.12 org.springframework spring-context 4.3.12.RELEASE junit junit ${junit.version}
2、創建類
1)Car.java public class Car {} 2)CarConfiguration.java @Configuration public class CarConfiguration { @Bean public Car getCar() { return new Car(); } } 3)Music.java public class Music {} 4)RunnableConfiguration.java /** * Runnable配置類 */ @Configuration public class RunnableConfiguration { @Bean public Runnable getRunnable1() { return () -> {}; } } 5)META-INF/spring.factories #查看@EnableAutoConfiguration 注解源碼,--"spring.boot.enableautoconfiguration"; #默認true . 如果改成false,EnableAutoConfiguration注解不起作用 spring.boot.enableautoconfiguration=true 6)測試 @EnableAutoConfiguration // 根據應用所聲明的依賴來對Spring框架進行自動配置 // 根據class排除 //@EnableAutoConfiguration(exclude = {CarConfiguration.class,Music.class}) // 根據class names排除,全類名 //@EnableAutoConfiguration(excludeName = {"com.fai.bean.RunnableConfiguration"}) @ComponentScan public class App { public static void main(String[] args) { SpringApplication app = new SpringApplication(App.class); ConfigurableApplicationContext context = app.run(args); // 獲取Runnable 類對象的實例 // System.out.println(context.getBean(Runnable.class)); System.out.println(context.getBeansOfType(Runnable.class)); // 獲取Car 類的Bean System.out.println(context.getBeansOfType(Car.class)); // 獲取Music 類的Bean System.out.println(context.getBeansOfType(Music.class)); context.close(); } } 7)在測試中,更改配置文件application.properties中的spring.boot.enableautoconfiguration的值為false后,獲取不到Bean #查看@EnableAutoConfiguration 注解源碼,"spring.boot.enableautoconfiguration"; #默認true,如果改成false,EnableAutoConfiguration注解不起作用 spring.boot.enableautoconfiguration=false
在第7)的改為false測試結果如下圖,是空的。如果用getBean方法獲得Bean,會報錯,所以呀用的getBeansOfType方法。
三、附上關鍵源碼
1、@EnableAutoConfiguration 注解
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class) // 1.5版本,我用的
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; /** * Exclude specific auto-configuration classes such that they will never be applied. * @return the classes to exclude */ Class>[] exclude() default {}; /** * Exclude specific auto-configuration class names such that they will never be * applied. * @return the class names to exclude * @since 1.3.0 */ String[] excludeName() default {};
}
2、EnableAutoConfigurationImportSelector 源碼
@Deprecated
public class EnableAutoConfigurationImportSelector
extends AutoConfigurationImportSelector { @Override protected boolean isEnabled(AnnotationMetadata metadata) { if (getClass().equals(EnableAutoConfigurationImportSelector.class)) { return getEnvironment().getProperty( EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true); } return true; }
}
3、EnableAutoConfigurationImportSelector 的父類AutoConfigurationImportSelector 源碼關鍵方法摘要
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { // 配置文件中的默認配置為true,我改過false的那個 return NO_IMPORTS; } try { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = getAttributes(annotationMetadata); Listconfigurations = getCandidateConfigurations(annotationMetadata, attributes); configurations = removeDuplicates(configurations); configurations = sort(configurations, autoConfigurationMetadata); Set exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = filter(configurations, autoConfigurationMetadata); fireAutoConfigurationImportEvents(configurations, exclusions); return configurations.toArray(new String[configurations.size()]); } catch (IOException ex) { throw new IllegalStateException(ex); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71022.html
摘要:所以,所謂的自動裝配,實際上就是如何自動將裝載到容器中來。實際上在版本中,模塊驅動注解的出現,已經有了一定的自動裝配的雛形,而真正能夠實現這一機制,還是在版本中,條件注解的出現。,我們來看一下的自動裝配是怎么一回事。在前面的分析中,Spring Framework一直在致力于解決一個問題,就是如何讓bean的管理變得更簡單,如何讓開發者盡可能的少關注一些基礎化的bean的配置,從而實現自動裝...
摘要:啟動原理和執行原理分析一的啟動原理我們打開,注意看下面兩個依賴我們第一步是繼承了父項目,然后在添加啟動器的依賴,項目就會自動給我們導入關于項目所需要的配置和。 上一篇我們看到,我們很輕松的完成了項目的構建,那么SpringBoot是如何做到的呢,在使用的使用又有哪些通用配置和注意事項呢? 其實SpringBoot給我們做了大量的自動配置功能,我們只需要引入對應的啟動器就可以直接使用,作...
摘要:前言用過的肯定很熟悉,它其中有個重要的特性,就是自動配置平時習慣的一些設置的配置作為默認配置。提倡無配置文件的理念,使用生成的應用完全不會生成任何配置代碼與配置文件。 前言 用過springboot的肯定很熟悉,它其中有個重要的特性,就是自動配置(平時習慣的一些設置的配置作為默認配置)。springboot提倡無XML配置文件的理念,使用springboot生成的應用完全不會生成任何配...
摘要:常規的配置讓開發人員將更多的經歷耗費在了配置文件上。其中有三個注解,,。以前我們需要配置的東西,幫我們自動配置,告訴開啟自動配置功能,這樣自動配置才能生效。 為什么需要自動化配置 ??在常規的spring應用程序中,充斥著大量的配置文件,我們需要手動去配置這些文件,如配置組件掃描、視圖解析器、http編碼等等。常規的配置讓開發人員將更多的經歷耗費在了配置文件上。而這些配置都是一些固定模...
摘要:常規的配置讓開發人員將更多的經歷耗費在了配置文件上。其中有三個注解,,。以前我們需要配置的東西,幫我們自動配置,告訴開啟自動配置功能,這樣自動配置才能生效。 為什么需要自動化配置 ??在常規的spring應用程序中,充斥著大量的配置文件,我們需要手動去配置這些文件,如配置組件掃描、視圖解析器、http編碼等等。常規的配置讓開發人員將更多的經歷耗費在了配置文件上。而這些配置都是一些固定模...
閱讀 2376·2021-09-22 15:15
閱讀 640·2021-09-02 15:11
閱讀 1784·2021-08-30 09:48
閱讀 1884·2019-08-30 15:56
閱讀 1480·2019-08-30 15:52
閱讀 2042·2019-08-30 15:44
閱讀 431·2019-08-29 16:29
閱讀 1538·2019-08-29 11:06