在Spring 3.1中,有一种方法可以自动填充类型化的List,这在您想在代码中稍微进行去耦和清理时非常方便。

为了向您展示它是如何工作的,我将实现一个简单的责任链,该责任链将为通过的用户打印一些问候。

让我们从我们拥有的(唯一的)域类(用户)开始:

package com.marco.springchain;
public class User {private final String name;private final char gender;public User(String name, char gender) {super();this.name = name;this.gender = gender;}public String getName() {return name;}public char getGender() {return gender;}
}

然后,我们创建一个接口,该接口定义要在链中使用的命令对象的类型:

package com.marco.springchain;
public interface Printer {void print(User user);
}

这是Printer实现的通用类(模板)。

org.springframework.core.Ordered用于告诉AnnotationAwareOrderComparator我们希望如何对List进行排序。

如果不需要您的链来具有执行顺序,则无需实现Ordered接口并重写getOrder方法。

还要注意,这个抽象类返回Ordered.LOWEST_PRECEDENCE ,这是因为我希望一些打印机命令仅在链的末尾运行,并且我不在乎它们的执行顺序(我保证,以后一切都会更清楚!)。

GenericPrinter

这是我们的第一个真正的打印机命令。 我希望它在链中具有绝对优先级,因此顺序为HIGHEST_PRECEDENCE

package com.marco.springchain;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
@Component
public class HelloPrinter extends GenericPrinter {private static final String GREETING = 'Hello';@Overrideprotected String getGreeting() {return GREETING;}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}

WelcomePrinter将作为第一个命令执行( 在高优先级命令之后 )。

package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class WelcomePrinter extends GenericPrinter {private static final String GREETING = 'Welcome to the autowired chain';@Overrideprotected String getGreeting() {return GREETING;}@Overridepublic int getOrder() {return 1;}
}

GoodbyePrinter将作为第二个命令执行

package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class GoodbyePrinter extends GenericPrinter {private static final String GREETING = 'Goodbye';@Overrideprotected String getGreeting() {return GREETING;}@Overridepublic int getOrder() {return 2;}
}

这两个命令需要在其他命令之后执行,但是我不在乎它们的特定顺序,因此我不会覆盖getOrder方法,而让GenericPrinter Ordered.LOWEST_PRECEDENCE为这两个命令返回Ordered.LOWEST_PRECEDENCE

package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class CleaningMemoryPrinter extends GenericPrinter {private static final String GREETING = 'Cleaning memory after';@Overrideprotected String getGreeting() {return GREETING;}
}
package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class CleaningSpacePrinter extends GenericPrinter {private static final String GREETING = 'Cleaning space after';@Overrideprotected String getGreeting() {return GREETING;}
}

这是链上下文。

Spring将扫描(请参阅spring-config.xml)配置文件中指定的包,它将看到类型化的( List<Printer> )列表,并且它将使用实现该类型的任何@Component的实例填充该列表。打印机。

为了对List进行排序,我们使用AnnotationAwareOrderComparator.INSTANCE ,它使用getOrder方法对List进行重新排序( 值最低的对象具有最高优先级(有点类似于Servlet“启动时加载”值 ) )。

package com.marco.springchain;
import java.util.Collections;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.stereotype.Component;
@Component
public class PrinterChain {@Autowiredprivate List<Printer> printers;@PostConstructpublic void init() {Collections.sort(printers, AnnotationAwareOrderComparator.INSTANCE);}public void introduceUser(User user) {for (Printer printer : printers) {printer.print(user);}}
}

src / main / resources中的spring-config.xml。

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:aop='http://www.springframework.org/schema/aop'xmlns:tx='http://www.springframework.org/schema/tx'xmlns:context='http://www.springframework.org/schema/context'xmlns:util='http://www.springframework.org/schema/util'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd' default-lazy-init='true'><context:component-scan base-package='com.marco.springchain'/>
</beans>

最后,一个主类来测试我们的链。

package com.marco.springchain;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext('spring-config.xml');PrinterChain printerChain = (PrinterChain) context.getBean('printerChain');printerChain.introduceUser(new User('Marco Castigliego', 'M'));printerChain.introduceUser(new User('Julie Marot', 'F'));}
}

输出:

Hello Mr Marco Castigliego
Welcome to the autowired chain Mr Marco Castigliego
Goodbye Mr Marco Castigliego
Cleaning space after Mr Marco Castigliego
Cleaning memory after Mr Marco Castigliego
Hello Mrs Julie Marot
Welcome to the autowired chain Mrs Julie Marot
Goodbye Mrs Julie Marot
Cleaning space after Mrs Julie Marot
Cleaning memory after Mrs Julie Marot

希望您喜欢这个例子。

参考: 使用来自我们的JCG合作伙伴 Marco Castigliego的Spring @Autowired List的责任链,位于“ 删除重复和修复不良名称”博客中。

翻译自: https://www.javacodegeeks.com/2012/11/chain-of-responsibility-using-spring-autowired-list.html

使用Spring @Autowired List的责任链相关推荐

  1. Spring中如何使用责任链模式

    2019独角兽企业重金招聘Python工程师标准>>> 关于责任链模式,其有两种形式,一种是通过外部调用的方式对链的各个节点调用进行控制,从而进行链的各个节点之间的切换:另一种是链的 ...

  2. 工作中常用的设计模式 -- 责任链模式

    一般做业务开发,不太容易有大量使用设计模式的场景.这里总结一下在业务开发中使用较为频繁的设计模式.当然语言为 Java,基于 Spring 框架. 1 责任链模式(Chain of Responsib ...

  3. 责任链模式Java+Spring实现

    业务场景 一般的操作校验接口有参数校验.安全校验.黑名单校验.操作规则等等. 问题 常见同步编写code,校验失败return,代码链路较长,修改不符合开闭原则. 责任链模式定义 责任链模式为请求创建 ...

  4. 责任链模式 多条链路时 spring单例 造成的深坑

    https://mp.weixin.qq.com/s/ipXPMtPawDdESMJYrYthcQ 一)线上事故: 催收系统每日自动分配案件时一直正常,突然某一天(2018-3-27)以后 案件分配不 ...

  5. Spring事务源码分析责任链事务链事务不生效

    文章目录 前言 带着问题分析源码 事务源码分析 寻找Spring事务源码类 TransactionInterceptor调用栈 分析Spring AOP责任链 分析TransactionInterce ...

  6. spring AOP原理分析:静态代理;JDK实现接口动态代理;Cglib继承父类代理;SpringAop的责任链模式调用

    普通静态代理 代理类和真实类都需要实现同一个接口 接口 package com.fchan.layui.represent.service; /*** 静态代理demo*/ public interf ...

  7. 精讲23种设计模式-基于责任链模式~构建企业级风控系统

    文章目录 一.责任链 1. 责任链基本概念 2. 定义 3. 关键要点 4. 责任链模式优缺点 5. 责任链模式类结构图 6. 网关权限控制责任链模式 二.构建企业级风控系统 2.1. 定义公共抽象任 ...

  8. 利用责任链模式及AOP对日志进行脱敏分享

    利用责任链模式及AOP对日志进行脱敏分享 现在公司需要对日志进行脱敏,对一些敏感的值需要掩码处理,已保护用户的数据的安全,对脱敏的字段包括姓名.身份证号码.手机号码.银行账号.邮箱等. 思路如下: 1 ...

  9. java责任链模式审批请假_Java设计模式-责任链模式

    Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...

最新文章

  1. Redis集群:redis cluster方案
  2. java jtable 监听事件_【Java】在JTable中设置鼠标监听器,点击操作对应数据
  3. wxWidgets:wxListbook类用法
  4. 新手求大神,有其他swit-case的思路写这个程序么?
  5. linux笔记-硬链接和符号链接
  6. Instant Complexity--POJ 1472
  7. 走进我的交易室02_交易什么市场
  8. OpenCart多图片拖放式上传管理器
  9. C# 实体类序列化与反序列化一 (XmlSerializer)
  10. 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型
  11. 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
  12. archlinux i3wm通知管理
  13. Rational Rose建立类图
  14. 坚定不移地做自己认为正确的事情
  15. iOS Core Bluetooth 教程:心率监测
  16. 【ARM编程】ARM介绍
  17. UML建模--用例图
  18. PHP判断当前的设备是手机(Mobile)还是电脑(PC)
  19. 第二证券|支持多子女购房、提高公积金贷款额度、发放限时补贴
  20. 利用mathematica画多个函数图像

热门文章

  1. python下面的代码_解析一下下面的python代码?
  2. unity 3d shaderlab 开发实战详解_vue实战开发011:使用router-view嵌套路由详解
  3. apache kafka_使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务...
  4. graal java_使用SparkJava和Graal的本机微服务
  5. log4j2 xsd_Log4j 2.x XSD的描述不完整
  6. java高级教程_高级Java教程
  7. javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote
  8. Java:ChronicleMap第1部分,精简版
  9. lucene索引_在崩溃或断电后测试Lucene的索引耐久性
  10. Oracle JDBC中的PreparedStatement占位符过多