据我所知,使用@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?
答案 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);
}
}