我可以使用@PostConstruct注释的方法获取所有bean吗?

时间:2019-12-19 15:54:42

标签: java spring

据我所知,使用@PostConstruct注释的方法将在其bean初始化后执行。

那么我可以用这种方法得到所有的豆吗? 这样...

@CustomAnnotation
public class Foo {
}

@Service
public class TestBean {
   @Autowired
   private Application context;

   @PostContruct
   public void init() {
      // get all beans annotated with @CustomAnnotation
      context.getBeansWithAnnotation(CustomAnnotation.class);
      // to do something...
   }
}

如果TestBean在Foo之前​​初始化,那么是否可以在init()中检测到Foo?

1 个答案:

答案 0 :(得分:1)

对于单例bean,Spring初始化至少有两个不同的步骤。

在创建实际的单例bean实例并调用您的@PostConstruct方法之前,bean工厂将读取所有可用配置(例如XML文件,Groovy脚本,@Configuration类等)并注册所有遇到的bean定义。

getBeansWithAnnotation()应该找到一个Foo bean,如果不是根据它的bean定义创建的,那么在您在@PostConstrust中请求它时将不创建它。您可以尝试使用@DependsOn强制这种情况,但是它可能导致循环依赖问题:

@Component
@DependsOn("testBean")
@CustomAnnotation
public class Foo {
}

@Service("testBean")
public class TestBean {

   @Autoware
   private Application context;

   @PostContruct
   public void init() {
      context.getBeansWithAnnotation(CustomAnnotation.class);
   }
}