欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot自動裝配原理小結(jié)

 更新時間:2021年05月28日 08:29:31   作者:XPacific  
Spring Boot主要作用就是簡化Spring應(yīng)用的開發(fā),開發(fā)者只需要通過少量代碼就可以創(chuàng)建一個Spring應(yīng)用,而達到這一目的最核心的思想就是約定優(yōu)于配置。

約定優(yōu)于配置(Convention Over Configuration)是一種軟件設(shè)計范式,目的在于減少配置的數(shù)量或者降低理解難度,從而提升開發(fā)效率。

先總結(jié)一下結(jié)論:

springboot通過spring.factories能把main方法所在類路徑以外的bean自動加載,其目的就是為了幫助自動配置bean,減輕配置量

springboot autoconfig的一些實驗

一個springboot工程,springbootautoconfig.test.config這個包和啟動類的包不再同一個路徑下,那么這個包下的注解等應(yīng)該不會生效,bean也無法托管給spring管理

@Configuration//開啟配置
@EnableConfigurationProperties(HelloProperties.class)//開啟使用映射實體對象
@ConditionalOnClass(TestHello.class)//存在TestHello時初始化該配置類
@ConditionalOnProperty//存在對應(yīng)配置信息時初始化該配置類
(
        prefix = "zxp.hello",//存在配置前綴zxp.hello
        value = "flag"
)
public class HelloAutoConfiguration {
    @Autowired
    private HelloProperties helloProperties;

    @Bean//創(chuàng)建HelloService實體bean
    @ConditionalOnMissingBean(TestHello.class)//缺失HelloService實體bean時,初始化HelloService并添加到SpringIoc
    public TestHello helloService()
    {
        System.out.println(">>>The TestHello Not Found,Execute Create New Bean.");
        TestHello testHello = new TestHello(helloProperties.getName(),helloProperties.getFlag());
        return testHello;
    }
}
@ConfigurationProperties(prefix = "zxp.hello")
@Data
public class HelloProperties {
    private String name;
    private String flag;
}
public class TestHello {
    String name;
    String flag;

    public TestHello(String name, String flag) {
        this.name = name;
        this.flag = flag;
    }

    public String print(){
        String msg = "name is "+name + "  " + "flag is "+flag;
        System.out.println(msg);
        return msg;
    }
}

在resources下創(chuàng)建META-INF路徑,并創(chuàng)建spring.factories文件

#配置自定義Starter的自動化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=springbootautoconfig.test.config.HelloAutoConfiguration

再試啟動又報錯了

- Bean method 'helloService' not loaded because @ConditionalOnProperty (zxp.hello) did not find property 'flag'

原因是,如果沒有配置zxp.hello.flag,怎會報錯

@ConditionalOnProperty//存在對應(yīng)配置信息時初始化該配置類
(
        prefix = "zxp.hello",//存在配置前綴hello  
        value = "flag"http://開啟
)

在application.properties中添加

zxp.hello.flag=2

成功了,訪問controller

name is null flag is 1

SpringBoot autoconfig部分注解說明

@ConditionalOnXxx 可以根據(jù)條件來決定是否執(zhí)行自動配置

@ConditionalOnBean:當(dāng)SpringIoc容器內(nèi)存在指定Bean的條件
@ConditionalOnSingleCandidate:當(dāng)指定Bean在SpringIoc容器內(nèi)只有一個,或者雖然有多個但是指定首選的Bean
@ConditionalOnMissingBean:當(dāng)SpringIoc容器內(nèi)不存在指定Bean的條件

@ConditionalOnClass:當(dāng)SpringIoc容器內(nèi)存在指定Class的條件
@ConditionalOnMissingClass:當(dāng)SpringIoc容器內(nèi)不存在指定Class的條件
@ConditionalOnExpression:基于SpEL表達式作為判斷條件
@ConditionalOnJava:基于JVM版本作為判斷條件
@ConditionalOnJndi:在JNDI存在時查找指定的位置
@ConditionalOnResource:類路徑是否有指定的值
@ConditionalOnProperty:指定的屬性是否有指定的值

@ConditionalOnNotWebApplication:當(dāng)前項目不是Web項目的條件
@ConditionalOnWebApplication:當(dāng)前項目是Web項目的條件

@AutoConfigureBefore
@AutoConfigureAfter
@AutoConfigureOrder
public @interface ConditionalOnProperty {
    String[] value() default {}; //數(shù)組,獲取對應(yīng)property名稱的值,與name不可同時使用  
    String prefix() default "";//property名稱的前綴,可有可無  
    String[] name() default {};//數(shù)組,property完整名稱或部分名稱(可與prefix組合使用,組成完整的property名稱),與value不可同時使用  
    String havingValue() default "";//可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才加載配置  
    boolean matchIfMissing() default false;//缺少該property時是否可以加載。如果為true,沒有該property也會正常加載;反之報錯  
    boolean relaxedNames() default true;//是否可以松散匹配,至今不知道怎么使用的  
} 

SpringBoot autoconfig原理

springboot啟動類注解@SpringBootApplication引入@EnableAutoConfiguration又引入@Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector類中調(diào)用SpringFactoriesLoader.loadFactoryNames 方法掃描了所有JAR包的META-INF/spring.factories,如下代碼:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
         getBeanClassLoader());
   Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
         + "are using a custom packaging, make sure that file is correct.");
   return configurations;
}
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    ……
    Enumeration<URL> urls = (classLoader != null ?
      classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
      ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
    result = new LinkedMultiValueMap<>();
    while (urls.hasMoreElements()) {

spring-boot-autoconfigure包內(nèi)的spring.factories文件內(nèi)容

……
work.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
……

包含了所有spring為其增加的自動配置的bean配置,這些bean在滿足條件后會被加載到spring上下文中,從而實現(xiàn)了自動配置

eg:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {

會發(fā)現(xiàn)RabbitTemplate會報錯,為什么這里不存在的類卻不報錯呢? 1、這個jar編譯時這個類是有的,保證編譯能過 2、看下ConditionalOnClass注解的注釋

The classes that must be present. Since this annotation is parsed by loading class bytecode, > it is safe to specify classes here that may ultimately not be on the classpath, only if this annotation is directly on the affected component and not if this annotation is used as a composed, meta-annotation. In order to use this annotation as a meta-annotation, only use the name attribute. Returns: the classes that must be present

必須出現(xiàn)的類。由于此注釋是通過加載類字節(jié)碼來解析的,因此在此處指定最終可能不在類路徑上的類是安全的,前提是此注釋直接位于受影響的組件上,而不是將此注釋用作組合的元注釋。要將此注釋用作元注釋,請僅使用name屬性。

starter

starter就是整理了依賴的maven配置,主要指maven相關(guān)依賴配置到單獨的一個工程以避免引入過多的maven配置

以上就是SpringBoot自動裝配原理詳解的詳細內(nèi)容,更多關(guān)于SpringBoot自動裝配原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談JVM中的JOL

    淺談JVM中的JOL

    我們天天都在使用java來new對象,但估計很少有人知道new出來的對象到底長的什么樣子?對于普通的java程序員來說,可能從來沒有考慮過java中對象的問題,不懂這些也可以寫好代碼。今天,給大家介紹一款工具JOL,可以滿足大家對java對象的所有想象。
    2021-06-06
  • RocketMQ NameServer 核心源碼解析

    RocketMQ NameServer 核心源碼解析

    這篇文章主要為大家介紹了RocketMQ NameServer 核心源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 使用Java編寫GUI對話框的教程

    使用Java編寫GUI對話框的教程

    這篇文章主要介紹了使用Java編寫GUI對話框的教程,是Java圖形化編程中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J

    一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J

    本文主要介紹了一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • spring多數(shù)據(jù)源配置實現(xiàn)方法實例分析

    spring多數(shù)據(jù)源配置實現(xiàn)方法實例分析

    這篇文章主要介紹了spring多數(shù)據(jù)源配置實現(xiàn)方法,結(jié)合實例形式分析了spring多數(shù)據(jù)源配置相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-12-12
  • Java實現(xiàn)一個順序表的完整代碼

    Java實現(xiàn)一個順序表的完整代碼

    順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般采用數(shù)組存儲。在數(shù)組上完成數(shù)據(jù)的增刪減改。順序表的底層是一個數(shù)組
    2021-04-04
  • IDEA提示內(nèi)存不足low memory的錯誤解決

    IDEA提示內(nèi)存不足low memory的錯誤解決

    運行項目變得很卡,這種情況比較能直觀感受出來,Idea內(nèi)存指示器,則需要設(shè)置才能看到,本文主要介紹了IDEA提示內(nèi)存不足low memory的錯誤解決,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • java高并發(fā)之理解進程和線程

    java高并發(fā)之理解進程和線程

    這篇文章主要給大家介紹了關(guān)于java高并發(fā)進程和線程的內(nèi)容,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • Java入門教程--帶包的類如何編譯與運行

    Java入門教程--帶包的類如何編譯與運行

    我們一般都是通過IDE(如Eclipse、Intellij Idea,STS等)來開發(fā),調(diào)試java項目。在不借助IDE的情況下,如何編譯、運行Java程序。打包編譯時,會自動創(chuàng)建包目錄,不需要自己新建包名文件夾。
    2022-12-12
  • Spring啟動流程refresh()源碼深入解析

    Spring啟動流程refresh()源碼深入解析

    這篇文章主要給大家介紹了關(guān)于Spring啟動流程refresh()源碼深入解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評論