使用 Spring 3.0.x,我遇到了 Bean 初始化方法正在运行的问题,作为它的一部分获取一些信息,然后在另一个线程中(原始 init() 线程等待其他线程完成)尝试根据该信息检索获取一个或多个 Bean。问题是,这些其他的 Bean 也是单例的,还没有被初始化。在 getSingleton() 方法的 DefaultSingletonBeanRegistry 中有一个 synchronized() block 。
问题出现了,我正在尝试获取/初始化一个 Bean,而我当前正在初始化一个 Bean,所以我在 init() 方法中卡住了主线程,而另一个线程试图获取另一个单例 Bean , 并且因为第一个线程有锁而被阻塞。
所以,在我看来,我有 2 个选择:
1) 在完全创建单例之后让 Spring 运行一个方法来执行实际的数据获取和处理 2) 想出传递给的消息,将数据返回给主线程,然后在主线程中处理它们,因为它已经有了监视器锁
想法?想法?我怎样才能让#1 工作?
最佳答案
您是否尝试过实现 InitializingBean界面
class MyBean implements InitializingBean{
@Override
public void afterPropertiesSet(){
// fetch information, etc
}
}
根据文档:
Interface to be implemented by beans that need to react once all their properties have been > set by a BeanFactory: for example, to perform custom initialization...
关于java - Spring单例初始化完成后如何运行方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9106185/