7

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

  • 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

私の理解が正しければ、アプリケーションの起動時に何らかのロジックを実行しようとしています (context 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を参照してください。

これが役立つことを願っています。

于 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 に答える