目录
  • 使用@Autowired为多实现的接口注入依赖
    • 问题描述
    • 方法一:使用@Qualifier限定
    • 方法二:利用@Autowired可以byName匹配Bean的特性
    • 方法三:使用@Primay
  • 一个接口多个实现类的Spring注入
    • 1. 首先, Interface1 接口有两个实现类
    • 2. 通过 @Autowired 和 @Qualifier 配合注入
    • 3. 使用@Resource注入,根据默认类名区分
    • 4. 使用@Resource注入,根据@Service指定的名称区分

使用@Autowired为多实现的接口注入依赖

问题描述

现在有UserRepositoryImpl,需要为其注入依赖。

 @Repository public class UserRepositoryImpl implements UserRepository { @Autowired private JdbcTemplate jdbcTemplate; }

在本项目中的IOC容器中,JdbcTemplate有两个实现。

 @Bean(name="primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate ( @Qualifier("primaryDataSource") DataSource dataSource ) { return new JdbcTemplate(dataSource); } @Bean(name="secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate( @Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } 

方法一:使用@Qualifier限定

在类UserRepositoryImpl中进行修改,通过@Qualifier指定注入依赖的实现。

 @Repository public class UserRepositoryImpl implements UserRepository { @Autowired @Qualifier("primaryJdbcTemplate") private JdbcTemplate jdbcTemplate; }

方法二:利用@Autowired可以byName匹配Bean的特性

将UserRepositoryImpl中将待注入的成员变量的名称修改为IOC容器中Bean的id。在注入依赖时,IOC容器将会按byName的方式为其匹配Bean并且注入依赖。

 @Repository public class UserRepositoryImpl implements UserRepository { @Autowired private JdbcTemplate primaryJdbcTemplate; }

方法三:使用@Primay

为Bean增加@Primary的注解,在@Autowired遇到多实现的接口时,IOC容器会将被@Primary标注的Bean注入。

 @Primary @Bean(name="primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate ( @Qualifier("primaryDataSource") DataSource dataSource ) { return new JdbcTemplate(dataSource); } @Bean(name="secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate( @Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } 

一个接口多个实现类的Spring注入

1. 首先, Interface1 接口有两个实现类

Interface1Impl1 和 Interface1Impl2

Interface1 接口:

 package com.example.service; / * Created by liuzh on 2018-05-29. * 接口1 */ public interface Interface1 { void fun1(); } 

以下是接口的两个实现类,请注意@service注解的使用方式,这里给每个实现类标注了不同的名称,方便在@Resource注入时区别注入

Interface1 接口实现类1:

 @Service("s1") public class Interface1Impl1 implements Interface1 { @Override public void fun1() { System.out.println("接口1实现类 ..."); } public void fun2(){ System.out.println("接口1实现类1 fun2 ..."); } }

Interface1 接口实现类2:

 @Service("s2") public class Interface1Impl2 implements Interface1 { @Override public void fun1() { System.out.println("接口1实现类 ..."); } public void fun2(){ System.out.println("接口1实现类2 fun2 ..."); } } 

2. 通过 @Autowired 和 @Qualifier 配合注入

 @Autowired @Qualifier("interface1Impl1") Interface1 interface1; //正常启动

3. 使用@Resource注入,根据默认类名区分

 @Resource(name = "interface1Impl1") Interface1 interface1; //正常启动

4. 使用@Resource注入,根据@Service指定的名称区分

 @Resource(name = "s1") Interface1 interface1; //正常启动

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本网站。

您可能感兴趣的文章:

  • SpringBoot @Autowired注入为空的情况解读
  • SpringBoot中@Autowired生效方式详解
  • springboot 静态方法中使用@Autowired注入方式
  • SpringBoot @Autowired注解注入规则介绍
  • springBoot Junit测试用例出现@Autowired不生效的解决
  • 浅谈SpringBoot @Autowired的两种注入方式
  • 解决SpringBoot 测试类无法自动注入@Autowired的问题
  • 解决Springboot @Autowired 无法注入问题
  • SpringBoot注解篇之@Resource与@Autowired的使用区别