@Bean与工厂模式

之前提到过几种工厂模式的变种,今天再介绍一种利用@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了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容