一文詳解Spring的Enablexxx注解使用實(shí)例
引言
layout: post categories: Java title: 一文帶你了解 Spring 的@Enablexxx 注解 tagline: by 子悠 tags: - 子悠
前面的文章給大家介紹 Spring
的重試機(jī)制的時(shí)候有提到過(guò) Spring
有很多 @Enable
開頭的注解,平時(shí)在使用的時(shí)候也沒(méi)有注意過(guò)為什么會(huì)有這些注解,今天就給大家介紹一下。
@Enable 注解
首先我們先看一下有哪些常用的 @Enable
開頭的注解,以及都是干什么用的。
@EnableRetry
:開啟Spring
的重試功能;@EnableScheduling
:開啟Spring
的定時(shí)功能;@EnableAsync
:開啟Spring
的異步功能;@EnableAutoConfiguration
:開啟Spring
的自動(dòng)裝配功能;
上面這幾個(gè)是我們經(jīng)常會(huì)用到和看到的,都知道在使用相應(yīng)的功能的時(shí)候,如果沒(méi)有配置上面的注解功能都是不生效的。以我們前面的文章的 Spring
重試為例,我們需要在啟動(dòng)類上面配置 @EnableRetry
,否則自動(dòng)重試注解 @Retryable
是不會(huì)生效的
@Import 注解
那有的小伙伴就要問(wèn)了,這個(gè) @EnableRetry
注解到底有什么作用呢?不用這個(gè)注解就沒(méi)辦法了嗎?
要知道這個(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),并且也還是有效果的,說(shuō)明跟我們的 @EnableRetry
注解是一樣的。
從上面的實(shí)驗(yàn)效果我們可以看到 @EnableRetry
注解其實(shí)就是對(duì) @Import(RetryConfiguration.class)
的一個(gè)封裝,同樣的通過(guò)源碼我們還可以看到 @EnableScheduling
注解就是對(duì) @Import({SchedulingConfiguration.class})
的一個(gè)封裝。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Import({SchedulingConfiguration.class}) @Documented public @interface EnableScheduling { }
那如果在沒(méi)有 @Enablexxx
注解的時(shí)候,我們直接通過(guò) @Import
注解是可以這樣寫的,在一個(gè) @Import
注解里面包含多個(gè)配置類,不過(guò)這種在配置類較多的場(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 注解呢
那么很多的小伙伴又要問(wèn)了,為啥要通過(guò)使用 @Import
注解將配置類加載進(jìn)來(lái)呢?在項(xiàng)目中的 Spring
上下文中不是能直接獲取到嗎?為此我們來(lái)實(shí)驗(yàn)一下,通過(guò)下面的代碼我們看下是否能在 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)過(guò)后我們可以看到結(jié)果如下,提示我們?cè)谌萜髦姓也坏竭@個(gè) bean
,有點(diǎn)小伙伴會(huì)說(shuō)是不是 bean
的名字寫錯(cuò)了,其實(shí)并不是,緊接著我們?cè)侔炎⑨尩哪且恍蟹砰_再運(yùn)行一下。
可以看到,這次我們成功的獲取到了這個(gè) Bean
,這個(gè)實(shí)驗(yàn)就是告訴我們,其實(shí)在默認(rèn)情況下,Spring
的容器中是找不到RetryConfiguration
這個(gè) Bean
的,因此我們需要通過(guò)使用 @Import
注解,將該類加載到容器中。
那么為什么在容器中找不到這個(gè) Bean
呢?
其實(shí)很簡(jiǎn)單,因?yàn)檫@個(gè) Bean
跟我們當(dāng)前環(huán)境的類是不是同一個(gè)包里面的,在項(xiàng)目啟動(dòng)的過(guò)程中并不會(huì)掃描到 RetryConfiguration
類所在的包,因此找不到是很正常的。
總結(jié)
上面通過(guò) @EnableRetry
這個(gè)注解帶大家了解了一下 Spring
的 @Enable
開頭的注解的使用原理,相信大家對(duì)這些注解有了更深入的了解。簡(jiǎn)單來(lái)說(shuō)就是因?yàn)槲覀円褂玫暮芏囝惒⒉辉谖覀冺?xiàng)目所在的包下面,我們不能將所有的依賴包都進(jìn)行掃描,也不不方便將所有的配置類都通過(guò) @Import
的方式進(jìn)行導(dǎo)入,而是讓每個(gè)功能的項(xiàng)目包都提供一個(gè) @Enable
開頭的注解,我們直接啟用注解就可以達(dá)到效果。
這種方式我們?cè)谄綍r(shí)的開發(fā)中也可以自己實(shí)現(xiàn),實(shí)現(xiàn)一個(gè)自己的 @Enable
開頭的注解來(lái)實(shí)現(xiàn)特定的功能
以上就是一文詳解Spring的Enablexxx注解使用實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于Spring Enablexxx注解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java多線程編程必備volatile與synchronized深入理解
這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04java使用計(jì)算md5校驗(yàn)碼方式比較兩個(gè)文件是否相同
MD5文件效驗(yàn)碼是一個(gè)判斷文件是否是相同文件的途徑,通過(guò)比較兩個(gè)文件的Md5效驗(yàn)碼是否相同來(lái)精確判斷兩個(gè)文件是否相同2014-04-04Java項(xiàng)目中獲取路徑的絕對(duì)路徑問(wèn)題和相對(duì)路徑問(wèn)題
這篇文章主要介紹了如何Java項(xiàng)目中獲取文件地址,在 Java 項(xiàng)目中我們經(jīng)常會(huì)讀取配置文件,但是文件的路徑在獲取時(shí)我們是怎么得到的?下面我們就一起進(jìn)入文章學(xué)習(xí)該內(nèi)容吧,需要的朋友可以參考下2022-02-02Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法
這篇文章主要介紹了Springboot Thymeleaf模板文件調(diào)用Java類靜態(tài)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2007-09-09Java 實(shí)戰(zhàn)圖書管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11Mybatis插件之自動(dòng)生成不使用默認(rèn)的駝峰式操作
這篇文章主要介紹了Mybatis插件之自動(dòng)生成不使用默認(rèn)的駝峰式操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11