2012-12-12 220 views
7

我遇到了Bean實例化排序很重要的問題。目前下面的Bean3正在運行基於數據庫的緩存放置操作,Bean 1使用代理Bean2針對新創建的緩存進行查詢。在Bean1被實例化之前,即在Spring容器出現之前,Bean3和Bean2的優先級被完全實例化。這些bean在單獨的JARS中,Bean1引用到Bean1中不使用Autowired。相反,服務定位器正在給它一個參考。我們使用Spring 2.5.2,而不是使用XML來實例化bean。任何幫助感謝!Spring bean實例化排序

  • JAR1(Spring項目)

    @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(); 
        } 
    } 
    
+0

您使用基於構造函數的自動裝配嗎? – Scott

+0

我們在JAR1中啓用了自動發現模式以進行自動裝配。 – Noosphere

+0

將Bean1依賴於Bean2(或創建一個依賴關係鏈)是否可行?)Bean1的方法何時被調用? –

回答

1

如果我理解正確的,你想一個信號在應用程序啓動時執行一些邏輯(上下文init)。

如果是這種情況,我建議您使用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

我希望這有助於。

0

也許你homegrew春季服務定位器需要像下面

 Lock l = new ReentrantLock(); 
     Condition springready = l.newCondition(); 

     l.lock(); 
     try { 
      while (READY_FLAG) 
       springready.await(); 

      ... 

     } finally { 
      l.unlock(); 
     } 

除了

你可以聽ContextRefreshedEvent改變READY_FLAG和信號「springready」

+0

我無法分享我們使用的代碼,原因有些,但它就像那樣 – farmer1992

相關問題