在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Boot Starter需要些什么

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-09-25 11:35 ? 次閱讀

前面我們簡單介紹了如何使用消息中間件 Apache Pulsar ,但是在項(xiàng)目中那樣使用,顯然是不太好的,不管從易用性和擴(kuò)展性來看,都是遠(yuǎn)遠(yuǎn)不夠, 為了和springboot項(xiàng)目集成,寫一個(gè)pulsar-spring-boot-starter是非常有必要的,在此之前,我們先看看一個(gè)starter需要些什么。

Spring Boot Starter

spring-boot的強(qiáng)大之處在于其提供的大量starter組件,基本涵蓋了我們開發(fā)中的各個(gè)技術(shù)領(lǐng)域,比如數(shù)據(jù)庫訪問有jdbc、jpa,緩存有redis,全文檢索有elasticsearch,消息隊(duì)列有amqp、kafka等等。

在項(xiàng)目中你只需要按需引入相應(yīng)的依賴 spring-boot-starter-xxx ,然后只需要替換對(duì)應(yīng)的配置參數(shù)即可,就能快速使用對(duì)應(yīng)的功能,不得不說簡直是為開發(fā)者插上了翅膀。

命名風(fēng)格

對(duì)于starter模塊如何命名,spring官方是這樣建議:

  • Spring官方命名格式為:spring-boot-starter-{name}
  • 非Spring官方建議命名格式:{name}-spring-boot-starter

準(zhǔn)備工作

如果你之前有看過spring官方starter組件,你會(huì)發(fā)現(xiàn)主要是基于AutoConfigure及@Enable來實(shí)現(xiàn)的。

  • 其中AutoConfigure也就是我們常說的自動(dòng)裝配,在spring-boot-autoconfigure包中的目錄/METE-INF/spring.factories對(duì)應(yīng)文件中,你可以看到這樣的配置:圖片

當(dāng)啟動(dòng)Spring Boot項(xiàng)目時(shí)這些配置都會(huì)被加載(這么多的配置全部加載并處理,難怪啟動(dòng)那么慢)。

在starter中依賴的具體實(shí)現(xiàn)包中,一般都會(huì)提供一個(gè)@Enable注解作為部分?jǐn)U展功能的開關(guān),我們可以在系統(tǒng)中通過該注解引入按需引入配置

圖片

AutoConfigure配置的一定會(huì)被加載,而@Enable有開發(fā)者選擇使用使用,當(dāng)然有些組件是沒有AutoConfigure,必須通過@Enable來啟用

下面我們先對(duì)這塊內(nèi)容做個(gè)簡單的認(rèn)識(shí),方便后續(xù)在寫具體starter時(shí)知道怎么寫以及為什么那樣寫。

AutoConfigure

在目錄中創(chuàng)建src/main/resources/MATE-INF中創(chuàng)建文件spring.factories,定義SpringBoot應(yīng)用啟動(dòng)時(shí)的需要注冊(cè)的配置,這個(gè)主要是基于SPI機(jī)制來實(shí)現(xiàn), 下面是當(dāng)前spring-boot-autoconfigure中spring.factories文件的部分內(nèi)容

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,
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.context.ConfigurationPropertiesAutoConfiguration,
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,
...

配置在這里的帶有@Configuration的類(如果沒有被Conditional條件過濾掉)都會(huì)作為配置將相關(guān)Bean注冊(cè)到Spring容器.

主要實(shí)現(xiàn)基于@SpringBootApplication注解上的注解@EnableAutoConfiguration

Enable

以Spring Aop相關(guān)的注解@EnableAspectJAutoProxy為例,我們看下 Spring官方是怎么使用@Enable注解來實(shí)現(xiàn)配置加載的:

@EnableAspectJAutoProxy

改注解除了一般注解的基礎(chǔ)(@Target、@Retention)元素外,還包含了兩個(gè)配置屬性proxyTargetClass、exposeProxy以及一個(gè)@Import

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
    
 boolean proxyTargetClass() default false;
    
 boolean exposeProxy() default false;

}

@Import

在@Import中我們可以配置需要導(dǎo)入的配置類,有以下幾個(gè)選擇:

  • 直接導(dǎo)入@Configuration標(biāo)識(shí)的類
  • 導(dǎo)入實(shí)現(xiàn)了接口ImportBeanDefinitionRegistrar的類,來向容器注冊(cè)BeanDefinition
  • 導(dǎo)入實(shí)現(xiàn)了接口ImportSelector的類(不需要@Configuration)來選擇配置
@Import(AspectJAutoProxyRegistrar.class)

ImportBeanDefinitionRegistrar

在上面@EnableAspectJAutoProxy注解上,通過@Import,引入了AspectJAutoProxyRegistrar,而該類又實(shí)現(xiàn)了接口ImportBeanDefinitionRegistrar, 該接口能夠通過BeanDefinitionRegistry向Spring容器注冊(cè)我們期望的BeanDefinition,看代碼:

class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
    
  @Override
  public void registerBeanDefinitions(
          AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

    AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

    AnnotationAttributes enableAspectJAutoProxy =
            AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
    if (enableAspectJAutoProxy != null) {
      if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
        AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
      }
      if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
        AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
      }
    }
  }
}

這里我們可以拿到@EnableAspectJAutoProxy的元數(shù)據(jù)以及對(duì)應(yīng)的屬性配置,這樣就可以基于開發(fā)者的配置實(shí)現(xiàn)不同邏輯

ImportSelector

上面說到了,@Import還可以配置實(shí)現(xiàn)了ImportSelector接口的類,進(jìn)而控制具體需要使用的Configuration,下面是@EnableAsync中@Import配置的類

public class AsyncConfigurationSelector extends AdviceModeImportSelector< EnableAsync > {

  private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
          "org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";
  
  @Override
  @Nullable
  public String[] selectImports(AdviceMode adviceMode) {
    switch (adviceMode) {
      case PROXY:
        return new String[] {ProxyAsyncConfiguration.class.getName()};
      case ASPECTJ:
        return new String[] {ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME};
      default:
        return null;
    }
  }
}

ImportAware

同樣和@Import配合使用,針對(duì)基于ImportSelector選擇的Configuration,只要實(shí)現(xiàn)了ImportAware接口,就可以拿到@Import對(duì)應(yīng)@Enable注解的元數(shù)據(jù)

@Configuration
public abstract class AbstractAsyncConfiguration implements ImportAware {
    
  @Override
  public void setImportMetadata(AnnotationMetadata importMetadata) {
    this.enableAsync = AnnotationAttributes.fromMap(
            importMetadata.getAnnotationAttributes(EnableAsync.class.getName(), false));
    if (this.enableAsync == null) {
      throw new IllegalArgumentException(
              "@EnableAsync is not present on importing class " + importMetadata.getClassName());
    }
  }
}

上面主要根據(jù)Spring源代碼中的例子,了解@Enable、@Import、ImportBeanDefinitionRegistrar、ImportSelector、ImportAware如何搭配使用, 從而實(shí)現(xiàn)Spring的動(dòng)態(tài)配置,用一張關(guān)系圖表示:

圖片
relation

其他擴(kuò)展

spring-boot-configuration-processor

我們知道SpringBoot的配置我們都會(huì)寫在application.yml(.properties)文件中,為了簡化配置工作,如果能有智能提示就好了。這不,別人也想到了。只用這樣做:

  1. 現(xiàn)在只需要在項(xiàng)目中引入依賴:
< dependency >
    < groupId >org.springframework.boot< /groupId >
    < artifactId >spring-boot-configuration-processor< /artifactId >
    < optional >true< /optional >
< /dependency >
  1. 定義一個(gè)Properties文件
@Data
@ConfigurationProperties(prefix = "myProp")
public class MyProperties {
  private Boolean enable;
  private String name;
}
  1. 在Configuration中導(dǎo)入
@Configuration
@EnableConfigurationProperties({MyProperties.class})
public class WebApiAutoConfiguration {
    
}
  1. 打包
mvn clean install
  1. 生產(chǎn)metadata.json 可以看到,在jar中的/META-INF目錄下多了一個(gè)spring-configuration-metadata.json文件

@Conditional

實(shí)現(xiàn)spring bean的可插拔,我們可以基于屬性、配置、類或者Bean來控制配置(@Configuration)是否生效,常見的有下面的這些:

  • ConditionalOnBean 容器存在Bean時(shí)配置有效
  • ConditionalOnClass classpath中有指定class時(shí)配置有效
  • ConditionalOnMissingBean 容器不存在Bean時(shí)配置有效
  • ConditionalOnMissingClass classpath中沒有指定class時(shí)配置有效
  • ConditionalOnProperty 屬性配置對(duì)應(yīng)值成立時(shí)配置有效

AutoConfigure和@Enable

AutoConfigure是在spring.factories中配置了就會(huì)加載,但是可以通過@Conditional讓配置中的Bean不生效;@Enable需要顯示地使用才能有效,且先于AutoConfigure生效,從而可以配合@Conditional來阻斷AutoConfigure的配置

結(jié)束語

關(guān)于Spring框架的學(xué)習(xí)后面會(huì)慢慢增多,我們會(huì)從原理到實(shí)踐來介紹其功能,如果你有感興趣的技術(shù)點(diǎn)或者開發(fā)中的問題,可以通過留言進(jìn)行交流分享。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1706

    瀏覽量

    91578
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    240

    瀏覽量

    26678
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3799

    瀏覽量

    64388
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14343
  • Starter
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7545
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Spring Boot如何實(shí)現(xiàn)異步任務(wù)

    ,用來告訴 Spring 這個(gè)方法是一個(gè)異步方法,Spring 會(huì)將這個(gè)方法的執(zhí)行放在異步線程中進(jìn)行。使用 @Async 注解需要滿足以下條件: 需要
    的頭像 發(fā)表于 09-30 10:32 ?1440次閱讀

    Spring Boot使用Tomcat作為默認(rèn)的嵌入式服務(wù)器

    默認(rèn)情況下,Spring Boot使用Tomcat作為默認(rèn)的嵌入式服務(wù)器,將其更改為Jetty,只需排除Tomcat并包含如下的Jetty即可:1. spring-boot-starter-webpom.xml org.spri
    發(fā)表于 12-15 08:59

    Spring Boot嵌入式Web容器原理是什么

    ,不需要配置任何特殊的XML配置,為了這個(gè)目標(biāo),Spring BootSpring 4.0框架之上提供了很多特性,幫助應(yīng)用以“約定優(yōu)于配置”“開箱即用”的方式來啟動(dòng)應(yīng)用并運(yùn)行上下文。
    發(fā)表于 12-16 07:57

    Spring Boot從零入門1 詳述

    在開始學(xué)習(xí)Spring Boot之前,我之前從未接觸過Spring相關(guān)的項(xiàng)目,Java基礎(chǔ)還是幾年前自學(xué)的,現(xiàn)在估計(jì)也忘得差不多了吧,寫Spring
    的頭像 發(fā)表于 12-10 22:18 ?639次閱讀

    Spring認(rèn)證」什么是Spring GraphQL?

    spring-boot-starter-web HTTP 春季MVC spring-boot-starter-websocket 網(wǎng)絡(luò)結(jié)果 用于 Servlet 應(yīng)用程序的 WebSocket
    的頭像 發(fā)表于 08-10 14:08 ?825次閱讀
    「<b class='flag-5'>Spring</b>認(rèn)證」什么是<b class='flag-5'>Spring</b> GraphQL?

    學(xué)習(xí)Spring Boot 嵌入式服務(wù)器

    官方文檔使用其他Web服務(wù)器許多Spring Boot啟動(dòng)器都包含默認(rèn)的嵌入式容器。對(duì)于servlet堆棧應(yīng)用程序,spring-boot-starter-web包括Tomcatsprin...
    發(fā)表于 10-20 15:36 ?7次下載
    學(xué)習(xí)<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 嵌入式服務(wù)器

    Spring Boot特有的實(shí)踐

    Spring Boot是最流行的用于開發(fā)微服務(wù)的Java框架。在本文中,我將與你分享自2016年以來我在專業(yè)開發(fā)中使用Spring Boot所采用的最佳實(shí)踐。這些內(nèi)容是基于我的個(gè)人經(jīng)驗(yàn)
    的頭像 發(fā)表于 09-29 10:24 ?910次閱讀

    強(qiáng)大的Spring Boot 3.0要來了

    來源:OSC開源社區(qū)(ID:oschina2013) Spring Boot 3.0 首個(gè) RC 已發(fā)布,此外還為兩個(gè)分支發(fā)布了更新:2.7.5 2.6.13。 3.0.0-RC1: https
    的頭像 發(fā)表于 10-31 11:17 ?1874次閱讀

    Spring Boot Web相關(guān)的基礎(chǔ)知識(shí)

    Boot的第一個(gè)接口。接下來將會(huì)將會(huì)介紹使用Spring Boot開發(fā)Web應(yīng)用的相關(guān)內(nèi)容,其主要包括使用spring-boot-starter-web組件來實(shí)現(xiàn)Web應(yīng)用開發(fā)、UR
    的頭像 發(fā)表于 03-17 15:03 ?658次閱讀

    簡述Spring Boot數(shù)據(jù)校驗(yàn)

    上一篇文章我們了解了Spring Boot Web相關(guān)的知識(shí),初步了解了spring-boot-starter-web,還了解了@Contrler和@RestController的差別,如果
    的頭像 發(fā)表于 03-17 15:07 ?779次閱讀

    kafka client在 spring如何實(shí)現(xiàn)

    認(rèn)識(shí)了 spring-boot-starter ,今天不妨來看下如何寫一個(gè) pulsar-spring-boot-starter 模塊。 目標(biāo) 寫一個(gè)完整的類似 kafka-spring-boot-st
    的頭像 發(fā)表于 09-25 11:21 ?491次閱讀
    kafka client在 <b class='flag-5'>spring</b>如何實(shí)現(xiàn)

    Spring Boot Actuator快速入門

    不知道大家在寫 Spring Boot 項(xiàng)目的過程中,使用過 Spring Boot Actuator 嗎?知道 Spring
    的頭像 發(fā)表于 10-09 17:11 ?638次閱讀

    Spring Boot啟動(dòng) Eureka流程

    在上篇中已經(jīng)說過了 Eureka-Server 本質(zhì)上是一個(gè) web 應(yīng)用的項(xiàng)目,今天就來看看 Spring Boot 是怎么啟動(dòng) Eureka 的。 Spring Boot 啟動(dòng) E
    的頭像 發(fā)表于 10-10 11:40 ?894次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動(dòng) Eureka流程

    Spring Boot的啟動(dòng)原理

    可能很多初學(xué)者會(huì)比較困惑,Spring Boot 是如何做到將應(yīng)用代碼和所有的依賴打包成一個(gè)獨(dú)立的 Jar 包,因?yàn)閭鹘y(tǒng)的 Java 項(xiàng)目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?650次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動(dòng)原理

    Spring Boot 的設(shè)計(jì)目標(biāo)

    Spring 框架復(fù)雜的XML配置。使用 Spring Boot 可以很容易創(chuàng)建一個(gè)獨(dú)立運(yùn)行的、基于 Spring 的生產(chǎn)級(jí)應(yīng)用程序,而且Spri
    的頭像 發(fā)表于 10-13 14:56 ?586次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計(jì)目標(biāo)
    主站蜘蛛池模板: 午夜小片| 看片福利| 性欧美精品xxxx| 人人艹在线视频| 国产免费好大好硬视频| 性free中国美女hd| 四虎国产精品4hu永久| 日本免费人成在线网站| www.黄色免费| 天天干天天插| 亚洲一区二区三区网站| 日日噜噜噜噜人人爽亚洲精品 | 艹逼视频免费观看| 天天色综合3| 黄视频日本| 伊人精品在线观看| 韩国在线视频| 1024你懂的国产欧美日韩在| 亚洲 欧美 自拍 另类| 国产精品激情综合久久| 日本一本高清| 被公侵犯肉体中文字幕一区二区 | 我把美女日出白浆| 中国同志chinese小彬tv| 羞羞爱爱| 影音先锋五月天| 天天干夜夜玩| 日韩卡1卡2卡三卡四卡二卡免 | 欧美手机看片| 在线资源你懂的| 国产精品一区二区综合| 手机在线观看视频你懂的| 久久99国产精品免费观看| 九色在线| 欧美五月| 欧美视频综合| 国产小视频在线| 色多多免费观看在线| 天天操天天操天天干| 亚洲精品香蕉婷婷在线观看| www.亚洲天堂|