Spring中控制实现同一个接口的实现类在List中调用的顺序

由于在更新Redis缓存的时候,每个service都实现了基本的RedisCacheUpdate接口里面的update函数,在定时任务里面,采用List<RedisCacheUpdate>的方式批量调用update,但是service之间也有缓存依赖,比如service B依赖service A的缓存,这样,如果B先update那么就会取不到缓存数据而每次在数据库中取,很浪费时间,所以需要控制A
, B 在List中被注入的顺序,那么问题来,来了,该怎么控制他们的调用顺序呢?

Spring早就为我们提供了解决方案,只要在每个实现类加注解Order就可以主动改变他们的注入顺序,这里采用的Spring版本是4.0.8-RELEASE。

Test一下,果然按照给定的顺序来注入了,十分方面。

Interface Base{

void print();

}

@Component

@Order(3)

class A implements Base{

void print(){

syso("A");

}

}

@Component

@Order(2)

class B implements Base{

void print(){

syso("B");

}

}

@Component

@Order(1)

class C implements Base{

void print(){

syso("C");

}

}

@Component

class InvokerClass{

@Autowired

List<Base> list;

void print(){

for(Base base: list){

base.print();

}

}

}

public class Main{

public static void main (String[] args){

ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring.xml");

InvokerClass in = context.getBean(InvokerClass.class);

in.print();

}


打印的结果:

C

B

A 

这里面主要是使用了@Order注解,给注解赋值根据值的大小决定调用的优先级,越大优先级越低。

这样就完全改变了Bean的调用顺序。

就可以控制他们的先后顺序。
时间: 2024-10-06 23:43:29

Spring中控制实现同一个接口的实现类在List中调用的顺序的相关文章

drf中 连表深度查询和ListSerializer类包括drf中Response二次封装

drf中Response二次封装: from rest_framework.response import Response ''' return MyResponse(status=1,msg='error',results=[],token='a.b.c',http_status=400,exception=True) Response模块的响应数据 data,最终数据results,Response模块需要向前台展示的一般有响应数据data(包括data里面的results),网络状态码s

Spring嵌套事务控制

A类   callBack_test() B类   testadd() C类   select(),得查询到B类testadd方法中新增的数据.以及初始化一些属性 场景:A类 嵌套 B类  B类嵌套C类:都是由spring控制事务. 要求:B类testadd方法中不受spring事务控制,单独新开个事务运行,可以使C类查询的到. 问题:A类是系统底层方法,必须受事务控制.且C类必须查询到刚刚add的数据. 分析:初步分析为:Spring事务传播性导致的,从A类开启的事务,就有完结.为了避免这样的

Spring Security控制权限

Spring Security控制权限 1,配置过滤器 为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我们就可以控制对这个项目的每个请求了. <filter>    <filter-name>springSecurityFilterChain</filter-name>    <filter-class>org.springframework.web.filter.DelegatingFilterProxy&

转:[Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制TreeView节点展开?

很多童鞋看了我的博客以后也去实践MVVM,但却发现Silverlight实践中的MVVM很难实现,比纯粹的CodeBehind难度大很多.首先是原来在xaml.cs的CodeBehind部分很容易控制界面逻辑,现在这部分逻辑移到ViewModel里面去了以后,就很难调用CodeBind的部分;其次是很多View和ViewModel.或者一个ViewModel多个View,他们之间如何通 很多童鞋看了我的博客以后也去实践MVVM,但却发现Silverlight实践中的MVVM很难实现,比纯粹的Co

深度分析如何在Hadoop中控制Map的数量

深度分析如何在Hadoop中控制Map的数量 [email protected] 很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数决定.在默认情况下,最终input 占据了多少block,就应该启动多少个Mapper.如果输入的文件数量巨大,但是每个文件的size都小于HDFS的blockSize,那么会造成 启动的Mapper等于文件的数量(即每个文件都占据了一个block),那么很可能造成启动的Mapper数量超出限制而导致崩溃.这些逻

驱动移植过程中DMA内存相关接口替换

1. 相关概念介绍及移植简介 1.1 物理地址与总线地址         1)物理地址是与CPU相关的.在CPU的地址信号线上产生的就是物理地址,在程序指令中的的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上.         2)总线地址,顾名思义,是与总线相关的,外设使用的就是总线地址.         在x86平台下,外设的I/O地址是独立的,即有专门的指令访问外设I/O,I/O地址就是所谓的"总线地址".而"物理地址"就

cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用

cocos2dx的3.x版本已经提供了更好地绑定方式,网上有很多相关的教程,这里给一个链接:http://www.cocoachina.com/bbs/read.php?tid=196416. 由于目前我们的项目使用的是2.x版本的,且已经开发了一半了,这时候不适合转3.x的版本,于是只能用2.x的老方法tolua++来实现绑定.这就有一个蛋疼的问题,太麻烦!每次都要写pkg.使用tolua++.exe解释器编译生成新的cpp,在其中添加自己的类的头文件引用,然后把这个新的cpp文件覆盖到lib

由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题

1 @Slf4j 2 @RestController 3 @Component 4 public class VouchersReceiverController implements MessageListener { 5 6 @Autowired 7 private VouchersService vouchersService; 8 9 String MerchantCode = PropertyReader.getValue("MerchantCode"); 10 11 /**

Spring中aspectJ的应用&mdash;&mdash;接口的监控

一.背景: 1.由于公司最近在拆分之前的项目,打算把项目改为前后端分离的模式,所以我们后端这边都在做接口的开发 2.最近也在和其他的公司对接他们的接口,在对接的过程中发现他们的接口调用都是有日志存储的,所以突发奇想就想用spring的aop做这个东西玩玩(其实好像拦截器也能实现). 二.过程记录 1.在spring的配置文件中增加xsd文件 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="htt