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");
        }
    
    }
  • 相关阅读:
    Handle( )
    GetFileOpenName()、GetFilesavename
    笔记linux一些常用命令
    Git的简单使用
    express+mongodb+mongoose简单入门
    浅谈node Async异步处理模块
    parse,tryparse区别
    .NET一般处理程序如何获取AJAX传递的参数
    UOJ461 新年的Dog划分【图论,交互】
    UOJ243【UR #16】破坏导蛋【计算几何,分块】
  • 原文地址:https://www.cnblogs.com/huanshilang/p/12432782.html
Copyright © 2011-2022 走看看