美文网首页
@Bean与工厂模式

@Bean与工厂模式

作者: supremecsp | 来源:发表于2021-01-24 14:02 被阅读0次

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

    相关文章

      网友评论

          本文标题:@Bean与工厂模式

          本文链接:https://www.haomeiwen.com/subject/iadmzktx.html