国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot自動(dòng)裝配

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot自動(dòng)裝配。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

自動(dòng)裝配是 Spring Boot 最核心的功能之一,第三方可以基于這個(gè)特性非常方便的和 Spring 做整合,實(shí)現(xiàn)自己的 Starter,做到開箱即用。
Java 早期并不支持注解,所以那會(huì)兒 Spring 只能通過 xml 的形式來配置。早期項(xiàng)目里要引入一個(gè)功能模塊,首先我們要引入 SDK,然后在 xml 里配置所需的 bean。隨著引入的模塊越來越多,開發(fā)者很快陷入 xml 的旋渦之中。
Spring 3.0 時(shí)代,官方開始提供@Import注解實(shí)現(xiàn)自動(dòng)裝配的能力,同時(shí)也伴隨了一堆以@EnableXXX命名風(fēng)格的注解,顧名思義加上這些注解就能啟用對(duì)應(yīng)的能力,這倆注解一般配合使用。
到了 Spring Boot 時(shí)代,自動(dòng)裝配再度迎來升級(jí),它在@Import基礎(chǔ)上增加了 SPI 的能力,而且還支持條件裝配,使用上更加靈活。

理解自動(dòng)裝配

什么是自動(dòng)裝配???
跟自動(dòng)裝配相對(duì)立的就是手動(dòng)裝配,早期我們通過 xml 手動(dòng)往容器里注冊 bean 的方式就是手動(dòng)裝配。手動(dòng)裝配的缺點(diǎn)是:

  • 使用麻煩,需要維護(hù)一堆 xml
  • 使用門檻高,開發(fā)者需要知道配置細(xì)節(jié)

反之,自動(dòng)裝配就是開發(fā)者根據(jù) Spring Boot 定制的規(guī)范編寫AutoConfiguration類,Spring Boot 會(huì)自動(dòng)加載這些配置類并把對(duì)應(yīng)的 bean 注冊到容器,這些 bean 是具備某種能力的,這樣第三方就可以很輕松的把自己要提供的功能裝進(jìn) Spring Boot。有了自動(dòng)裝配,開發(fā)者僅需加上少量注解或配置,甚至什么都不加(約定大于配置),就可以為項(xiàng)目引入一個(gè)功能模塊。

裝配的是什么???
從廣義上理解,裝配的是模塊、是組件、是一個(gè)具體的功能。從狹義上理解,裝配的其實(shí)是一個(gè)個(gè)具備某種能力的 bean。

自動(dòng)裝配是怎么實(shí)現(xiàn)的???
通過一個(gè)叫@EnableAutoConfiguration的注解往容器導(dǎo)入了一個(gè)叫AutoConfigurationImportSelector的類,它實(shí)現(xiàn)了ImportSelector接口,Spring 啟動(dòng)時(shí)會(huì)觸發(fā)子類方法按照規(guī)則加載自動(dòng)裝配類。

設(shè)計(jì)實(shí)現(xiàn)

在使用 Spring Boot 開發(fā)時(shí),我們一般會(huì)在啟動(dòng)類上加@SpringBootApplication注解,它就是自動(dòng)裝配的入口。

@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 {
    ......
}

它是一個(gè)復(fù)合注解,里面還集成了 Spring 提供的一些其它注解,從名字就能看出來,與自動(dòng)裝配有關(guān)的是@EnableAutoConfiguration注解。

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

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    
	Class<?>[] exclude() default {};

	String[] excludeName() default {};
}

@EnableAutoConfiguration也是一個(gè)復(fù)合注解,它最核心的功能就是往容器導(dǎo)入了AutoConfigurationImportSelector類。
Spring Boot自動(dòng)裝配,Spring Boot,spring boot,java,后端
AutoConfigurationImportSelector 實(shí)現(xiàn)了各種 Aware 接口,具備 BeanFactory、BeanClassLoader 等感知能力。最重要的是它實(shí)現(xiàn)了 DeferredImportSelector 接口,DeferredImportSelector 又繼承自 ImportSelector。
ImportSelector 接口用來向容器注冊批量導(dǎo)入配置類,子類重寫selectImports()返回要導(dǎo)入的類的全限定名數(shù)組:

public interface ImportSelector {

	String[] selectImports(AnnotationMetadata importingClassMetadata);

	@Nullable
	default Predicate<String> getExclusionFilter() {
		return null;
	}
}

子接口 DeferredImportSelector 的區(qū)別是二者導(dǎo)入的時(shí)機(jī)不同,ImportSelector 會(huì)在@Configuration Bean 處理前調(diào)用,DeferredImportSelector 會(huì)等處理完所有的@Configuration Bean 之后再調(diào)用。
所以,Spring 啟動(dòng)時(shí)會(huì)先觸發(fā)AutoConfigurationImportSelector.AutoConfigurationGroup#process收集要導(dǎo)入的類,再觸發(fā)selectImports()返回導(dǎo)入項(xiàng)的迭代器。

@Override
public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {
    Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,
            () -> String.format("Only %s implementations are supported, got %s",
                    AutoConfigurationImportSelector.class.getSimpleName(),
                    deferredImportSelector.getClass().getName()));
    // 獲取要導(dǎo)入的自動(dòng)配置類
    AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
            .getAutoConfigurationEntry(annotationMetadata);
    this.autoConfigurationEntries.add(autoConfigurationEntry);
    for (String importClassName : autoConfigurationEntry.getConfigurations()) {
        this.entries.putIfAbsent(importClassName, annotationMetadata);
    }
}

核心是getAutoConfigurationEntry(),它會(huì)按照 Spring Boot 的規(guī)范加載自動(dòng)裝配類,去重后再移除掉需要被排除的類,接著觸發(fā)一個(gè) AutoConfigurationImportListener 監(jiān)聽事件,最后返回收集到的類。

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    // 可以通過配置spring.boot.enableautoconfiguration=false來禁用自動(dòng)裝配
    if (!isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    }
    AnnotationAttributes attributes = getAttributes(annotationMetadata);
    // 加載候選配置類
    List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
    // 去重 轉(zhuǎn)HashSet
    configurations = removeDuplicates(configurations);
    // 移除掉要排除的類
    Set<String> exclusions = getExclusions(annotationMetadata, attributes);
    checkExcludedClasses(configurations, exclusions);
    configurations.removeAll(exclusions);
    configurations = getConfigurationClassFilter().filter(configurations);
    // 觸發(fā)AutoConfigurationImportListener監(jiān)聽事件
    fireAutoConfigurationImportEvents(configurations, exclusions);
    return new AutoConfigurationEntry(configurations, exclusions);
}

Spring Boot 會(huì)按照什么規(guī)則加載配置類呢?方法是getCandidateConfigurations(),它會(huì)加載候選的配置類,有兩套加載規(guī)則:

  • 讀取 ClassPath 下META-INF/spring.factories文件里以org.springframework.boot.autoconfigure.EnableAutoConfiguration為 Key 配置的類
  • 讀取 ClassPath 下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件里配置的所有類

第一套規(guī)則更多的是給第三方提供的口子,第二套規(guī)則是 Spring Boot 導(dǎo)入內(nèi)部配置類的口子。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    /**
     * 讀取ClassPath下META-INF/spring.factories文件里
     * 被org.springframework.boot.autoconfigure.EnableAutoConfiguration標(biāo)注的類
     */
    List<String> configurations = new ArrayList<>(
            SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
    /**
     * 讀取ClassPath下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
     * 文件里配置的類都要導(dǎo)入
     */
    ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
    return configurations;
}

讀取文件加載配置類用到了 Spring 提供的 SpringFactoriesLoader 類,代碼不復(fù)雜,這里就不贅述了。
我們重點(diǎn)看一下,Spring Boot 內(nèi)部都提供了哪些配置類,文件路徑在spring-boot-autoconfigure/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,官方默認(rèn)提供了 144 個(gè)自動(dòng)裝配類,這里貼幾個(gè)示例。

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
......

這些配置類基本從名字就可以看出它們的功能,例如:AopAutoConfiguration 用來配置切面編程相關(guān)的 bean;RabbitAutoConfiguration 用來配置 RabbitMQ 相關(guān)的 bean。
自動(dòng)配置類本身會(huì)作為 bean 注冊到容器,除此之外還可以通過@Bean注解方法的形式注冊 bean。如果要提供的功能比較復(fù)雜,不想所有的代碼都耦合在一個(gè)類里面,還可以在配置類上繼續(xù)加@Import注解引入另一個(gè)配置類。

條件配置
官方一股腦提供了 144 個(gè)自動(dòng)配置類,我們不一定都需要啊,所以條件配置誕生了。
條件配置的意思是,可以給自動(dòng)配置類加上一些前置條件,只有這些條件都滿足了,配置類才會(huì)生效。條件配置伴隨的是一堆以@ConditionalXXX命名風(fēng)格的注解,這里舉幾個(gè)常用的:

  • @ConditionalOnBean:容器存在滿足條件的 bean 才生效
  • @ConditionalOnClass:容器存在滿足條件的 Class 才生效
  • @ConditionalOnMissingBean:容器不存在滿足條件的 bean 才生效
  • @ConditionalOnMissingClass:容器不存在滿足條件的 Class 才生效
  • @ConditionalOnWebApplication:必須是指定類型的 Web 應(yīng)用環(huán)境才生效

有了條件配置,即使官方一股腦提供了一堆自動(dòng)配置類,很多也都是不會(huì)生效的,要想生效我們得引入相關(guān)的依賴和配置。
以 RabbitAutoConfiguration 為例,它的生效條件是存在 RabbitTemplate.class、Channel.class,如果我們沒有引入相關(guān)依賴,這些類肯定是不存在的,配置類自然也就不會(huì)生效了。

@AutoConfiguration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import({ RabbitAnnotationDrivenConfiguration.class, RabbitStreamConfiguration.class })
public class RabbitAutoConfiguration {
    
}

尾巴

所謂的自動(dòng)裝配,就是 Spring Boot 程序在啟動(dòng)時(shí)會(huì)去掃描 ClassPath 下的META-INF/spring.factories文件,自動(dòng)把 AutoConfiguration 類注冊到容器,免去了開發(fā)者需要自己配置 bean 的麻煩過程。Spring Boot 一股腦提供了 144 個(gè)自動(dòng)配置類,絕大多數(shù)開發(fā)者并不需要,所以提供了基于條件的自動(dòng)配置,只有前置條件都滿足了,配置類才會(huì)生效。基于自動(dòng)裝配和約定大于配置的設(shè)計(jì)理念,開發(fā)者僅需編寫少量配置甚至不寫任何配置就可以方便的引入一個(gè)功能模塊。文章來源地址http://www.zghlxwxcb.cn/news/detail-817769.html

到了這里,關(guān)于Spring Boot自動(dòng)裝配的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • spring boot的自動(dòng)裝配原理

    作者: 逍遙Sean 簡介:一個(gè)主修Java的Web網(wǎng)站游戲服務(wù)器后端開發(fā)者 主頁:https://blog.csdn.net/Ureliable 覺得博主文章不錯(cuò)的話,可以三連支持一下~ 如有需要我的支持,請私信或評(píng)論留言! Spring Boot是一個(gè)開源的Java框架,可以幫助開發(fā)者快速構(gòu)建基于Spring的應(yīng)用程序。Spring Boo

    2024年02月10日
    瀏覽(29)
  • Spring Boot如何實(shí)現(xiàn)自動(dòng)裝配

    Spring Boot的自動(dòng)裝配是它的一大特點(diǎn),可以大大提高開發(fā)效率,減少重復(fù)性代碼的編寫。本文將詳細(xì)講解Spring Boot如何實(shí)現(xiàn)自動(dòng)裝配。 在傳統(tǒng)的Spring框架中,我們需要手動(dòng)配置和管理Bean的依賴關(guān)系,但在Spring Boot中,大量的配置可以自動(dòng)完成。這是因?yàn)镾pring Boot中引入了自動(dòng)裝

    2024年02月04日
    瀏覽(21)
  • Spring Boot源碼解析 - 自動(dòng)裝配原理

    Spring Boot源碼解析 - 自動(dòng)裝配原理

    Spring Boot 自動(dòng)裝配是 Spring Boot 框架的一個(gè)關(guān)鍵特性,它的目標(biāo)是讓開發(fā)者能夠快速構(gòu)建 Spring 應(yīng)用程序,減少繁瑣的配置工作。 ? @SpringApplication 從啟動(dòng)類 @SpringApplication 注解入手, @SpringBootApplication 是一個(gè)組合注解,它是 Spring Boot 框架中常用的一個(gè)主要注解之一。它結(jié)合了

    2024年01月19日
    瀏覽(35)
  • Spring Boot中自動(dòng)裝配機(jī)制的原理

    Spring Boot中自動(dòng)裝配機(jī)制的原理

    1 .自動(dòng)裝配,簡單來說就是自動(dòng)把第三方組件的Bean裝載到Spring IOC容器里面 ,不需要開發(fā)人員再去寫B(tài)ean的裝配配置, 2.在Spring Boot應(yīng)用里面,只需要在啟動(dòng)類加上 @SpringBootApplication 注解就可以實(shí)現(xiàn)自動(dòng)裝配。 3.@SpringBootApplication是一個(gè)復(fù)合注解, 真正實(shí)現(xiàn)自動(dòng)裝配的注解是@

    2024年02月10日
    瀏覽(23)
  • 【Spring Boot 源碼學(xué)習(xí)】自動(dòng)裝配流程源碼解析(上)

    【Spring Boot 源碼學(xué)習(xí)】自動(dòng)裝配流程源碼解析(上)

    《Spring Boot 源碼學(xué)習(xí)系列》 上篇博文,筆者帶大家從整體上了解了AutoConfigurationImportSelector 自動(dòng)裝配邏輯的核心功能及流程,由于篇幅有限,更加細(xì)化的功能及流程詳解還沒有介紹。本篇開始將從其源碼入手,重點(diǎn)解析細(xì)化后的自動(dòng)裝配流程源碼。 在開始本篇的內(nèi)容介紹之前

    2024年02月14日
    瀏覽(31)
  • 【Spring Boot 源碼學(xué)習(xí)】自動(dòng)裝配流程源碼解析(下)

    【Spring Boot 源碼學(xué)習(xí)】自動(dòng)裝配流程源碼解析(下)

    《Spring Boot 源碼學(xué)習(xí)系列》 上篇博文,筆者帶大家了解了自動(dòng)裝配流程中有關(guān)自動(dòng)配置加載的流程; 本篇將介紹自動(dòng)裝配流程剩余的內(nèi)容,包含了自動(dòng)配置組件的排除和過濾、觸發(fā)自動(dòng)配置事件。 在開始本篇的內(nèi)容介紹之前,我們先來看看往期的系列文章【有需要的朋友,

    2024年02月11日
    瀏覽(37)
  • 【Spring Boot自動(dòng)裝配原理詳解與常見面試題】—— 每天一點(diǎn)小知識(shí)

    【Spring Boot自動(dòng)裝配原理詳解與常見面試題】—— 每天一點(diǎn)小知識(shí)

    ????????????????????????????????????????????????????????????? ?? S p r i n g B o o t 自動(dòng)裝配原理詳解與常見面試題 color{#FF1493}{Spring Boot自動(dòng)裝配原理詳解與常見面試題} Sp r in g B oo t 自動(dòng)裝配原理詳解與常見面試題 ?? ????????? ?? 仰望天空

    2024年02月16日
    瀏覽(21)
  • 拆解Spring boot:Springboot為什么如此絲滑而簡單?源碼剖析解讀自動(dòng)裝配

    拆解Spring boot:Springboot為什么如此絲滑而簡單?源碼剖析解讀自動(dòng)裝配

    ????歡迎光臨,終于等到你啦???? ??我是蘇澤,一位對(duì)技術(shù)充滿熱情的探索者和分享者。???? ??持續(xù)更新的專欄 《Spring 狂野之旅:從入門到入魔》 ?? 本專欄帶你從Spring入門到入魔 ? 這是蘇澤的個(gè)人主頁可以看到我其他的內(nèi)容哦???? 努力的蘇澤 http://suzee.blog.csdn

    2024年03月23日
    瀏覽(24)
  • 微信小程序的授權(quán)登錄-Java 后端 (Spring boot)

    微信開發(fā)文檔鏈接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 一個(gè)可以測試的微信小程序 此微信小程序的APPID和APPscret(至開發(fā)者后臺(tái)獲?。?從時(shí)序圖我們可以了解到流程大致分為兩步: 小程序端獲取code后傳給Java后臺(tái) Java后臺(tái)獲取code后向微信后臺(tái)接口

    2024年02月09日
    瀏覽(97)
  • “從零開始學(xué)習(xí)Spring Boot:快速搭建Java后端開發(fā)環(huán)境“

    標(biāo)題:從零開始學(xué)習(xí)Spring Boot:快速搭建Java后端開發(fā)環(huán)境 摘要:本文將介紹如何從零開始學(xué)習(xí)Spring Boot,并詳細(xì)講解如何快速搭建Java后端開發(fā)環(huán)境。通過本文的指導(dǎo),您將能夠快速搭建一個(gè)基于Spring Boot的Java后端開發(fā)環(huán)境并開始編寫代碼。 正文: 一、準(zhǔn)備工作 在開始之前,

    2024年02月15日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包