@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了

上一篇 下一篇

猜你喜欢

热点阅读