Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后】等方法控制多实现的依赖注入(转)
@Order 可以作用在类、方法、属性。 影响加载顺序。 若不加,spring的加载顺序是随机的。
@Primary 当注入bean冲突时,以@Primary定义的为准。
@Order是控制配置类的加载顺序,还能控制List<XXX> 里面放的XXX的实现注入的顺序,下面介绍使用Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后,参考:https://jira.spring.io/browse/SPR-10548】控制多实现的依赖注入,因为在项目中可能会遇到接口多实现的问题,那么要具体注入那个接口的实现就需要我们来控制了,那么如何控制,请看下面的例子示例:
示例一:
public interface XStrategyService {
}
@Service
@Priority(1)
public class XStrategyServiceImpl01 implements XStrategyService {
}
@Service
@Priority(2)
public class XStrategyServiceImpl02 implements XStrategyService {
}
@Autowired
private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择
示例二:
public interface XStrategyService {
}
@Service
@Primary
public class XStrategyServiceImpl01 implements XStrategyService {
}
@Service
public class XStrategyServiceImpl02 implements XStrategyService {
}
@Autowired
private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择
示例三:
public interface XStrategyService {
}
@Service
@Order(1)
@Primary
public class XStrategyServiceImpl01 implements XStrategyService {
}
@Service
@Order(2)
public class XStrategyServiceImpl02 implements XStrategyService {
}
@Autowired
private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择
注意,下面的是不能注入的,就是单独使用@Order(1), @Order(2) Order注解仅仅用于控制组件的加载顺序,不能控制注入优先级
public interface XStrategyService {
}
@Service
@Order(1)
public class XStrategyServiceImpl01 implements XStrategyService {
}
@Service
@Order(2)
public class XStrategyServiceImpl02 implements XStrategyService {
}
@Autowired
private XStrategyService xStrategyService; // Error
一些其他方法完成多实现的注入,使用@Qualifier限定符
public interface XStrategyService {
}
@Service
@Qualifier("defaultStrategyService")
public class XStrategyServiceImpl01 implements XStrategyService {
}
@Service
public class XStrategyServiceImpl02 implements XStrategyService {
}
@Autowired
@Qualifier("defaultStrategyService")
private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择
使用@Resource,通过Bean的名称限定选择,和@Qualifier限定符类似
public interface XStrategyService {
}
@Service("xStrategyServiceImpl01")
public class XStrategyServiceImpl01 implements XStrategyService {
}
@Service("xStrategyServiceImpl02")
public class XStrategyServiceImpl02 implements XStrategyService {
}
@Resource(name = "xStrategyServiceImpl01")
private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择
特例:Spring4.0后的新特性,就是根据泛型类型可以自动选择注入
public interface XStrategyService<T> {
}
@Service
public class XStrategyServiceImpl01 implements XStrategyService<XXX> {
}
@Service
public class XStrategyServiceImpl02 implements XStrategyService<YYY> {
}
@Autowired
private XStrategyService<XXX> xStrategyService; // XStrategyServiceImpl01将被选择
补充@Order结合@Bean的用法:
public interface XStrategyService {
}
@Service
public class XStrategyServiceImpl01 implements XStrategyService {
}
@Service
public class XStrategyServiceImpl02 implements XStrategyService {
}
@Bean
@Order(1)
XStrategyServiceImpl01 xStrategyServiceImpl01() {
return new XStrategyServiceImpl01();
}
@Bean
@Order(2)
XStrategyServiceImpl02 xStrategyServiceImpl02() {
return new XStrategyServiceImpl02();
}
@Autowired
private List<XStrategyService> xStrategyServices; // XStrategyServiceImpl01 first
原文链接:https://blog.csdn.net/weixin_42465125/article/details/88574670
Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后】等方法控制多实现的依赖注入(转)的更多相关文章
- Spring入门--控制反转(IOC)与依赖注入(DI)
1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control).它把传统上由程序 ...
- Spring核心思想:“控制反转”,也叫“依赖注入” 的理解
@Service对应的是业务层Bean,例如: @Service("userService") public class UserServiceImpl implements Us ...
- Spring的三大核心思想:IOC(控制反转),DI(依赖注入),AOP(面向切面编程)
Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧) 1.IoC是什么? IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多 ...
- [Spring]:java.lang.NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()'
错误信息 11月 05, 2019 9:32:15 下午 org.springframework.test.context.TestContextManager prepareTestInstance ...
- [Spring]IOC控制反转和DI依赖注入
从之前算起到现在接触Spring也已经有几天了,进度也不是很快,就只弄懂了控制反转和依赖注入那么一点东西.然后敲了两个demo 主要是因为之前没有学过,然后网上资源很多但是都不是面向我们初学者的,大多 ...
- Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...
- Spring框架学习笔记(1)——控制反转IOC与依赖注入DI
Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- spring(一) IOC 控制反转 、DI 依赖注入
IOC 控制反转:创建对象的方式 变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...
随机推荐
- 【Python】【demo实验5】【练习实例】【多个数字组合成不重复三位数】
题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码 ...
- Plsql配置后,sql语句可以简写 快速使用
in=INSERT up=UPDATE se=SELECT fr=FROM wh=WHERE or=ORDER BY de=DELETE df=DELETE FROM sf=SELECT * FROM ...
- hdu 6601 区间条件极值 - 区间 最大 三角形周长
题目传送门//res tp hdu 目的 对长度为n的区间,给定q个子区间,求其元素能构成三角形的最大周长.有多组测试. n 1e5 q 1e5 ai [1,1e9] (i∈[1,n]); 数据结构 ...
- POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
(点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...
- C++字符转换等常用方法
下面是C++中字符编码格式转换(包括ANSI转换为UTF8,UTF8转换为ANSI,ANSI转换为unicode,unicode转换为ANSI,UTF8转换为unicode,unicode转换为UTF ...
- SpringBoot 初入门
SpringBoot 初入门 关于介绍什么之类的就不讲了,主要做一下学习记录. 1. 启动方式 IDEA 启动 命令行启动: mvn spring-boot:run 部署到服务器启动: 先进行打包, ...
- 怎样创建并使用 vue 组件 (component) ?
组件化开发 需要使用到组件, 围绕组件, Vue 提供了一系列功能方法, 这里仅记录组件的 最简单 的使用方法. 1. 通过 Vue.component(tagName, options) 注册一个 ...
- Python的argparse模块的使用
Python的argparse模块的使用 最近看到一份Pytorch代码有以下内容: # Training settings parser = argparse.ArgumentParser(desc ...
- 【Git的基本操作四】永久删除文件后找回
永久删除文件后找回 1. 已经添加到本地库的文件 使用 reset 命令回退到未删除的历史记录即可 2.添加到缓存区,没有提交到本地库的文件找回 git reset --hard HEAD 命令即可找 ...
- vue 数据驱动原理,响应式 原理?
Object.defineProperty(obj,"name",{ get(){ console.log("被访问了") return obox.innerH ...