2017-05-05 10 views
0

私は、Spring Beanにアクセスして、イベントを発生させ、Spring Beanによって観察されるようにするために、Spring以外で作成されるクラスのインスタンスを持っています。私はSpring Webを使用していないので、私のアプリケーションはSpringブートを介してコマンドラインから実行されています。スプリングブートアプリケーション - 静的コンテキストからBeanを取得

答えて

0

あなたは豆春コンストラクタによって注入することができ、何かのように:

@Service 
class Bean { 
    ... 
} 

class NotBean { 

     private Bean bean; 

     public NotBean(Bean bean) { 
     this.bean = bean; 
     } 

     // your stuff (handle events, etc...) 
} 
+0

私は他のNotBeanがインスタンス化されるか、そのため、私は単にそれをBean参照を渡すことはできません上のコントロールを持っていない... – Walter

+0

あなたはそのNotBeanから延長することはできますか? –

2

あなたが持っている唯一のオプションは、静的メソッドを使用して、アプリケーションのSpringコンテキストを公開することですようで管理されていないオブジェクトSpringはそれを使用して、必要なマネージドBeanへの参照を取得できます。

  1. コンテキストのラッパーで開始します。コンストラクタ内のコンテキストへの参照を必要とする通常のマネージドBeanを作成します。春によって管理されていないオブジェクトにコンテキストへのアクセスを取得し、メソッドを使用してBeanへの参照を取得するために、静的なゲッターを使用し

    @Service 
    class ContextWrapper { 
    
        private static ApplicationContext context; 
    
        @Autowired 
        public ContextWrapper(ApplicationContext ac) { 
         context = ac; 
        } 
    
        public static ApplicationContext getContext() { 
         return context; 
        } 
    
    } 
    
  2. :参照は、静的ゲッターを持つ静的クラスのフィールドに割り当てられ、コンテキストで利用できる:あなたが必要

    SomeBean bean = ContextWrapper.getContext().getBean("someBean", SomeBean.class); 
    // do something with the bean 
    
  3. 最後には、非管理対象オブジェクトへのSpring Beanからの通信チャネルです。例えば、SomeBeanは、管理されていないオブジェクトをパラメータとして受け入れ、将来の使用のために参照をフィールドに格納するセッターを公開することができます。オブジェクトマストは、前述の静的コンテキストアクセサを使用してマネージドBeanへの参照を取得し、その存在をBeanに認識させるためにセッターを使用します。

    @Service 
    class SomeBean { 
    
        // ... your bean stuff 
    
        private SomeClass someclass; 
    
        public void setSomeClass(Someclass someclass) { 
         this.someclass = someclass; 
        } 
    
        private void sendEventToSomeClass() { 
         // communicate with the object not managed by Spring 
         if (someClass == null) return; 
         someClass.sendEvent(); 
        } 
    
    } 
    
+0

コンテキストがヌルでないか完全にロードされていないことを確認するにはどうすればよいですか? getContext()が完全なスプリングコンテキストを返し、その理由を頼りにすることはできますか? – user7294900

+0

Springアプリケーションが起動している場合は、コンテキストを正しく作成する必要があります。あなたが覚えておかなければならない唯一のことは、bean構築がコンテキスト作成の一部であるので、あなたのbeanのコンストラクタで 'getContext()'メソッドを使うべきではないということです。 –

+0

**通常の(非春)クラス**からBeanを取得する場合、春のコンテキストはすでに開始されていると仮定できますか?春のコンテキストがnullでないか、または完全にロードされていないことを確認するためにチェック/関数を追加する必要がありますか? – user7294900

関連する問題