zoukankan      html  css  js  c++  java
  • JAVA 工具类Factory

    /**
     * @author yong.liu
     * @date 2020/7/30
     */
    public abstract class AbstractHandlerFactory<T,K extends HandlerSelector <T>> implements HandlerFactory <T,K>, BeanFactoryAware , InitializingBean {
    
        private Map<T, K> serviceMap;
    
        private ConfigurableListableBeanFactory beanFactory;
    
        @Override
        public K getService(T t) {
            return serviceMap.get(t);
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
    
            ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
            Type[] types = pt.getActualTypeArguments();
    
            Class<K> interfaceClazz = (Class<K>)types[1];
    
           // logger.info("可选服务初始化,服务接口为{},默认实现为{}", interfaceClazz.getName(), interfaceClazz.getName());
    
            Map<String, K> serviceBeanMap = beanFactory.getBeansOfType(interfaceClazz);
            serviceMap = new HashMap<T , K>(serviceBeanMap.size());
    
            for (K processor : serviceBeanMap.values()) {
    
                if (!(processor instanceof HandlerSelector)) {
                    throw new RuntimeException("实现类必须实现ProcessorSelector接口!");
                }
                // 如果已经存在相同受理机构的服务,则抛出错误
                HandlerSelector<T> selector = (HandlerSelector)processor;
    
                if (null != serviceMap.get(selector.getType())) {
                    throw new RuntimeException("已经存在Type【" + selector.getType() + "】的服务");
                }
    
                serviceMap.put(selector.getType(), processor);
    
            }
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            if (beanFactory instanceof DefaultListableBeanFactory) {
                this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
            }
        }
    
    }
    
    public interface HandlerSelector<T> {
    
        /**
         * 获取选择器类型
         *
         * @return
         */
        T getType();
    }
    
    public interface HandlerFactory<T, K extends HandlerSelector<T>> {
        /**
         * 获取对应的服务
         *
         * @param t
         * @return
         */
        K getService(T t);
    }
    

    使用:

    public inteface SubsidyStatHandler implements HandlerSelector<String>{
        
       public void dosth()
    
    }
    
    
    @Service
    public class SubsidyStatHandlerFactroy extends AbstractHandlerFactory<Integer, SubsidyStatHandler> {
    
    }
    
  • 相关阅读:
    logging——日志——转载02
    logging——日志——转载03
    c# 整型数据与字符串 的之间互换(原创)
    收到邮件且自动发送到对方提供的邮箱
    学习了1!+...10!
    Outlook 2003 Add in 部署笔记
    学会了调用方法
    c# 属性的作用
    (转)软件的围城,谈高级语言的学习(一位架构师的忠告!)
    常用命令控制行
  • 原文地址:https://www.cnblogs.com/lameclimber/p/14445913.html
Copyright © 2011-2022 走看看