Spring中的@DependsOn注解使用解析
@DependsOn定義/作用
@DependsOn注解可以定義在類和方法上,意思是我這個組件要依賴于另一個組件,也就是說被依賴的組件會比該組件先注冊到IOC容器中。
使用場景: 需要用到觀察者模式的情況下通常都需要用到該注解,觀察者模式(詳細可查看相關文章)有三要輸,觀察者、事件源、事件,機制是觀察者會監(jiān)聽數(shù)據(jù)源的某些時間,當事件源觸發(fā)該事件后,觀察者就會知道進行相應措施。
比如老師是觀察者,學生是事件源,學生遲到是事件,老師觀察學生是否遲到,每當學生遲到,老師就會發(fā)現(xiàn),并處罰該學生。
這類場景一般需要觀察者要比事件源先創(chuàng)建,才能不遺漏事件源觸發(fā)的每一個事件,要是事件源先創(chuàng)建,可能會在觀察者創(chuàng)建前就觸發(fā)了事件而觀察者無法知道。
比如上述例子,八點算遲到,但是老師自己都八點半才到學校,所以就無法知道八點到八點半之間遲到的學生。
源碼
//可以作用在方法和類上。 //當作用在類上時,通常會與@Component及其衍生注解等注解配合使用。 //當作用在方法上時,通常會與@Bean注解配合使用。 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DependsOn { //要依賴的bean id,是個數(shù)組,也就是說可以依賴多個bean。 //效果是該注解作用的bean會比value設置的依賴bean晚實例化到容器中。 String[] value() default {}; }
demo(與@Component配合使用)
/** * 事件源 */ @Component public class EventSource { public EventSource(){ System.out.println("事件源創(chuàng)建"); } } /** * 監(jiān)聽類 */ @Component public class EventTListener { public EventTListener(){ System.out.println("監(jiān)聽器創(chuàng)建"); } } //測試類: @Configuration @ComponentScan(basePackages = "dependsondemo") public class SpringConfig { }
結果:
分析:因為spring默認掃描包時會根據(jù)文件在文件夾的位置先后順序掃描加載,而EventSource 文件位置在EventTListener前面,所以會先加載EventSource 事件源組件。這不符合邏輯。
使用@DependsOn注解
@Component @DependsOn(value = {"eventTListener"}) public class EventSource { public EventSource(){ System.out.println("事件源創(chuàng)建"); } }
結果:
監(jiān)聽器先創(chuàng)建了。value屬性的bean id必須存在,不然會報錯。
demo(與Bean注解配合使用)
//要把上面兩個組件類上的注解去掉,再使用下面 @Configuration @ComponentScan(basePackages = "dependsondemo") public class SpringConfig { @Bean @DependsOn(value = {"eventListener"}) public EventSource eventSource(){ return new EventSource(); } @Bean public EventTListener eventListener(){ return new EventTListener(); } }
結果: 如果不加@DependsOn注解的話,就會先創(chuàng)建事件源,如果加了(如上代碼),就會先創(chuàng)建監(jiān)聽器。
到此這篇關于Spring中的@DependsOn注解使用解析的文章就介紹到這了,更多相關@DependsOn注解使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回
這篇文章主要介紹了Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-07-07SpringBoot使用Apache?POI實現(xiàn)導入導出Excel文件
Apache?POI?是一個強大的?Java?庫,用于處理?Microsoft?Office?文檔,下面我們來看看SpringBoot如何使用Apache?POI導入導出Excel文件功能吧2025-01-01Spring中的兩種代理JDK和CGLIB的區(qū)別淺談
本篇文章中主要介紹了Spring中的兩種代理JDK和CGLIB的區(qū)別淺談,詳解的介紹了JDK和CGLIB的原理和方法,有需要的朋友可以了解一下2017-04-04