SpringBoot使用@Autowired为多实现的接口注入依赖
作者:甘甘甘甘甘甘甘
这篇文章主要介绍了SpringBoot使用@Autowired为多实现的接口注入依赖,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
使用@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; //正常启动
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。