• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SpringBoot自動裝配實現

    標簽: Spring

    1. SpringBoot使用

    Spring Boot的出現,得益于“習慣優于配置”的理念,沒有繁瑣的配置、難以集成的內容(大多數流行第三方技術都被集成),這是基于Spring 4.x提供的按條件配置Bean的能力。

    Spring Boot的啟動類上有一個@SpringBootApplication注解,這個注解是Spring Boot項目必不可少的注解。那么自動配置原理一定和這個注解有著千絲萬縷的聯系!

    @SpringBootApplication
    public class ConfigApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigApplication.class, args);
        }
    }
    
    @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 {
    ....
    }
    

    @SpringBootApplication是一個復合注解或派生注解,在@SpringBootApplication中有一個注解@EnableAutoConfiguration,翻譯成人話就是開啟自動配置,其定義如下:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
    	....
    }
    

    這個注解也是一個派生注解,其中的關鍵功能由@Import提供,其導入的AutoConfigurationImportSelector的selectImports()方法通過SpringFactoriesLoader.loadFactoryNames()掃描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一個這樣的spring.factories文件。
    spring.factories文件如下

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
    org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
    org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
    org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
    org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
    ....
    

    這個@EnableAutoConfiguration注解通過@SpringBootApplication被間接的標記在了Spring Boot的啟動類上。在SpringApplication.run(…)的內部就會執行selectImports()方法,找到所有JavaConfig自動配置類的全限定名對應的class,然后將所有自動配置類加載到Spring容器中。

    調用過程debug代碼如下:
    在這里插入圖片描述

    2. 自動配置生效

    每一個XxxxAutoConfiguration自動配置類都是在某些條件之下才會生效的,這些條件的限制在Spring Boot中以注解的形式體現,常見的條件注解有如下幾項:

    @ConditionalOnBean:當容器里有指定的bean的條件下。
    
    @ConditionalOnMissingBean:當容器里不存在指定bean的條件下。
    
    @ConditionalOnClass:當類路徑下有指定類的條件下。
    
    @ConditionalOnMissingClass:當類路徑下不存在指定類的條件下。
    
    @ConditionalOnProperty:指定的屬性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表當xxx.xxx為enable時條件的布爾值為true,如果沒有設置的情況下也為true

    以ServletWebServerFactoryAutoConfiguration配置類為例,解釋一下全局配置文件中的屬性如何生效,比如:server.port=8081,是如何生效的(當然不配置也會有默認值,這個默認值來自于org.apache.catalina.startup.Tomcat)

    @Configuration
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
    @ConditionalOnClass(ServletRequest.class)
    @ConditionalOnWebApplication(type = Type.SERVLET)
    @EnableConfigurationProperties(ServerProperties.class)
    @Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
    		ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
    		ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
    		ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
    public class ServletWebServerFactoryAutoConfiguration {
    ....
    }
    

    總結一下可以這么說:

    Spring Boot啟動的時候會通過@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自動配置類,并對其進行加載,而這些自動配置類都是以AutoConfiguration結尾來命名的,它實際上就是一個JavaConfig形式的Spring容器配置類,它能通過以Properties結尾命名的類中取得在全局配置文件中配置的屬性如:server.port,而XxxxProperties類是通過@ConfigurationProperties注解與全局配置文件中對應的屬性進行綁定的。

    3. 自定義Spring Boot Starter

    • 3.1 pom文件
    <parent>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-parent</artifactId>
    	<version>2.1.1.RELEASE</version>
    </parent>
    
    <groupId>com.st</groupId>
    <artifactId>demo-service-spring-boot-starter</artifactId>
    <version>1.0</version>
    
    <properties>
    	<java.version>1.8</java.version>
    </properties>
    
    <dependencies>
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-autoconfigure</artifactId>
    	</dependency>
    </dependencies>
    
    • 3.2 供其他模塊使用的服務類
    public class DemoService {
    
        private String host;
        private int port;
    
        public DemoService(String host, int port) {
            this.host = host;
            this.port = port;
        }
    
        public String sayHello() {
            return "hello, " + host + " " + port;
        }
    	
    	// 省略get和set方法
    }
    
    
    • 3.3 用@ConfigurationProperties將application.xml中的屬性映射為配置類
    @ConfigurationProperties(prefix = "demo.service")
    public class DemoServicePropeties {
    
        private String host;
        private int port;
        
      	// 省略get和set方法
    }
    
    
    • 3.4 自動配置類
    @Configuration
    @ConditionalOnClass(DemoService.class)
    @EnableConfigurationProperties(DemoServicePropeties.class)
    public class DemoServiceAutoConfiguration {
    
        @Bean
        public DemoService demoService(DemoServicePropeties propeties) {
            return new DemoService(propeties.getHost(), propeties.getPort());
        }
    }
    
    
    • 3.6 在src->main->java->resource目錄下建META-INF文件夾,放spring.factories文件。
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.st.demoservice.DemoServiceAutoConfiguration
    
    
    版權聲明:本文為jing956899449原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/jing956899449/article/details/106430477

    智能推薦

    springboot自動裝配

    Spring boot自動裝配 ## **自動裝配 實現自動裝配 在spring.factories里面配置自動裝配實現 spring boot的自動裝配并是不它的一個特性,而是基于spring framework的實現,只不過增加了META-INF/spring.factories...

    初探 SpringBoot 自動裝配

    在不使用 SpringBoot 的時候,如果我們需要一個類必須要將它放到 Spring 的容器中,但是使用了 SpringBoot 之后就算我們不配置,僅僅是導入 jar 包就可以直接從容器中獲取類了,這是怎么實現的呢? 基于 SpringBoot 2.2.0.RELEASE 版本 下面介紹幫助 SB 實現自動裝配的 最關鍵 的四個注解或類。 SpringBootApplication 首先每個 ...

    Unity_Shader高級篇_13.1_Unity Shader入門精要

    13.4 再談邊緣檢測 在12.3中,我們曾使用Sobel算子對屏幕圖像進行邊緣測試,實現描邊的效果。但是,這種直接利用顏色信息進行邊緣檢測的方法會產生很對我們不希望得到的邊緣線,如圖13.8所示。 可以看出,物體的紋理、陰影等位置也被描上黑邊,而這往往不是我們希望看到的。在本節中,我們將學習如何在深度和法線上進行邊緣檢測,這些圖像不會受紋理和光照的影響,而僅僅保存了當前渲染物體的模型信息,通過這...

    Seata AT 模式 原理詳解

    目錄 前提 整體機制 寫隔離 讀隔離 工作機制 一階段 二階段-回滾 二階段-提交 附錄 回滾日志表 前提 基于支持本地 ACID 事務的關系型數據庫。 Java 應用,通過 JDBC 訪問數據庫。 整體機制 兩階段提交協議的演變: 一階段:業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。 二階段: 提交異步化,非常快速地完成。 回滾通過一階段的回滾日志進行反向補償。 寫隔離 ...

    Python爬蟲 | 滑動驗證碼**

    極驗驗證碼:需要手動拼合滑塊來完成的驗證,相對圖形驗證碼識別難度上升了幾個等級。下面用程序識別并通過極驗驗證碼的驗證,其中有分析識別思路、識別缺口位置、生成滑塊拖動、模擬實現滑塊拼合通過驗證等步驟。需要用到Chrome 瀏覽器,并配置 ChromeDriver ,要用到的 Python 庫是 Selenium。 1、 對極驗驗證碼了解   極驗驗證碼官網:http://www.geetest.co...

    猜你喜歡

    MobaXterm root用戶連接虛擬機時出現Access denied

    1.linux打開ssh服務 2.新建連接 首先在romote host中填入要連接的主機ip specify username中填入連接的用戶名 port為連接端口默認為22 輸入連接用戶的密碼 linux默認不顯示密碼 發現密碼正確但是連接不上 問題解決 /etc/ssh/sshd_config 配置問題: #PermitRootLogin prohibit-password將該行改為Perm...

    Linux C 預處理命令

    預處理命令 一、宏定義 C語言標準允許在程序中用一個標識符來表示一個字符串,成為宏。標識符為宏名 ,在編譯預處理時,將程序中所有的宏名用相應的字符串來替換,這個過程稱為宏替換,宏分為兩種:無參數的宏和有參數的宏。 1.無參數的宏 無參數宏定義的一般形式為:#define 標識符字符串 “#”代表本行是編譯預處理命令。define是宏定義的關鍵詞,標識符是宏名。字符串是宏名所...

    有意思的算法(一)----冒泡排序

        冒泡排序的基本思想是:每次比較兩個相鄰的元素,如果它們的順序錯誤就把他們交換過來。     下面舉一個具體的例子來介紹一下冒泡排序。     有12,35,99,18,76五個數進行從大到小的排序,既然是從大到小排序,也就是說越小的越靠后,可不要把這句當成廢話,這可是最關...

    cordova學習筆記_創建一個cordova項目

    環境和工具 webstorm Node.js JDK git 打開git bash,進入你要創建項目的目錄,鍵入以下命令 進入cordovaDemo這個文件夾: 添加Android平臺 cordova platforms add android platforms中已經有了一個Android平臺 下面打開webstorm,然后file - open 找到cordovaDemo打開 現在在webst...

    TensorFlow識別圖片數字

    一、 第一步是先用tensorflow官網(http://www.tensorfly.cn/tfdoc/get_started/introduction.html)的手寫體數字識別例子訓練好一個模型,訓練完準確率一般能達到99%,然后保存訓練好的模型。 二、 主文件 完整代碼地址...

    精品国产乱码久久久久久蜜桃不卡