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"/>
我有一个由 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"/>