@DependsOn 应用场景:显性标记所依赖的Bean SpringBootJava技术
  • 创建时间:2023-03-03 / 最新修改时间:2023-03-04 10:24:01
  • 867
  • 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 ,项目后期维护是个很大的问题.


请说:

昵称 Email

评论:

吃不起海鲜就买海鲜味的酱油

回车换行很爽,代表着一个段落或者一个小结的完成,打印出来之后就是一个可触摸的成品.围着这种意境,一起来技术性打酱油.

文章列表
分类目录
友情链接