zoukankan      html  css  js  c++  java
  • Spring学习总结(8)-接口多个实现类的动态调用

    需求描述:当一个接口有2个以上的实现类时,调用方需要根据参数选择只其中一个实现类

    Spring版本:5.1.8.RELEASE

    1. 接口和实现类

    /**
     * 接口
     */
    public interface OrderInfoDao {
    
        void queryOrderList();
    }
    
    
    /**
     * 实现类A
     */
    @Component
    public class OrderInfoDaoAImpl implements OrderInfoDao {
    
        @Override
        public void queryOrderList() {
            System.out.println("Dao A queryOrderList");
        }
    }
    
    /**
     * 实现类B
     */
    @Component
    public class OrderInfoDaoBImpl implements OrderInfoDao {
    
        @Override
        public void queryOrderList() {
            System.out.println("Dao B queryOrderList");
        }
    }

      现在要求Service层要根据参数输入A或B动态选择实现类。

    2. 使用ApplicationContextAware接口实现

    @Component
    public class OrderInfoServiceImpl implements ApplicationContextAware {
    
        private ApplicationContext applicationContext;
    
        public void query(String username){
            OrderInfoDao dao = null;
            if("A".equals(username)){
                dao = (OrderInfoDao) applicationContext.getBean("orderInfoDaoAImpl");
            }
            else if("B".equals(username)){
                dao = (OrderInfoDao) applicationContext.getBean("orderInfoDaoBImpl");
            }
            dao.queryOrderList();
        }
    
        /**
         * ApplicationContextAware接口的实现类,可以拿到上下文
         * @param applicationContext
         * @throws BeansException
         */
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    }

    3. 使用@Autowired注入Map实现

    @Component
    public class OrderInfoServiceImpl {
    
        /**
         * 用这个方式Spring会在初始化时,自动把OrderInfoDao接口的实现类,全放到Map里
         */
        @Autowired
        private Map<String, OrderInfoDao> map;
    
        public void query(String username){
            // 拼接Dao实现类的名称
            String daoName = "orderInfoDao" + username + "Impl";
            OrderInfoDao dao = map.get(daoName);
            if(dao != null){
                dao.queryOrderList();
            }
        }
    
    }

    4. 测试

    public class OrderInfo1Test {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
            OrderInfoServiceImpl service = context.getBean(OrderInfoServiceImpl.class);
            service.query("B");
        }
    
    }
  • 相关阅读:
    人人学IoT 助学思维导图
    基于netty4.x开发时间服务器
    JAVA实现的截屏程序
    java获取硬盘ID以及MAC地址
    神经网络joone_engin模式识别示范,eclipse
    神经网络/人工智能 开源库
    双目测距
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    一个java 开源神经网络引擎 joone
    用Java开源项目JOONE实现人工智能编程
  • 原文地址:https://www.cnblogs.com/huanshilang/p/12432782.html
Copyright © 2011-2022 走看看