我无法在Spring中找到一个简洁的方法来实现这一点 - 想象一下我有一个监听消息的类:
@Component
public class MessageReceiver {
private List<MessageHandler> handlers = new ArrayList<>();
public void receiveMessage(Message m) {
for(MessageHandler handler: handlers) {
handler.process(m);
}
}
public void registerMessageHandler(MessageHandler handler) {
handlers.add(handler);
}
}
基本上,我希望能够定义多个MessageHandler
bean并自动注册MessageReceiver
。我不想在某个地方维护MessageHandler
的列表 - 我只是喜欢Spring在上下文中找到任何内容(可能注释为@Bean
或@Component
)并拥有它们在布线过程中调用registerMessageHandler()
方法。
最好的方法是什么?
答案 0 :(得分:0)
您是否考虑过使用Spring中已包含的事件发布机制?
ApplicationEventPublisher
可以是@Autowired
,如果您使用的是Spring 4.2或更新版本,则Spring将连接任何实现@Component
的{{1}}或使用ApplicationListener<T>
注释的方法。
各种Spring组件使用此功能,例如Spring安全性来广播事件,例如在用户进行身份验证时。
您可以阅读有关此here
的信息修改强> 如果您不想使用内置消息机制,您可以使用相同的自动检测原则构建自己的消息机制。
Spring的当前版本允许您@EventListener
基于类型的bean列表,如果所有@AutoWire
实例都是bean,那么它看起来像这样
MessageHandler
如果您使用的是不支持自动装配集合的Spring版本,那么您应该实现@Component
public class MessageReceiver {
private final List<MessageHandler> handlers;
@Autowired
public MessageReceiver(List<MessageHandler> handlers) {
this.handlers = handlers;
}
public void receiveMessage(Message m) {
for (MessageHandler handler : handlers) {
handler.process(m);
}
}
}
以获取对ApplicationContext的引用,因此您可以调用ApplicationContextAware
来获取所有MessageHandler。