Spring bean实例化排序

时间:2012-12-12 17:56:38

标签: java spring java-ee applicationcontext

我遇到了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();
       } 
    }
    

2 个答案:

答案 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'信号