日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实现springboot的starter

發(fā)布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现springboot的starter 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是 Spring Boot

Spring Boot 基本上是 Spring 框架的擴展,它消除了設置 Spring 應用程序所需的復雜例行配置。我們在使用 Spring 框架的時候,我們接觸得比較多的應該是 Spring MVC、 IOC 、 DI 、AOP 等等,而這些框架在使用的過程中會需要配置大量的 XML,或者需要做很多繁瑣的配置。Spring Boot 可以幫助我們快速搭建一個基于 Spirng 框架以及 Spring 生態(tài)體系的應用解決方案。

  • 創(chuàng)建獨立的 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 屬性來決定運行環(huán)境時讀取的配置文件
  • EnableAutoConfiguration 默認對于依賴的 starter 進行自動裝配

自動裝配

@SpringBootApplication實際上是一個復合注解,主要由以下構成:

@Configuration

@Configuration是 JavaConfig 形式的基于 Spring IOC 容器的配置類使用的一種注解。所以在啟動類里面標注了 @Configuration,意味著它其實也是一個 IoC 容器的配置類。

傳統(tǒng)意義上的 Spring 應用都是基于 xml 形式來配置 bean 的依賴關系。但是從 Spring3 開始,Spring 就支持了兩種 bean 的配置方式,一種是基于 xml 文件方式,另一種就是 JavaConfig,任何一個標注了 @Configuration 的 Java 類定義都是一個 JavaConfig 配置類。而在這個配置類中,任何標注了 @Bean 的方法,它的返回值都會作為 Bean 定義注冊到 Spring 的 IoC 容器,方法名默認成為這個 Bean 的 id。然后通過 spring 容器在啟動的時候,把 Bean 進行初始化并且,如果 Bean 之間存在依賴關系,則分析這些已經在 IoC 容器中的 Bean 根據(jù)依賴關系進行組裝。

@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 的配置文件

實現(xiàn) ImportSelector 接口進行動態(tài)注入

實現(xiàn) ImportBeanDefinitionRegistrar 接口進行動態(tài)注入

這里導入的是第二種 importSelector,這是一種動態(tài)注入 Bean 的技術。其中AutoConfigurationImportSelector實現(xiàn)了 ImportSelector 接口。借助AutoConfigurationImportSelector,@EnableAutoConfiguration幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創(chuàng)建并使用的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 : 參數(shù)設置或者值一致時起效
  • @ConditionalOnResource : 指定的文件存在時起效
  • @ConditionalOnJndi : 指定的JNDI存在時起效
  • @ConditionalOnJava : 指定的Java版本存在時起效
  • @ConditionalOnWebApplication : Web應用環(huán)境下起效
  • @ConditionalOnNotWebApplication : 非Web應用環(huán)境下起效

SpringFactoriesLoader

SpringFactoriesLoader屬于Spring框架私有的一種擴展方案(類似于Java的SPI方案java.util.ServiceLoader),其主要功能就是從指定的配置文件META-INF/spring-factories加載配置,spring-factories是一個典型的java properties文件,只不過Key和Value都是Java類型的完整類名。

對于@EnableAutoConfiguration來說,SpringFactoriesLoader的用途稍微不同一些,其本意是為了提供SPI擴展的場景,而在@EnableAutoConfiguration場景中,它更多提供了一種配置查找的功能支持,即根據(jù)@EnableAutoConfiguration的完整類名org.springframework.boot.autoconfig.EnableAutoConfiguration作為查找的Key,獲得對應的一組@Configuration類。

SpringFactoriesLoader是一個抽象類,類中定義的靜態(tài)屬性定義了其加載資源的路徑public static final String FACTORIES_RESOURCE_LOCATION = “META-INF/spring.factories”,此外還有三個靜態(tài)方法:

  • loadFactories:加載指定的factoryClass并進行實例化。
  • loadFactoryNames:加載指定的factoryClass的名稱集合。
  • instantiateFactory:對指定的factoryClass進行實例化。

loadFactories方法首先獲取類加載器,然后調用loadFactoryNames方法獲取所有的指定資源的名稱集合、接著調用instantiateFactory方法實例化這些資源類并將其添加到result集合中。最后調用AnnotationAwareOrderComparator.sort方法進行集合的排序。

SpringBoot starter

SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進starter,應用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應的默認配置。

starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾。SpringBoot會自動通過classpath路徑下的類發(fā)現(xiàn)需要的Bean,并注冊進IOC容器。SpringBoot提供了針對日常企業(yè)應用研發(fā)各種場景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認配置,并允許我們調整這些配置,即遵循“約定大于配置”的理念。

starter的實現(xiàn)方法

  • 創(chuàng)建一個starter項目,Spring 官方定義的 starter 通常命名遵循的格式為 spring-boot-starter-{name}。
  • 創(chuàng)建一個ConfigurationProperties用于保存你的配置信息。
  • 創(chuàng)建一個AutoConfiguration,引用定義好的配置信息。在AutoConfiguration中實現(xiàn)所有starter應該完成的操作,并且把這個類加入spring.factories配置文件中進行聲明。
  • 打包項目,之后在一個SpringBoot項目中引入該項目依賴。
  • 引入的依賴

    <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中包含大量核心注解,包含條件注解等。

    創(chuàng)建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”。

    創(chuàng)建配置類

    public class TestServiceConfiguration {private String name;public String getName() {return "name is " + name;}public void setName(String name) {this.name = name;} }

    創(chuàng)建自動配置類

    @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:表明此類是一個配置類,將變?yōu)橐粋€bean被spring進行管理。
    • @EnableConfigurationProperties:啟用屬性配置,將讀取TestServiceProperties里面的屬性。
    • @ConditionalOnClass:當類路徑下面有TestServiceConfiguration此類時,自動配置。
    • @ConditionalOnProperty:判斷指定的屬性是否具備指定的值。
    • @ConditionalOnMissingBean:當容器中沒有指定bean時,創(chuàng)建此bean。

    配置類注冊

    在resources文件夾下面新建一個META-INF文件,并在下面創(chuàng)建spring.factories文件,將配置類進行注冊。

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.test.TestServiceAutoConfiguration

    使用

    自定義的starter編寫完畢,執(zhí)行mvn clean install將項目打成一個jar包。新建一個springboot項目,在pom文件中添加剛剛打包的jar。

    在application.properties添加

    com.test.name=test

    總結

    以上是生活随笔為你收集整理的实现springboot的starter的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。