我在项目的主模块中有一个由 Spring 管理的接口的实现列表:
<bean id="mail-properties-service" class="com.mail.wrapper.MailPropertiesWrapper" init-method="flushProperties">
<property name="propertiesService" ref="application-properties-service"/>
</bean>
<bean id="record-properties-service" class="com.record.wrapper.RecordPropertiesWrapper" init-method="flushProperties">
<property name="propertiesService" ref="application-properties-service"/>
</bean>
<bean id="admin-properties-service" class="com.admin.wrapper.SystemAdminPropertiesWrapper" init-method="flushProperties">
<property name="propertiesService" ref="application-properties-service"/>
</bean>
<bean id="user-properties-service" class="com.user.wrapper.UserAdminPropertiesWrapper" init-method="flushProperties">
<property name="propertiesService" ref="application-properties-service"/>
</bean>
<bean id="email-campaign-properties-service" class="com.email.wrapper.EmailCampaignPropertiesWrapper" init-method="flushProperties">
<property name="propertiesService" ref="application-properties-service"/>
</bean>
<util:list id="properties-wrappers" value-type="com.wrapper.AbstractPropertiesWrapper">
<ref bean="mail-properties-service"/>
<ref bean="record-properties-service"/>
<ref bean="admin-properties-service"/>
<ref bean="user-properties-service"/>
<ref bean="email-campaign-properties-service"/>
</util:list>
一般包装器管理器使用此列表在属性更改时发出清晰的缓存指令以及其他内容。
我也有项目的扩展,例如SOP模块。 在 SOP 模块中的 applicationContext.xml 文件中的某个地方有这样的东西会很好:
<bean id="sop-properties-service" class="com.sop.wrapper.SOPPropertiesWrapper" init-method="flushProperties">
<property name="propertiesService" ref="application-properties-service"/>
</bean>
<bean ref="properties-wrappers">
<add-item ref="sop-properties-service"/>
</bean>
这样,主项目配置不必知道 SOP 模块,模块可以将其包装器添加到包装器列表中。 有什么办法可以做到这一点吗?
提前谢谢。
对于那些处于类似情况的人,我找到了一个简单的解决方案:使用 Spring Autowirering,它将在配置中找到给定接口或类的所有实现,并将它们放入数组中。
- 在 xml(或
@Component
)中定义属性类,如问题中的示例所示。 -
在包装管理器中,添加以下代码。
@Autowired protected AbstractPropertiesWrapper[] wrappers;
wrappers
数组将包含所有包装器,包括 SOP 包装器,主模块不需要了解 SOP 项目的任何信息。