@DependsOn注解详解
定义/作用
@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注解详解相关推荐
- 26.SpringBoot事务注解详解
转自:https://www.cnblogs.com/kesimin/p/9546225.html @Transactional spring 事务注解 1.简单开启事务管理 @EnableTrans ...
- mybatis注解详解
mybatis注解详解 首 先当然得下载mybatis-3.0.5.jar和mybatis-spring-1.0.1.jar两个JAR包,并放在WEB-INF的lib目录下 (如果你使用maven,则 ...
- 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解
随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...
- spring-boot注解详解(一)
spring-boot注解详解(一) @SpringBootApplication @SpringBootApplication = (默认属性)@Configuration + @EnableAut ...
- Spring零配置之@Configuration注解详解
转载自 Spring零配置之@Configuration注解详解 @Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件,这也是Spring的核心文件,而 ...
- Spring Boot注解详解
文章目录 使用注解的优势 注解详解(配备了完善的释义) 注解列表如下 JPA注解 springMVC相关注解 全局异常处理 项目中具体配置解析和使用环境 使用注解的优势 采用纯java代码,不在需要配 ...
- 【SpringBoot 】SpringBoot注解详解
[SpringBoot ]SpringBoot注解详解 一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configura ...
- java method 注解_JAVA 注解详解及简单实例
JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档 这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
最新文章
- XML读取 java
- startsWith(),endsWith()的作用,用法,判断字符串a 是不是以字符串b开头或结尾
- 内存管理(链表,指针操作,繁琐)
- windows mobile+webservice+mysql
- OpenGL uniform变量赋值的三种方法
- batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程
- python可变类型和不可变深浅拷贝类型_python3笔记十四:python可变与不可变数据类型+深浅拷贝...
- java判断端口是否可用
- web文件被更改crawlergo怎么解决_hscan:一款集成crawlergo和xray的src漏洞挖掘利器
- gpu opencl 向量加_【Embedding】GloVe:大规模语料中快速训练词向量
- UI 设计常用尺寸规格
- linux windows拷贝文件,把linux上的文件拷贝到windows下
- 数据库设计——关系数据理论(超详细)
- 使用paython制作简单贺卡
- java xml 查询_java对xml进行查询操作代码
- 30系显卡安装tensorflow-gpu1.15
- 老子《道德经》里的投资之道
- 【技术管理】管理核心五要素 - 学习笔记
- html 表格自动排序,jQuery html表格排序插件tablesorter使用方法详解
- [IMWeb训练营]-团队作业