国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

@EnableAutoConfiguration原理簡單分析

robin / 1394人閱讀

摘要:一源碼分析簡述聲明本人使用的開發工具為了解查看源碼,眼睛掃到,這很關鍵。注版本是,該類繼承了。這說明了依賴于配置文件,文件中鍵為對應的配置項注全類名加載到容器。如果用方法獲得,會報錯,所以呀用的方法。

一、源碼分析簡述
聲明:本人使用的開發工具為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
        
    




    
        org.springframework.boot
        spring-boot-starter
    
    
    
        com.fai
        springboot03-core-bean
        1.0-SNAPSHOT
    
    
    
        junit
        junit
        ${junit.version}
    



2)springboot3-core-bean的maven module 的POM文件
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);
        List configurations = 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 Boot自動裝配機制實現原理

    摘要:所以,所謂的自動裝配,實際上就是如何自動將裝載到容器中來。實際上在版本中,模塊驅動注解的出現,已經有了一定的自動裝配的雛形,而真正能夠實現這一機制,還是在版本中,條件注解的出現。,我們來看一下的自動裝配是怎么一回事。在前面的分析中,Spring Framework一直在致力于解決一個問題,就是如何讓bean的管理變得更簡單,如何讓開發者盡可能的少關注一些基礎化的bean的配置,從而實現自動裝...

    不知名網友 評論0 收藏0
  • SpringBoot原理深入篇

    摘要:啟動原理和執行原理分析一的啟動原理我們打開,注意看下面兩個依賴我們第一步是繼承了父項目,然后在添加啟動器的依賴,項目就會自動給我們導入關于項目所需要的配置和。 上一篇我們看到,我們很輕松的完成了項目的構建,那么SpringBoot是如何做到的呢,在使用的使用又有哪些通用配置和注意事項呢? 其實SpringBoot給我們做了大量的自動配置功能,我們只需要引入對應的啟動器就可以直接使用,作...

    gotham 評論0 收藏0
  • springboot(二)——springboot自動配置解析

    摘要:前言用過的肯定很熟悉,它其中有個重要的特性,就是自動配置平時習慣的一些設置的配置作為默認配置。提倡無配置文件的理念,使用生成的應用完全不會生成任何配置代碼與配置文件。 前言 用過springboot的肯定很熟悉,它其中有個重要的特性,就是自動配置(平時習慣的一些設置的配置作為默認配置)。springboot提倡無XML配置文件的理念,使用springboot生成的應用完全不會生成任何配...

    張率功 評論0 收藏0
  • springboot源碼分析系列(三)--@EnableAutoConfiguration自動配置加

    摘要:常規的配置讓開發人員將更多的經歷耗費在了配置文件上。其中有三個注解,,。以前我們需要配置的東西,幫我們自動配置,告訴開啟自動配置功能,這樣自動配置才能生效。 為什么需要自動化配置 ??在常規的spring應用程序中,充斥著大量的配置文件,我們需要手動去配置這些文件,如配置組件掃描、視圖解析器、http編碼等等。常規的配置讓開發人員將更多的經歷耗費在了配置文件上。而這些配置都是一些固定模...

    Travis 評論0 收藏0
  • springboot源碼分析系列(三)--@EnableAutoConfiguration自動配置加

    摘要:常規的配置讓開發人員將更多的經歷耗費在了配置文件上。其中有三個注解,,。以前我們需要配置的東西,幫我們自動配置,告訴開啟自動配置功能,這樣自動配置才能生效。 為什么需要自動化配置 ??在常規的spring應用程序中,充斥著大量的配置文件,我們需要手動去配置這些文件,如配置組件掃描、視圖解析器、http編碼等等。常規的配置讓開發人員將更多的經歷耗費在了配置文件上。而這些配置都是一些固定模...

    macg0406 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<