实现springboot的starter
什么是 Spring Boot
Spring Boot 基本上是 Spring 框架的擴展,它消除了設置 Spring 應用程序所需的復雜例行配置。我們在使用 Spring 框架的時候,我們接觸得比較多的應該是 Spring MVC、 IOC 、 DI 、AOP 等等,而這些框架在使用的過程中會需要配置大量的 XML,或者需要做很多繁瑣的配置。Spring Boot 可以幫助我們快速搭建一個基于 Spirng 框架以及 Spring 生態體系的應用解決方案。
- 創建獨立的 Spring 應用程序
- 直接嵌入 Tomcat,Jetty 或 Undertow(無需部署 WAR 文件),java -jar 就可以運行
- 提供 starter 依賴來簡化你自己的配置
- 自動裝配 Spring 和第三方的依賴
- 提供可用于生產的功能,例如指標,運行狀況檢查和外部化配置,比如 Actuator
- 完全沒有代碼生成,也不需要 XML 配置
約定大于配置
- maven 的目錄結構,默認有 resources 文件夾存放配置文件,默認打包方式為 jar
- spring-boot-starter-web 中默認包含 spring mvc 相關依賴以及內置的 tomcat 容器,使得構建一個 web 應用更加簡單
- 默認提供 application.properties/yml 文件
- 默認通過 spring.profiles.active 屬性來決定運行環境時讀取的配置文件
- EnableAutoConfiguration 默認對于依賴的 starter 進行自動裝配
自動裝配
@SpringBootApplication實際上是一個復合注解,主要由以下構成:
@Configuration
@Configuration是 JavaConfig 形式的基于 Spring IOC 容器的配置類使用的一種注解。所以在啟動類里面標注了 @Configuration,意味著它其實也是一個 IoC 容器的配置類。
傳統意義上的 Spring 應用都是基于 xml 形式來配置 bean 的依賴關系。但是從 Spring3 開始,Spring 就支持了兩種 bean 的配置方式,一種是基于 xml 文件方式,另一種就是 JavaConfig,任何一個標注了 @Configuration 的 Java 類定義都是一個 JavaConfig 配置類。而在這個配置類中,任何標注了 @Bean 的方法,它的返回值都會作為 Bean 定義注冊到 Spring 的 IoC 容器,方法名默認成為這個 Bean 的 id。然后通過 spring 容器在啟動的時候,把 Bean 進行初始化并且,如果 Bean 之間存在依賴關系,則分析這些已經在 IoC 容器中的 Bean 根據依賴關系進行組裝。
@ComponentScan
@ComponentScan 就是掃包,相當于 xml 配置文件中的context:component-scan 。
它的主要作用就是掃描指定路徑下的標識了需要裝配的類,自 動裝配到 Spring 的 IoC 容器中。
標識需要裝配的類的形式主要是:@Component、@Repository、@Service、@Controller 這類的注解標識的類。(注:@Repository、@Service、@Controller 的底層還是 @Component)。ComponentScan 默認會掃描當前 package 下的的所有加了相關注解標識的類到 IoC 容器中。
@EnableAutoConfiguration
@EnableAutoConfiguration 是 Spring Boot 的靈魂。從 Spring3.1 開始,提供了一系列的 @Enable 開頭的注解,它是在 JavaConfig 框架上更進一步的完善,使用戶在使用 Spring 相關的框架避免配置大量的代碼從而降低使用的難度。
每一個涉及到 Enable 開頭的注解,都會帶有一個 @Import 的注解, @EnableAutoConfiguration 也不例外。
@Import 對應 XML 形式下的 ,就是導入資源,把多個分布在不同容器下的配置合并在一個配置中。@Import 注解可以配置三種不同的 class :
普通 Bean 或者帶有 @Configuration 的配置文件
實現 ImportSelector 接口進行動態注入
實現 ImportBeanDefinitionRegistrar 接口進行動態注入
這里導入的是第二種 importSelector,這是一種動態注入 Bean 的技術。其中AutoConfigurationImportSelector實現了 ImportSelector 接口。借助AutoConfigurationImportSelector,@EnableAutoConfiguration幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建并使用的IoC容器。
在AutoConfigurationImportSelector類中可以看到通過 SpringFactoriesLoader.loadFactoryNames()把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一個xxxAutoConfiguration文件都加載到容器中,spring.factories文件里每一個xxxAutoConfiguration文件一般都會有下面的條件注解:
- @ConditionalOnClass : classpath中存在該類時起效
- @ConditionalOnMissingClass : classpath中不存在該類時起效
- @ConditionalOnBean : DI容器中存在該類型Bean時起效
- @ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效
- @ConditionalOnSingleCandidate : DI容器中該類型Bean只有一個或@Primary的只有一個時起效
- @ConditionalOnExpression : SpEL表達式結果為true時
- @ConditionalOnProperty : 參數設置或者值一致時起效
- @ConditionalOnResource : 指定的文件存在時起效
- @ConditionalOnJndi : 指定的JNDI存在時起效
- @ConditionalOnJava : 指定的Java版本存在時起效
- @ConditionalOnWebApplication : Web應用環境下起效
- @ConditionalOnNotWebApplication : 非Web應用環境下起效
SpringFactoriesLoader
SpringFactoriesLoader屬于Spring框架私有的一種擴展方案(類似于Java的SPI方案java.util.ServiceLoader),其主要功能就是從指定的配置文件META-INF/spring-factories加載配置,spring-factories是一個典型的java properties文件,只不過Key和Value都是Java類型的完整類名。
對于@EnableAutoConfiguration來說,SpringFactoriesLoader的用途稍微不同一些,其本意是為了提供SPI擴展的場景,而在@EnableAutoConfiguration場景中,它更多提供了一種配置查找的功能支持,即根據@EnableAutoConfiguration的完整類名org.springframework.boot.autoconfig.EnableAutoConfiguration作為查找的Key,獲得對應的一組@Configuration類。
SpringFactoriesLoader是一個抽象類,類中定義的靜態屬性定義了其加載資源的路徑public static final String FACTORIES_RESOURCE_LOCATION = “META-INF/spring.factories”,此外還有三個靜態方法:
- loadFactories:加載指定的factoryClass并進行實例化。
- loadFactoryNames:加載指定的factoryClass的名稱集合。
- instantiateFactory:對指定的factoryClass進行實例化。
loadFactories方法首先獲取類加載器,然后調用loadFactoryNames方法獲取所有的指定資源的名稱集合、接著調用instantiateFactory方法實例化這些資源類并將其添加到result集合中。最后調用AnnotationAwareOrderComparator.sort方法進行集合的排序。
SpringBoot starter
SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統一集成進starter,應用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應的默認配置。
starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾。SpringBoot會自動通過classpath路徑下的類發現需要的Bean,并注冊進IOC容器。SpringBoot提供了針對日常企業應用研發各種場景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認配置,并允許我們調整這些配置,即遵循“約定大于配置”的理念。
starter的實現方法
引入的依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency> </dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>spring-boot-autoconfigure中包含大量核心注解,包含條件注解等。
創建properties屬性類,用于讀取屬性
@ConfigurationProperties(prefix = "com.test") public class TestServiceProperties {private String name = "test";public String getName() {return name;}public void setName(String name) {this.name = name;}}@ConfigurationProperties配置此注解可以自動導入application.properties配置文件中的屬性,前提需要指定屬性前綴prefix。如果application.properties文件中未指定相應屬性,便使用默認的,如上name=“test”。
創建配置類
public class TestServiceConfiguration {private String name;public String getName() {return "name is " + name;}public void setName(String name) {this.name = name;} }創建自動配置類
@Configuration @EnableConfigurationProperties(TestServiceProperties.class) @ConditionalOnClass(TestServiceConfiguration.class) @ConditionalOnProperty(prefix = "com.test", value = "enabled", matchIfMissing = true) public class TestServiceAutoConfiguration {@Autowiredprivate TestServiceProperties testServiceProperties;@Bean@ConditionalOnMissingBean(TestServiceConfiguration.class)public TestServiceConfiguration testServiceConfiguration() {TestServiceConfiguration testService = new TestServiceConfiguration();TestService.setName(testServiceProperties.getName());return testService;} }- @Configuration:表明此類是一個配置類,將變為一個bean被spring進行管理。
- @EnableConfigurationProperties:啟用屬性配置,將讀取TestServiceProperties里面的屬性。
- @ConditionalOnClass:當類路徑下面有TestServiceConfiguration此類時,自動配置。
- @ConditionalOnProperty:判斷指定的屬性是否具備指定的值。
- @ConditionalOnMissingBean:當容器中沒有指定bean時,創建此bean。
配置類注冊
在resources文件夾下面新建一個META-INF文件,并在下面創建spring.factories文件,將配置類進行注冊。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.test.TestServiceAutoConfiguration使用
自定義的starter編寫完畢,執行mvn clean install將項目打成一個jar包。新建一個springboot項目,在pom文件中添加剛剛打包的jar。
在application.properties添加
com.test.name=test總結
以上是生活随笔為你收集整理的实现springboot的starter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot2.5.4发送邮件4
- 下一篇: Debug Tensorflow: yo