@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后】等方法控制多实现的依赖注入(转)的更多相关文章

  1. Spring入门--控制反转(IOC)与依赖注入(DI)

        1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control).它把传统上由程序 ...

  2. Spring核心思想:“控制反转”,也叫“依赖注入” 的理解

    @Service对应的是业务层Bean,例如: @Service("userService") public class UserServiceImpl implements Us ...

  3. Spring的三大核心思想:IOC(控制反转),DI(依赖注入),AOP(面向切面编程)

    Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧) 1.IoC是什么?    IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多 ...

  4. [Spring]:java.lang.NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()'

    错误信息 11月 05, 2019 9:32:15 下午 org.springframework.test.context.TestContextManager prepareTestInstance ...

  5. [Spring]IOC控制反转和DI依赖注入

    从之前算起到现在接触Spring也已经有几天了,进度也不是很快,就只弄懂了控制反转和依赖注入那么一点东西.然后敲了两个demo 主要是因为之前没有学过,然后网上资源很多但是都不是面向我们初学者的,大多 ...

  6. Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)

    目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...

  7. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

  8. 三大框架 之 Spring(IOC控制反转、DI依赖注入)

    目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...

  9. spring(一) IOC 控制反转 、DI 依赖注入

    IOC 控制反转:创建对象的方式  变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...

随机推荐

  1. luoguP2664树上游戏(点分治)

    题目链接:https://www.luogu.org/problem/P2664 题意:给定一颗带点权的树,结点数n<=1e5,点权<=1e5,用s(i,j)表示从i到j的路径上不同点权数 ...

  2. java23种设计模式之五:代理模式

    一.代理模式介绍 代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程 其中代理又分为:静态代理和动态代理 静态代理:指的是自己要写一个代理类,或者用工具生 ...

  3. dij 费用流

    #include <bits/stdc++.h> using namespace std; typedef long long lld; const int MAXN = 50010, M ...

  4. django时区与时间差的问题

    时区的正确配置方式: # 这里还可以配置成中文 一般用不到 LANGUAGE_CODE = 'en-us' # TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai ...

  5. 【求教 探讨】python tkinter的messagebox

    最近有一个要求,用python的tkinter制作一个messagebox,传入3个参数: title  text timeout.用户可以点击“确定” 关闭窗口:  或者 等待几秒(timeout) ...

  6. 一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends

    说实在话,以前我只需要知道"寄生组合继承"是最好的,有个祖传代码模版用就行.最近因为一些事情,几个星期以来一直心心念念想整理出来.本文以<JavaScript高级程序设计&g ...

  7. Mysql-Sqlalchemy-多表操作

    import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declar ...

  8. Java 注解(原理及其使用)

    一.注解(annotation)介绍 Java在JDK5中引入源代码的注解机制. 1.什么是注解? 注解为代码添加了元数据,元数据是关于数据的组织.数据域及其关系的说明信息. 更通俗的说,注解为程序元 ...

  9. 进阶Java编程(2)线程常用操作方法

    线程常用操作方法 多线程的主要操作方法都在Thread类中定义的. 1,线程的命名和取得 多线程的运行状态是不确定的,那么在程序的开发之中为了可以获取到一些需要使用到的线程就只能依靠线程的名字来进行操 ...

  10. Javascript——数据类型 和 注释

    数据类型:JavaScript中包括如下7种数据类型:字符串.数字.布尔.数组.对象.null.undefined 字符串: 注意:字符串类型的数据需要使用单引号或双引号引起来. 数字: 注意:Jav ...