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

 更新时间:2021年11月18日 10:04:36   作者:甘甘甘甘甘甘甘  
这篇文章主要介绍了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字符串拼接效率测试过程解析

    Java字符串拼接效率测试过程解析

    这篇文章主要介绍了Java字符串拼接效率测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Spring boot CommandLineRunner启动任务传参实例详解

    Spring boot CommandLineRunner启动任务传参实例详解

    在使用SpringBoot构建项目时,我们通常有一些预先数据的加载,下面这篇文章主要给大家介绍了关于Spring boot CommandLineRunner启动任务传参的相关资料,需要的朋友可以参考下
    2022-06-06
  • Scala入门之List使用详解

    Scala入门之List使用详解

    这篇文章主要介绍了Scala入门之List使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Spring工作原理简单探索

    Spring工作原理简单探索

    这篇文章主要介绍了Spring工作原理简单探索,涉及Springaop与IOC,动态代理静态代理,反射等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Springboot整合Rabbitmq之Confirm和Return机制

    Springboot整合Rabbitmq之Confirm和Return机制

    这篇文章主要介绍了Springboot整合Rabbitmq之Confirm和Return详解,本篇重点进行Confirm 机制和Return 机制的实现和说明,通过实例代码相结合给大家详细介绍,对Springboot整合Rabbitmq相关知识感兴趣的朋友一起看看吧
    2022-02-02
  • Maven分模块开发执行指令失败的问题

    Maven分模块开发执行指令失败的问题

    Maven分模块开发,行指令失败,modules.module[3]‘ specifies duplicate child module maven_dao @ line 29, column 1的问题,本文给大家分享解决方法,感兴趣的朋友跟随小编一起看看吧
    2020-09-09
  • 你真的知道Java中对象的销毁吗

    你真的知道Java中对象的销毁吗

    java自带垃圾回收机制,会自动识别内存中不再会被使用的对象并将其销毁,释放内存,下面这篇文章主要介绍了Java中对象销毁的相关资料,需要的朋友可以参考下
    2021-10-10
  • zookeeper集群搭建超详细过程

    zookeeper集群搭建超详细过程

    这篇文章主要介绍了zookeeper集群搭建超详细过程,本文对zookeeper集群测试通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 深入学习Java 热部署的知识

    深入学习Java 热部署的知识

    对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。,需要的朋友可以参考下
    2019-06-06
  • Java中Runnable与Callable接口的区别详解

    Java中Runnable与Callable接口的区别详解

    这篇文章主要为大家详细介绍了Java中Runnable与Callable接口的区别,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2023-03-03

最新评论