私はアプリケーションが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に
こんにちは、お返事ありがとうございます。私は試しましたが、initメソッドでNPEを取得しました - ジェネレータは設定されていません。 – fancyplants
私は答えを更新しました。 'generators'フィールドのsetterベースの注入を使用します。 –
ありがとうございました。春の文書では、これはここで行うことができるとしか言いません:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-autowire - それ以外の場合は、複数のBeanが一致すると失敗します。リンクのテーブル7.2でも、ガイドがそれ以降の段落でそれ自体を修正する前に、 – fancyplants