2016-07-18 12 views
0

私はアプリケーションが2つのプロジェクト(UIとデータ)で構成されています。データプロジェクトでは、私は、XMLアプリケーションコンテキストに春の豆を追加しました:Beanが定義された後のSpring Beanの注入 - 注入の特性

<bean id="mail-notification-service" class="com.test.DefaultEmailNotificationManager"> 
    </bean> 

このマネージャーは、リクエストに応じて通知を送信し、パラメータは、単純な列挙型とパラメータオブジェクトを使用します(クラスのみを使用し、どちらもデータプロジェクトで)IEmailGeneratorを選択し、電子メールを送信するために使用します。

マネージャーが定義されているようなもの:

public class DefaultEmailNotificationManager implements IEmailNotificationManager { 
    public MailResult sendEmail(EmailType type) { .. } 
    public void register(IEmailGenerator generator) { .. } 
} 

public interface IEmailGenerator { 
    public EmailType getType(); 
} 

トラブルは発生器はUIプロジェクトで定義されている、であるので、彼らは改札ページクラス、リクエストサイクル、およびアプリケーション・リソースを手に入れるようなことを行うことができます。したがって、データプロジェクトのapplicationContext内のBeanにそれらを追加して、データプロジェクトとUIプロジェクトの両方の他のモジュールがそれらを使用できるようにすることはできません。

ような何かを行うにUIプロジェクトのApplicationContextの中にどのような方法があります:私は手動でWicketApplication.init方法で一緒に豆を結び付けることができますが、よりエレガントなものを好むだろう

<bean id="exclusionNotifier" class="com.test.ui.ExclusionEmailNotifier"/> 
<bean id="modificationNotifier" class="com.test.ui.ModificationEmailNotifier"/> 

<call-method bean-ref="mail-notification-service" method="register"> 
    <param name="generatorImplementation", ref="exclusionNotifier"/> 
</call-method> 

<call-method bean-ref="mail-notification-service" method="register"> 
    <param name="generatorImplementation", ref="modificationNotifier"/> 
</call-method> 

が。誰もこれのような何かをしましたか?春に事前に4.1.4

感謝を使用して

<bean id="mail-notification-service" 
     class="com.test.DefaultEmailNotificationManager" 
     init-method="init" 
     autowire="byType" /> 

UIのApplicationContextの:

public class DefaultEmailNotificationManager implements IEmailNotificationManager { 
    private Collection<IEmailGenerator> generators; 
    public void init() { 
    for(IEmailGenerator g : generators) { 
     register(g); 
    } 
    } 
    public void setGenerators(Collection<IEmailGenerator> generators) { 
    this.generators = generators; 
    } 
    public MailResult sendEmail(EmailType type) { .. } 
    private void register(IEmailGenerator generator) { .. } 
} 

データのApplicationContextの(春のドキュメントでInitialization callbacksを参照)(例えばautowire="byType"を使用)、init-methodを使用して、右豆の建設後にそれらを登録mail-notification-service Beanに

答えて

1

を注入ジェネレータ:

<bean id="exclusionNotifier" class="com.test.ui.ExclusionEmailNotifier"/> 
<bean id="modificationNotifier" class="com.test.ui.ModificationEmailNotifier"/> 
+0

こんにちは、お返事ありがとうございます。私は試しましたが、initメソッドでNPEを取得しました - ジェネレータは設定されていません。 – fancyplants

+1

私は答えを更新しました。 'generators'フィールドのsetterベースの注入を使用します。 –

+0

ありがとうございました。春の文書では、これはここで行うことができるとしか言いません:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-autowire - それ以外の場合は、複数のBeanが一致すると失敗します。リンクのテーブル7.2でも、ガイドがそれ以降の段落でそれ自体を修正する前に、 – fancyplants

関連する問題