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");
        }
    
    }
  • 相关阅读:
    Java1.0-1.11各个版本的新特性
    Java在ServletContextListener、过滤器、拦截器解决对象无法注入问题
    实验七 Web应用测试
    第四次作业
    实验5
    实验4
    实验3
    把一个英语句子中的单词次序颠倒后输出。例如输入“how are you”,输出“you are how”;
    1. java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;报错问题
    在eclipse中新建maven项目 js,css路径失效问题
  • 原文地址:https://www.cnblogs.com/huanshilang/p/12432782.html
Copyright © 2011-2022 走看看