2012-12-12 25 views
7

私はBeanのインスタンス化の順序付けが重要な問題に遭遇しました。現在、下のBean3はDBベースのキャッシュput操作を実行し、Bean 1はProxy Bean2を使用して新しく作成されたキャッシュに対してクエリを実行します。 bean1がインスタンス化される前、つまりSpringコンテナが起動する前に、Bean3とBean 2が完全にインスタンス化されることが優先されます。これらのBeanは個別のJARSにあり、Bean1へのBean1参照はAutowiredを使用していません。代わりに、サービスロケータが参照を与えています。私たちはSpring 2.5.2を使用しており、Beanのインスタンス化にはXMLを使用していません。どんな助けにも感謝!Spring 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

コンストラクタベースのオートワイヤリングを使用していますか? – Scott

+0

autowiringのために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; 
    } 
} 

http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s07.html

私はこれが役に立てば幸いここで読むの詳細情報については、あなたのポストプロセッサ

<context:component-scan base-package="some.package" /> 
<bean class="some.package.MyBeanPostProcessor" 

約春を告げることを忘れないでください。

0

多分あなたのhomegrew春のサービスロケータあなたがREADY_FLAGと信号「springready」を変更するContextRefreshedEventを聞くことができるほか

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

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

      ... 

     } finally { 
      l.unlock(); 
     } 

以下のような信号を必要とする

+0

何らかの理由で私たちが使用しているコードは共有できませんが、 – farmer1992

関連する問題