@DependsOn 应用场景:显性标记所依赖的Bean SpringBootJava技术
- 创建时间:2023-03-03 / 最新修改时间:2023-03-04 10:24:01
- 1031
- 0
转载请注明本文出处:http://limpire.cn/artifact/programming/java/217.html
@DependsOn 应用场景:显性标记所依赖的Bean
虽然Springboot会自动按顺序逻辑先实例所依赖的类成为bean.
例如:
@Component
public class A{
@Autowired
private B b;
//...
}
当springboot实例A时会先实例A所依赖的B,所以一般情况下我们不需要为A添加 @DependsOn
注解.
考虑以下@DependsOn
的应用场景
现在我们多了一个C类,实现ApplicationContextAware
接口,使其获的ApplicationContext
实例,C依赖A,但是A并不是用@Autowired
获取注入实例.而是而是使用ApplicationContext.getBean
方法
@Component
public class C implements ApplicationContextAware {
private A a;
@Override
public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException {
if(this.a == null){
this.a = applicationContext.getBean(A.class);//获取bean
}
}
//....
}
如果此时你启动你的项目,有可能你会发现程序彪红.说是创建bean C 错误,因为找不到A 的bean.
错误原因
因为依赖 a 并不是使用注解注入,而是使用 ApplicationContext.getBean
.所以导致springboot没办法判断A和C之间的先实例谁.这就导致找不到Abean的原因.
解决方法
在C类中添加注解 @DependsOn("a")
即可. springboot会解析到@DependsOn 注解,在实例C之前先去实例A.
@Component
@DependsOn("a") //重点
public class C implements ApplicationContextAware {
private A a;
@Override
public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException {
if(this.a == null){
this.a = applicationContext.getBean(A.class);//获取bean
}
}
//....
}
当然也可以使用@Order
注解分别为A和C指定实例的优先顺序.但是这么做并没有使用 @DependsOn
好.如果项目大量用到 @Order
,项目后期维护是个很大的问题.