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");
    }

}

猜你喜欢

转载自www.cnblogs.com/huanshilang/p/12432782.html
今日推荐