最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解Spring中@Enable開頭注解的使用

 更新時(shí)間:2022年09月19日 08:50:45   作者:鴨血粉絲Tang  
前面的文章給大家介紹?Spring?的重試機(jī)制的時(shí)候有提到過?Spring?有很多?@Enable?開頭的注解,平時(shí)在使用的時(shí)候也沒有注意過為什么會(huì)有這些注解,今天就給大家介紹一下

@Enable 注解

首先我們先看一下有哪些常用的 @Enable 開頭的注解,以及都是干什么用的。

  • @EnableRetry:開啟 Spring 的重試功能;

  • @EnableScheduling:開啟 Spring 的定時(shí)功能;
  • @EnableAsync:開啟 Spring 的異步功能;
  • @EnableAutoConfiguration:開啟 Spring 的自動(dòng)裝配功能;

上面這幾個(gè)是我們經(jīng)常會(huì)用到和看到的,都知道在使用相應(yīng)的功能的時(shí)候,如果沒有配置上面的注解功能都是不生效的。以我們前面的文章的 Spring 重試為例,我們需要在啟動(dòng)類上面配置 @EnableRetry ,否則自動(dòng)重試注解 @Retryable 是不會(huì)生效的,如下所示,沒看過的可以去看下,Java 遠(yuǎn)程調(diào)用失敗?如何優(yōu)雅的進(jìn)行重試?。

@Import 注解

那有的小伙伴就要問了,這個(gè) @EnableRetry 注解到底有什么作用呢?不用這個(gè)注解就沒辦法了嗎?

要知道這個(gè)注解有什么功效,我們可以點(diǎn)開看看源碼,代碼如下

package?org.springframework.retry.annotation;

import?java.lang.annotation.Documented;
import?java.lang.annotation.ElementType;
import?java.lang.annotation.Retention;
import?java.lang.annotation.RetentionPolicy;
import?java.lang.annotation.Target;

import?org.springframework.context.annotation.EnableAspectJAutoProxy;
import?org.springframework.context.annotation.Import;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@EnableAspectJAutoProxy(proxyTargetClass?=?false)
@Import(RetryConfiguration.class)
@Documented
public?@interface?EnableRetry?{

?boolean?proxyTargetClass()?default?false;
}

可以看到源碼很簡(jiǎn)單,其中最有用的就一行 @Import(RetryConfiguration.class) ,我們可以嘗試把這一行代碼放到啟動(dòng)類上面看看效果,如下所示,可以看到項(xiàng)目可以正常啟動(dòng),并且也還是有效果的,說明跟我們的 @EnableRetry 注解是一樣的。

從上面的實(shí)驗(yàn)效果我們可以看到 @EnableRetry 注解其實(shí)就是對(duì) @Import(RetryConfiguration.class) 的一個(gè)封裝,同樣的通過源碼我們還可以看到 @EnableScheduling 注解就是對(duì) @Import({SchedulingConfiguration.class}) 的一個(gè)封裝。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({SchedulingConfiguration.class})
@Documented
public?@interface?EnableScheduling?{
}

那如果在沒有 @Enablexxx 注解的時(shí)候,我們直接通過 @Import 注解是可以這樣寫的,在一個(gè) @Import 注解里面包含多個(gè)配置類,不過這種在配置類較多的場(chǎng)景下還是相對(duì)不夠簡(jiǎn)潔的,因而才有了各自功能對(duì)應(yīng)的 @Enable 注解。

package?com.example.demo;

import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.context.annotation.ComponentScan;
import?org.springframework.context.annotation.Import;
import?org.springframework.retry.annotation.RetryConfiguration;
import?org.springframework.scheduling.annotation.SchedulingConfiguration;

@SpringBootApplication
@ComponentScan(value?=?"com.example.demo.*")
@Import({RetryConfiguration.class,?SchedulingConfiguration.class})
public?class?DemoApplication?{

??public?static?void?main(String[]?args)?{
????SpringApplication.run(DemoApplication.class,?args);
??}

}

為什么要使用 @Import 注解呢

那么很多的小伙伴又要問了,為啥要通過使用 @Import 注解將配置類加載進(jìn)來呢?在項(xiàng)目中的 Spring 上下文中不是能直接獲取到嗎?為此我們來實(shí)驗(yàn)一下,通過下面的代碼我們看下是否能在 Spring 的容器中獲取到 RetryConfiguration 的 Bean

package?com.example.demo;

import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.context.ConfigurableApplicationContext;
import?org.springframework.context.annotation.ComponentScan;
import?org.springframework.context.annotation.Import;
import?org.springframework.retry.annotation.RetryConfiguration;
import?org.springframework.scheduling.annotation.SchedulingConfiguration;

@SpringBootApplication
@ComponentScan(value?=?"com.example.demo.*")
//@Import({RetryConfiguration.class,?SchedulingConfiguration.class})
public?class?DemoApplication?{

??public?static?void?main(String[]?args)?{

????ConfigurableApplicationContext?applicationContext?=?SpringApplication.run(DemoApplication.class,?args);
????Object?bean?=?applicationContext.getBean("org.springframework.retry.annotation.RetryConfiguration");
????System.out.println(bean.toString());
??}
}

啟動(dòng)過后我們可以看到結(jié)果如下,提示我們?cè)谌萜髦姓也坏竭@個(gè) bean,有點(diǎn)小伙伴會(huì)說是不是 bean 的名字寫錯(cuò)了,其實(shí)并不是,緊接著我們?cè)侔炎⑨尩哪且恍蟹砰_再運(yùn)行一下。

可以看到,這次我們成功的獲取到了這個(gè) Bean,這個(gè)實(shí)驗(yàn)就是告訴我們,其實(shí)在默認(rèn)情況下,Spring 的容器中是找不到RetryConfiguration 這個(gè) Bean 的,因此我們需要通過使用  @Import 注解,將該類加載到容器中。

那么為什么在容器中找不到這個(gè) Bean 呢?

其實(shí)很簡(jiǎn)單,因?yàn)檫@個(gè) Bean 跟我們當(dāng)前環(huán)境的類是不是同一個(gè)包里面的,在項(xiàng)目啟動(dòng)的過程中并不會(huì)掃描到 RetryConfiguration  類所在的包,因此找不到是很正常的。

總結(jié)

上面通過 @EnableRetry 這個(gè)注解帶大家了解了一下 Spring 的 @Enable 開頭的注解的使用原理,相信大家對(duì)這些注解有了更深入的了解。簡(jiǎn)單來說就是因?yàn)槲覀円褂玫暮芏囝惒⒉辉谖覀冺?xiàng)目所在的包下面,我們不能將所有的依賴包都進(jìn)行掃描,也不不方便將所有的配置類都通過 @Import 的方式進(jìn)行導(dǎo)入,而是讓每個(gè)功能的項(xiàng)目包都提供一個(gè) @Enable 開頭的注解,我們直接啟用注解就可以達(dá)到效果。

這種方式我們?cè)谄綍r(shí)的開發(fā)中也可以自己實(shí)現(xiàn),實(shí)現(xiàn)一個(gè)自己的 @Enable 開頭的注解來實(shí)現(xiàn)特定的功能。

到此這篇關(guān)于一文帶你了解Spring中@Enable開頭注解的使用的文章就介紹到這了,更多相關(guān)Spring @Enable注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)二維碼生成的代碼方法

    Java實(shí)現(xiàn)二維碼生成的代碼方法

    這篇內(nèi)容分享了JAVA實(shí)現(xiàn)二維碼生成的實(shí)例代碼,對(duì)此有需要的朋友們可以測(cè)試參考下。
    2018-07-07
  • SpringCloud Eureka服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)過程

    SpringCloud Eureka服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)過程

    這篇文章主要介紹了SpringCloud Eureka服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • spring boot linux啟動(dòng)方式詳解

    spring boot linux啟動(dòng)方式詳解

    這篇文章主要介紹了spring boot linux啟動(dòng)方式詳解,分為為前臺(tái)啟動(dòng),后臺(tái)啟動(dòng)和腳本啟動(dòng)的各種方式講解,需要的朋友可以參考下
    2017-11-11
  • idea 實(shí)現(xiàn)縱列選擇和大小寫轉(zhuǎn)換操作

    idea 實(shí)現(xiàn)縱列選擇和大小寫轉(zhuǎn)換操作

    這篇文章主要介紹了idea 實(shí)現(xiàn)縱列選擇和大小寫轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱加密與解密詳解

    java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱加密與解密詳解

    這篇文章主要給大家介紹了關(guān)于java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱加密與解密的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Java性能優(yōu)化技巧匯總

    Java性能優(yōu)化技巧匯總

    這篇文章主要介紹了Java性能優(yōu)化技巧,匯總了提升java程序性能的常用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn)

    手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn)

    本文主要介紹了手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java多線程事務(wù)加鎖引發(fā)bug用戶重復(fù)注冊(cè)解決分析

    java多線程事務(wù)加鎖引發(fā)bug用戶重復(fù)注冊(cè)解決分析

    這篇文章主要為大家介紹了java多線程事務(wù)加鎖引發(fā)bug用戶重復(fù)注冊(cè)解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java常用的加密解決方案分享

    java常用的加密解決方案分享

    這篇文章全面介紹了Java中加解密技術(shù)的應(yīng)用,包括哈希函數(shù)、對(duì)稱加密、非對(duì)稱加密、消息認(rèn)證碼和數(shù)字簽名等,它詳細(xì)解釋了每種技術(shù)的工作原理,并提供了相應(yīng)的Java代碼示例,文章還強(qiáng)調(diào)了密鑰管理的重要性,并提出了在實(shí)際應(yīng)用中遵循的最佳實(shí)踐
    2025-01-01
  • Java Scanner對(duì)象中hasNext()與next()方法的使用

    Java Scanner對(duì)象中hasNext()與next()方法的使用

    這篇文章主要介紹了Java Scanner對(duì)象中hasNext()與next()方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

黄浦区| 海丰县| 邵武市| 三河市| 双流县| 三明市| 正镶白旗| 松滋市| 泰兴市| 高碑店市| 临清市| 开化县| 阳西县| 游戏| 日喀则市| 寻乌县| 尖扎县| 五大连池市| 德兴市| 巴林左旗| 内江市| 闵行区| 新干县| 凭祥市| 尉犁县| 肥东县| 班戈县| 洪洞县| 泰州市| 玉树县| 靖远县| 新源县| 福建省| 进贤县| 清原| 花莲县| 澜沧| 绿春县| 千阳县| 旬阳县| 澄迈县|