假设我有一个使用Spring框架的Maven项目。 Maven项目本身有三个模块:common
,component_a
和component_b
。让我们说common
定义一个带有属性listeners
的事件监听器bean,它是监听事件的所有内容的列表。监听器在component_a
和component_b
模块中定义。
总结:
应用上下文-component_a.xml:
<beans>
<bean id="someListener" class="com.whatever.component_a.SomeListener"/>
<bean id="anotherListener" class="com.whatever.component_a.AnotherListener"/>
</beans>
应用上下文-component_b.xml:
<beans>
<bean id="yetAnotherListener" class="com.whatever.component_b.YetAnotherListener"/>
</beans>
应用上下文-common.xml:
<beans>
<bean id="eventListener" class="com.whatever.common.EventListenerImpl">
<property name="listeners">
<list>
<ref bean="someListener"/>
<ref bean="anotherListener"/>
<ref bean="yetAnotherListener"/>
</list>
</property>
</bean>
</beans>
(我想我的格式就在这里......但如果我没有,请原谅我)
我的问题是,现在common
依赖于两个component_*
模块,而不是相反。我的common
模块不再正确构建,因为我的集成测试无法在没有其他模块的情况下正确创建容器。
因此,鉴于我的eventListener
需要有一个包含所有侦听器的列表这一事实,使用什么样的好模式可以使我的模块在构建/测试期间保持独立?
我可以想到一些模式:
eventListener
上下文setEventListener()
打电话,记得打电话
eventListener.addListener(this);
但我很好奇Spring是否有任何内置的方法可以做得更好......
答案 0 :(得分:0)
您可以做的是在主模块中自动装配一个监听器列表。然后,每个其他模块可以提供此接口的实现和适当的componentscan / xml声明。
Mainmodule :(伪代码)
@Service
ListenerService {
@Autowire
List<ListenerIntf> listeners;
public handleListeners() {
foreach listeners {
listener.onEvent();
}
}
}
第1单元:
@Component
@Order // if desired
Listener1 implements ListenerIntf {
public onEvent();
}