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; //正常启动
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java中将MultipartFile和File互转的方法详解
我们在开发过程中经常需要接收前端传来的文件,通常需要处理MultipartFile格式的文件,今天来介绍一下MultipartFile和File怎么进行优雅的互转,需要的朋友可以参考下2023-10-10MyEclipse2018中安装Mybatis generator插件的实现步骤
这篇文章主要介绍了MyEclipse2018中安装Mybatis generator插件的实现步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-02-02Spring Boot集成SpringFox 3.0与Pageable参数处理方法
这篇文章主要介绍了Spring Boot集成SpringFox 3.0与Pageable参数处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-10-10
最新评论