定义/作用

@DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中。

使用场景:
需要用到观察者模式的情况下通常都需要用到该注解,观察者模式(详细可查看相关文章)有三要输,观察者、事件源、事件,机制是观察者会监听数据源的某些时间,当事件源触发该事件后,观察者就会知道进行相应措施。

比如老师是观察者,学生是事件源,学生迟到是事件,老师观察学生是否迟到,每当学生迟到,老师就会发现,并处罚该学生。

这类场景一般需要观察者要比事件源先创建,才能不遗漏事件源触发的每一个事件,要是事件源先创建,可能会在观察者创建前就触发了事件而观察者无法知道。

比如上述例子,八点算迟到,但是老师自己都八点半才到学校,所以就无法知道八点到八点半之间迟到的学生。

源码:

//可以作用在方法和类上。
//当作用在类上时,通常会与@Component及其衍生注解等注解配合使用。
//当作用在方法上时,通常会与@Bean注解配合使用。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {//要依赖的bean id,是个数组,也就是说可以依赖多个bean。//效果是该注解作用的bean会比value设置的依赖bean晚实例化到容器中。String[] value() default {};
}

demo(与@Component配合使用)

/*** 事件源*/
@Component
public class EventSource {public EventSource(){System.out.println("事件源创建");}
}/*** 监听类*/
@Component
public class EventTListener {public EventTListener(){System.out.println("监听器创建");}
}//测试类:
@Configuration
@ComponentScan(basePackages = "dependsondemo")
public class SpringConfig {
}

结果:


分析:因为spring默认扫描包时会根据文件在文件夹的位置先后顺序扫描加载,而EventSource 文件位置在EventTListener前面,所以会先加载EventSource 事件源组件。这不符合逻辑。

使用@DependsOn注解:

@Component
@DependsOn(value = {"eventTListener"})
public class EventSource {public EventSource(){System.out.println("事件源创建");}
}

结果:

监听器先创建了。value属性的bean id必须存在,不然会报错。

demo(与Bean注解配合使用)

//要把上面两个组件类上的注解去掉,再使用下面@Configuration
@ComponentScan(basePackages = "dependsondemo")
public class SpringConfig {@Bean@DependsOn(value = {"eventListener"})public EventSource eventSource(){return new EventSource();}@Beanpublic EventTListener eventListener(){return new EventTListener();}
}

结果:
如果不加@DependsOn注解的话,就会先创建事件源,如果加了(如上代码),就会先创建监听器。

@DependsOn注解详解相关推荐

  1. 26.SpringBoot事务注解详解

    转自:https://www.cnblogs.com/kesimin/p/9546225.html @Transactional spring 事务注解 1.简单开启事务管理 @EnableTrans ...

  2. mybatis注解详解

    mybatis注解详解 首 先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下 (如果你使用maven,则 ...

  3. 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  4. spring-boot注解详解(一)

    spring-boot注解详解(一) @SpringBootApplication @SpringBootApplication = (默认属性)@Configuration + @EnableAut ...

  5. Spring零配置之@Configuration注解详解

    转载自 Spring零配置之@Configuration注解详解 @Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件,这也是Spring的核心文件,而 ...

  6. Spring Boot注解详解

    文章目录 使用注解的优势 注解详解(配备了完善的释义) 注解列表如下 JPA注解 springMVC相关注解 全局异常处理 项目中具体配置解析和使用环境 使用注解的优势 采用纯java代码,不在需要配 ...

  7. 【SpringBoot 】SpringBoot注解详解

    [SpringBoot ]SpringBoot注解详解 一.注解(annotations)列表  @SpringBootApplication:包含了@ComponentScan.@Configura ...

  8. java method 注解_JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...

  9. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

最新文章

  1. XML读取 java
  2. startsWith(),endsWith()的作用,用法,判断字符串a 是不是以字符串b开头或结尾
  3. 内存管理(链表,指针操作,繁琐)
  4. windows mobile+webservice+mysql
  5. OpenGL uniform变量赋值的三种方法
  6. batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程
  7. python可变类型和不可变深浅拷贝类型_python3笔记十四:python可变与不可变数据类型+深浅拷贝...
  8. java判断端口是否可用
  9. web文件被更改crawlergo怎么解决_hscan:一款集成crawlergo和xray的src漏洞挖掘利器
  10. gpu opencl 向量加_【Embedding】GloVe:大规模语料中快速训练词向量
  11. UI 设计常用尺寸规格
  12. linux windows拷贝文件,把linux上的文件拷贝到windows下
  13. 数据库设计——关系数据理论(超详细)
  14. 使用paython制作简单贺卡
  15. java xml 查询_java对xml进行查询操作代码
  16. 30系显卡安装tensorflow-gpu1.15
  17. 老子《道德经》里的投资之道
  18. 【技术管理】管理核心五要素 - 学习笔记
  19. html 表格自动排序,jQuery html表格排序插件tablesorter使用方法详解
  20. [IMWeb训练营]-团队作业

热门文章

  1. 死亡细胞读取外部存档文件
  2. 数字化精准会员营销 助消费品连锁企业提升转化
  3. JavaScript 循环语句
  4. Arm A-profile feature names
  5. 关于Touch Panel AA区要做外扩的原因
  6. jmeter分布式环境搭建
  7. 动态规划-电路布线问题
  8. Python小游戏-坦克大战(tank war)
  9. C# 妈妈再打我一下生成器
  10. freemarker转PDF,支持分页,增加页眉页脚