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

目录
  • 使用@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;    //正常启动

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

(0)

相关推荐

  • Spring中@Autowired和@Qualifier注解的3个知识点小结

    目录 @Autowired和@Qualifier注解的3个知识点 1.@Autowired自动注入 2.如果想直接使用byName的注入方式 3.如果没有指定Spring创建的bean的名称 @Autowired @Qualifier @Resource的区别 1.@Autowired 2.@Qualifier 3.@Resource @Autowired和@Qualifier注解的3个知识点 1.@Autowired自动注入 默认是先以byType的方式,如果有多个类型相匹配,那么使用byNa

  • Spring为什么不推荐使用@Autowired注解详析

    目录 引言 Spring的三种注入方式 属性(filed)注入 构造器注入 set方法注入 属性注入可能出现的问题 问题一 问题二 问题三 spring建议 使用@Resource代替@Autowired 使用@RequiredArgsConstructor构造器方式注入 总结 引言 使用IDEA开发时,同组小伙伴都喜欢用@Autowired注入,代码一片warning,看着很不舒服,@Autowired作为Spring的亲儿子,为啥在IDEA中提示了一个警告:Field injection i

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

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

  • C# 利用Autofac批量接口注入依赖的问题小结

    背景: 本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式.此写法给我的感觉就是 非常的 优雅 ,优雅永不过时.关于接口注入具体是什么可以最后推荐的地址.话不多说,开撸. 安装: 打开nuget管理工具,将我下面标红色的包都进行安装(注:千万别安装错了,按照名字不差的安装) 使用: 我们新建一个DI的文件夹,在文件夹中增加一个接口:IDependency.cs namespace Coldairarrow { /// <summary> /// 注

  • SpringBoot基于redis自定义注解实现后端接口防重复提交校验

    目录 一.添加依赖 二.代码实现 三.测试 一.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.4.RELEASE</version> </dependency> <dependency> <

  • SpringBoot中@Autowired生效方式详解

    目录 前言 正文 注册AutowiredProcessor的BeanDefinition 实例化AutowiredProcessor 创建bean时进行注入 后记 前言 @Component public class SimpleBean3 { @Autowired private SimpleBean simpleBean; } @Autowired修饰的字段会被容器自动注入.那么Spring Boot中使如何实现这一功能呢? AutowiredAnnotationBeanPostProces

  • SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码

    目录 为什么要限流 限流背景 实现限流 1.引入依赖 2.自定义限流注解 3.限流切面 4.写一个简单的接口进行测试 5.全局异常拦截 6.接口测试 为什么要限流 系统在设计的时候,我们会有一个系统的预估容量,长时间超过系统能承受的TPS/QPS阈值,系统有可能会被压垮,最终导致整个服务不可用.为了避免这种情况,我们就需要对接口请求进行限流. 所以,我们可以通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统或避免不必要的资源浪费,一旦达到限制速率则可以拒绝服务.排队或等待

  • SpringBoot连接MySQL获取数据写后端接口的操作方法

    1.新建项目 2.添加依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <dependency> <groupId>org.springframework</groupId>

  • SpringBoot 项目使用hutool 工具进行 http 接口调用的处理方法

    目录 写作目的 hutool简单介绍 实践 引用依赖 post get 请求 end 写作目的 在实际的开发过程中一个互联网的项目来说 ,有可能会涉及到调用外部接口的实际业务场景,原生的比如使用httpclient 也能够达到自己想要的结果处理 ,但是其实在实际开发的时候如果没有使用过类似的技术处理的话或多祸首可能会遇见问题所以这里我简单记录一下今天使用到的工具类: hutool 进行接口http 请求调用处理. hutool简单介绍 关于hutool工具包其实本人使用的不多哈 ,这里面其实封装

  • springboot中shiro使用自定义注解屏蔽接口鉴权实现

    目录 传统做法 使用自定义注解屏蔽接口鉴权 拓展内容:关于spring中的派生注解 传统做法 spring boot整合shiro后,如果某些接口需要屏蔽鉴权的话(比如登录)接口,我们一般会这么做: @Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilterFactoryBean(org.apache.shiro.mgt.SecurityManager securityManager) { ShiroFil

  • mapper接口注入两种方式详解

    这篇文章主要介绍了mapper接口注入两种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.使用模板方式: <!--使用模板类实现mybatis --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFacto

  • 关于@Autowired注入依赖失败的问题及解决

    目录 @Autowired注入依赖失败的问题 1.现象描述 2.问题分析 3.解决方案 @Autowired依赖注入为啥不推荐了 警告内容 依赖注入的方式 @Autowired是干啥的 @Inject是干啥的 @Resource是干啥的 spring建议 @Autowired注入依赖失败的问题 1.现象描述 在Spring Boot项目中使用@Autowired注解,程序启动时发现服务启动失败,提示: Description: Field metrics in com.be.fallback.s

随机推荐