7

我遇到了一个 Bean 实例化排序很重要的问题。当前,下面的 Bean3 正在运行基于数据库的缓存放置操作,而 Bean 1 使用代理 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(非 Spring 项目)

    public class Bean1{  
    Bean2 bean2 = SpringServiceLocator.getBean("bean2")
      public void methodB(){
        bean2.methodA();
       } 
    }
    
4

2 回答 2

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

我希望这有帮助。

于 2013-07-23T16:28:46.393 回答
0

也许您的自制 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”信号

于 2013-01-14T02:46:33.277 回答