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

网友投稿 2366 2022-11-22

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

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 接口实现http://类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; //正常启动

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:html标题标签 - 六个肥仔白的标题
下一篇:前端如何优化网站性能?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~