我们在用一些设计模式的时候,特别是在java跟spring生态中,有很多基于接口,会有各种不同的实现,此时如果想让实现了同一个接口的一组处理器(bean)能够按顺序处理,会有比较多种方法,这里简单介绍两种实现方式,
我们先定义一个接口1 2 3
| public interface Processor { void process(); }
|
然后有两个实现
第一个实现是1 2 3 4 5 6 7
| public class FirstProcessor implements Processor{
@Override public void process() { System.out.println("this is " + this.getClass().getSimpleName()); } }
|
第二个实现是1 2 3 4 5 6 7
| public class SecondProcessor implements Processor{
@Override public void process() { System.out.println("this is " + this.getClass().getSimpleName()); } }
|
主要是为了示意,所以就把类名打了出来
我们通过一个http接口来调用下1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @RestController public class OrderController {
@Autowired private List<Processor> processors;
@RequestMapping(value = "/order", method = RequestMethod.GET) @ResponseBody public void test() { for (Processor processor : processors) { processor.process(); } } }
|
这里通过autowired注解进行注入,此时我们可以运行起来看下执行顺序
看到控制台输出的确是有序的1 2
| this is FirstProcessor this is SecondProcessor
|
这个并不是spring这么智能知道我们的想法,只是刚好按字母顺序F在前
比如我们再加两个处理器
第三个1 2 3 4 5 6 7 8
| @Service public class ThirdProcessor implements Processor{
@Override public void process() { System.out.println("this is " + this.getClass().getSimpleName()); } }
|
和第四个1 2 3 4 5 6 7
| @Service public class FourthProcessor implements Processor{ @Override public void process() { System.out.println("this is " + this.getClass().getSimpleName()); } }
|
然后我们请求下,就发现是1 2 3 4
| this is FirstProcessor this is FourthProcessor this is SecondProcessor this is ThirdProcessor
|
没有按照我们想要的顺序执行
那么我们可以怎么做呢
方法一 使用order注解
通过spring的org.springframework.core.annotation.Order
注解1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package org.springframework.core.annotation;
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @Documented public @interface Order { int value() default Integer.MAX_VALUE; }
|
通过value值来指定顺序,值越小,顺序越靠前
比如我们这1 2 3 4 5 6 7 8 9 10 11 12
| @Service @Order(value = 1) public class FirstProcessor implements Processor{ @Service @Order(value = 2) public class SecondProcessor implements Processor{ @Service @Order(value = 3) public class ThirdProcessor implements Processor{ @Service @Order(value = 4) public class FourthProcessor implements Processor{
|
运行验证下的确是按照我们想要的顺序执行了1 2 3 4
| this is FirstProcessor this is SecondProcessor this is ThirdProcessor this is FourthProcessor
|
方法二 实现 Ordered 接口
org.springframework.core.Ordered
接口,需要实现 getOrder 方法1 2 3 4 5 6
| public interface Ordered { int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
int getOrder(); }
|
我们就在处理器里实现这个接口方法1 2 3 4 5 6 7 8 9 10 11 12
| public class FirstProcessor implements Processor, Ordered {
@Override public void process() { System.out.println("this is " + this.getClass().getSimpleName()); }
@Override public int getOrder() { return 1; } }
|
运行下同样可以实现这个效果1 2 3 4
| this is FirstProcessor this is SecondProcessor this is ThirdProcessor this is FourthProcessor
|