我在项目的主要模块中列出了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 Autowiring,它将在配置中找到给定接口或类的所有实现,并将它们放入数组中。
如问题示例中所示,在xml中定义属性类(或定义为@Component
)。
在包装管理器中,添加以下代码。
@Autowired
protected AbstractPropertiesWrapper[] wrappers;
wrappers
数组将包含所有包装器,包括一个SOP,而主模块不需要知道有关SOP项目的任何信息。