一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring中@DependsOn注解的作用及實現原理解析

Spring中@DependsOn注解的作用及實現原理解析

2021-08-23 11:30brucelwl Java教程

這篇文章主要介紹了Spring中@DependsOn注解的作用及實現原理解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

本文給大家講解Spring中@DependsOn注解的作用及實現原理!

官方文檔解釋

Beans on which the current bean depends. Any beans specified are guaranteed to be created by the container before this bean. Used infrequently in cases where a bean does not explicitly depend on another through properties or constructor arguments, but rather depends on the side effects of another bean's initialization.
A depends-on declaration can specify both an initialization-time dependency and, in the case of singleton beans only, a corresponding destruction-time dependency. Dependent beans that define a depends-on relationship with a given bean are destroyed first, prior to the given bean itself being destroyed. Thus, a depends-on declaration can also control shutdown order.
May be used on any class directly or indirectly annotated with org.springframework.stereotype.Component or on methods annotated with Bean.
Using DependsOn at the class level has no effect unless component-scanning is being used. If a DependsOn-annotated class is declared via XML, DependsOn annotation metadata is ignored, and <bean depends-on="..."/> is respected instead.

@DependsOn注解的作用

org.springframework.context.annotation.DependsOn
該注解的屬性是一個字符串數組,數組的元素是每個依賴的bean的名稱。

  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface DependsOn {
  5.  
  6. String[] value() default {};
  7.  
  8. }

@DependsOn注解主要用于指定當前bean所依賴的beans。任何被指定依賴的bean都由Spring保證在當前bean之前創建。在少數情況下,bean不是通過屬性構造函數參數顯式依賴于另一個bean,但卻需要要求另一個bean優先完成初始化,則可以使用@DependsOn這個注解。

@DependsOn既可以指定初始化依賴順序,也可以指定bean相應的銷毀執行順序(僅在單例bean的情況下)。

可用于任何直接或間接帶@Component注解的bean或在用@Bean注釋的方法上。
如果使用的是xml配置,則需要使用<bean dependens on=“…”/>標簽.

簡單描述就是@DependsOn可以控制bean的創建、初始化(InitializingBean)、銷毀方法執行順序

示例:假如有三個Bean類叫Aaa、Bbb、Ccc分別實現了如下兩個接口。
org.springframework.beans.factory.InitializingBean
org.springframework.beans.factory.DisposableBean

Ccc通過@DependsOn指定依賴bean創建的順序為Bbb > Aaa

  1. @DependsOn({"bbb","ccc"})
  2. @Service
  3. public class Aaa implements InitializingBean, DisposableBean {
  4. private static final Logger logger = LoggerFactory.getLogger(Aaa.class);
  5.  
  6. public Aaa() {
  7. logger.info(this.getClass().getName() + " Construction");
  8. }
  9.  
  10. @Override
  11. public void afterPropertiesSet() throws Exception {
  12. logger.info(this.getClass().getName() + " afterPropertiesSet");
  13. }
  14.  
  15. @Override
  16. public void destroy() throws Exception {
  17. logger.info(this.getClass().getName() + " destroy");
  18. }
  19. }

Bbb Ccc類實現如下

  1. @Service
  2. public class Bbb implements InitializingBean, DisposableBean {
  3. //實現和Aaa相同
  4. }
  5. @Service
  6. public class Ccc implements InitializingBean, DisposableBean {
  7. //實現和Aaa相同
  8. }

那么初始順序如下: bbb --> ccc --> aaa

Spring中@DependsOn注解的作用及實現原理解析

而銷毀方法執行順序正好相反如下: aaa --> ccc --> bbb

Spring中@DependsOn注解的作用及實現原理解析

@DependsOn注解的實現原理

Spring在啟動時掃描到一個bean,會封裝成一個BeanDefinition,如果是AnnotatedBeanDefinition則解析類上的注解信息,發現@DependsOn注解,則讀取value值,調用BeanDefinition#setDependsOn保存。
源碼見ClassPathBeanDefinitionScanner#doScanAnnotationConfigUtils#processCommonDefinitionAnnotations(AnnotatedBeanDefinition, AnnotatedTypeMetadata)

創建bean時,也就是調用AbstractBeanFactory#doGetBean時,會獲取這些被依賴的beanName,按照數組順序,再調用AbstractBeanFactory#getBean(beanName)來優先創建被依賴的bean,從而達到控制依賴順序。

除此之外,在創建bean時,還會調用AbstractBeanFactory#registerDisposableBeanIfNecessary來向Spring中注冊帶有銷毀方法的bean,源碼見DefaultSingletonBeanRegistry#registerDisposableBean,內部通過LinkedHashMap保存。key為bean名稱。進程退出時,會逆序調用銷毀方法。
源碼見DefaultSingletonBeanRegistry#destroySingletons

  1. public void destroySingletons() {
  2. if (logger.isTraceEnabled()) {
  3. logger.trace("Destroying singletons in " + this);
  4. }
  5. synchronized (this.singletonObjects) {
  6. this.singletonsCurrentlyInDestruction = true;
  7. }
  8.  
  9. String[] disposableBeanNames;
  10. synchronized (this.disposableBeans) {
  11. disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
  12. }
  13. for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
  14. destroySingleton(disposableBeanNames[i]);
  15. }
  16.  
  17. this.containedBeanMap.clear();
  18. this.dependentBeanMap.clear();
  19. this.dependenciesForBeanMap.clear();
  20.  
  21. clearSingletonCache();
  22. }

到此這篇關于Spring中@DependsOn注解的作用及實現原理解析的文章就介紹到這了,更多相關Spring中@DependsOn注解內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/u013202238/article/details/113360497

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 97se亚洲国产综合自在线观看 | 日本美女xx | 韩国三级视频网站 | 四虎精品成人免费观看 | 日本人和黑人一级纶理片 | 9420高清视频在线观看网百度 | 性色老女人 | 国产亚洲精品福利在线 | 艹的好爽| 天天舔天天干 | 亚洲情射 | 40岁女人三级全黄 | 亚洲成人国产精品 | 青青草综合网 | 鬼畜重口高h合集长短篇 | 亚洲精品电影天堂网 | 2048论坛永久入口 原创合集 | 天天干天天日天天射天天操毛片 | 啪啪大幂幂被c | 海派甜心完整版在线观看 | 黄色a站 | 国产高清露脸学生在线观看 | 99这里精品 | 国产精品免费aⅴ片在线观看 | 久久无码人妻AV精品一区 | 国产一二在线观看视频网站 | 温柔校草高h | 深夜a| 欧美精品色精品一区二区三区 | 日韩高清成人毛片不卡 | 九九国产在线视频 | 鸭子玩富婆流白浆视频 | 男人含玉势出嫁束器 | 青青青国产手机在线播放 | 欧美日韩国产手机在线观看视频 | 国产亚洲精品网站 | 成人榴莲视频 | 逼逼爱| 美女露尿口 | 翁公与小莹在客厅激情 | 欧美日韩国产最新一区二区 |