4

SpringBeanと他の通常のクラスの両方がSpringアプリケーションコンテキストにアクセスできることがわかります。

なぜクラスがSpringコンテキストを処理しなければならないのか疑問に思います。私の理解では、メインの方法では、アプリケーションをブートストラップし、その時点からのすべてがSpringによって配線されます。

その場合は、メインメソッドをApplicationContextが必要な唯一の場所にする必要があります。作業を完了するためにSpringコンテキストが必要な他の本物のケースは何ですか?

4

2 に答える 2

4

ApplicationContext通常、Beanは直接アクセスする必要はありません。

ただし、直接アクセスが必要な場合があります。例えば:

  • 実行時に名前で識別されるBeanにアクセスするには、次のようにします。

    class MyClass implements ApplicationContextAware {
        ...
        public void execute(String actionName) {
            Action action = applicationContext.getBean(actionName);
            action.execute();
        }
        ...
    }
    
  • 実行時にスコープ付きBeanのconstuctorにカスタム引数を渡すにはprototype

    Bean bean = applicationContext.getBean("myBean", "foo", "bar");
    

    Beanのコンストラクターが実行時にカスタム引数を渡す必要がない場合は、ObjectFactory<Bean>代わりに注入できることに注意してください。

  • を使用してサードパーティオブジェクトの自動配線をトリガーしAutowireCapableBeanFactoryます。

于 2012-07-21T06:56:14.343 に答える
0

実際、そのようなユースケースはたくさんあります。特定のサービスBeanからアクセスする必要があるオーセンティケータークラスを作成するとします。これで、オーセンティケータークラスはSpringコンテキストを介して既に構成されています。では、どのようにしてそのBeanにアクセスしますか?答えは、SpringApplicationContextを介したものです。

class MyClass implements ApplicationContextAware {

    private ApplicationContext context;

    @Override
    void setApplicationContext(ApplicationContext context) throws BeansException {
        this.context = context;
    }

    public void execute() {
        Authenticator authenticator = context.getBean("authenticator", Authenticator.class);
        if (!authenticator.authenticate()) {
            //do some stuff
        } else {
            //do some other stuff
        }
   }
}

アプリケーションコンテキスト以外の方法では、構成されたBeanにアクセスできないことに注意することが重要です。また、別のApplicationContextをインスタンス化することは、すべての構成を繰り返すため、答えではありません。

于 2012-07-21T03:52:44.763 に答える