Spring bean 注入 - 在定义 bean 后注入属性

Spring bean injection - inject properties after bean has been defined

我有一个由 2 个项目组成的应用程序 - UI 和数据。在数据项目中,我向 xml 应用程序上下文添加了一个 spring bean:

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

此管理器根据请求发送通知,参数使用简单的枚举和参数对象(两者仅在数据项目中使用 类)到 select IEmailGenerator 并使用它发送电子邮件。

经理的定义如下:

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

public interface IEmailGenerator {
  public EmailType getType();
}

问题是,生成器是在 UI 项目中定义的,因此它们可以执行诸如获取 wicket 页面 类、请求周期和应用程序资源等操作。因此,我无法将它们添加到数据项目的 applicationContext 中的 bean,以便数据和 UI 项目中的其他模块可以使用它们。

在 UI 项目的 applicationContext 中是否有任何方法可以执行以下操作:

<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>

我可以在 WicketApplication.init 方法中手动将 bean 绑定在一起,但我更喜欢更优雅的方法。有人做过这样的事情吗?

使用 Spring 4.1.4

提前致谢。

将生成器注入 mail-notification-service bean(例如使用 autowire="byType")并在 bean 构建后立即使用 init-method 注册它们(参见 Spring 文档中的 Initialization callbacks )

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:

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

UI 的 applicationContext:

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