@Bean与工厂模式
2021-01-24 本文已影响0人
supremecsp
之前提到过几种工厂模式的变种,今天再介绍一种利用@Bean和Map来实现工厂模式的方法
首先要有一个抽象类/接口
public abstract class BaseNoticeHandler<T> {
public abstract T getMessage(String data);
/**
* topic 为该处理器绑定的topic
* @return
*/
public abstract String topic();
}
然后基于此接口得到两个实现类(实现类交由IOC容器托管)
@Component
public class BaseNoticeHandlerTest1 extends BaseNoticeHandler<String> {
@Override
public String getMessage(String data) {
return "BaseNoticeHandlerTest1";
}
@Override
public String topic() {
return "BaseNoticeHandlerTest1";
}
}
@Component
public class BaseNoticeHandlerTest2 extends BaseNoticeHandler<String> {
@Override
public String getMessage(String data) {
return "BaseNoticeHandlerTest2";
}
@Override
public String topic() {
return "BaseNoticeHandlerTest2";
}
}
然后设计配置类,使用@bean对配置类进行初始化工厂,参数Autowired和List是重点
@Component
public class NoticeConfiguration {
@Bean(name = "noticeFactory", initMethod = "init")
public NoticeFactory noticeFactoryStartup(@Autowired(required = false) List<BaseNoticeHandler> handlers) {
NoticeFactory noticeFactory = new NoticeFactory(handlers);
return noticeFactory;
}
}
最后创建工厂类,将数据填充进Map
public class NoticeFactory {
private Map<String,BaseNoticeHandler> map;
private List<BaseNoticeHandler> handlers;
public NoticeFactory(List<BaseNoticeHandler> handlers) {
this.handlers = handlers;
}
public void init(){
if(handlers!=null){
map= new HashMap<>();
handlers.forEach(e->{
map.put(e.topic(),e);
});
}
}
}
这样就可以根据不同的topic拿到相应的BaseNoticeHandler了