我遇到了Bean实例化排序很重要的问题。目前,Bean3从下面运行基于数据库的缓存放置操作,Bean 1使用Proxy Bean2查询新创建的缓存。优先级是Bean3和Bean 2在Bean1实例化之前完全实例化,即当Spring容器出现时。这些bean是单独的JARS,Bean2对Bean1的引用不使用Autowired。而是服务定位器给它一个参考。我们使用的是Spring 2.5.2而不是使用XML来实例化bean。任何帮助表示赞赏!
JAR1(春季项目)
@Service ("bean3")
public class Bean3 implements ApplicationListener {
public void onApplicationEvent() {
//load data from DB and populate cache
}
public void getCache(){
//get data from cache
}
}
@Service ("bean2")
public class Bean2 {
@Autowired
private Bean3 bean3;
private void methodA(){
bean3.getCache();
}
}
JAR2(非春季项目)
public class Bean1{
Bean2 bean2 = SpringServiceLocator.getBean("bean2")
public void methodB(){
bean2.methodA();
}
}
答案 0 :(得分:1)
如果我理解正确,你试图在应用程序启动时执行一些逻辑(上下文初始化)。
如果是这种情况,我建议你使用BeanPostProcessor,在应用程序启动时执行任何特殊操作。
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
.. **perform special things**
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
..**perform special things**
return bean;
}
}
不要忘记告诉Spring你的后处理器
<context:component-scan base-package="some.package" />
<bean class="some.package.MyBeanPostProcessor"
有关详细信息,请阅读http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s07.html
我希望这会有所帮助。
答案 1 :(得分:0)
也许你的homegrew Spring Service定位器需要一个如下信号
Lock l = new ReentrantLock();
Condition springready = l.newCondition();
l.lock();
try {
while (READY_FLAG)
springready.await();
...
} finally {
l.unlock();
}
另外
你可以监听ContextRefreshedEvent来改变READY_FLAG并发出'springready'信号