1.定义一个抽象类,后面的具体链路继承该抽象类
public abstract class AbstractExecutorChain {
/**
* 处理方法
*
* @return 结果
*/
public abstract boolean executor();
}
2.定义各个链路
@Order(1)
@Component
@Slf4j
public class FirstExecutorChain extends AbstractExecutorChain {
@Override
public boolean executor() {
log.info("执行了责任链1");
return true;
}
}
@Order(2)
@Component
@Slf4j
public class TwoExecutorChain extends AbstractExecutorChain {
@Override
public boolean executor() {
log.info("执行了责任链2");
return true;
}
}
@Order(3)
@Component
@Slf4j
public class ThreeExecutorChain extends AbstractExecutorChain {
@Override
public boolean executor() {
log.info("执行了责任链3");
return true;
}
}
3.组装责任链及提供对外调用接口
@Component
@Slf4j
public class ChainContext {
/**
* 责任链路声明
*/
private final List<AbstractExecutorChain> chainList;
/**
* 链路初始化
*/
public ChainContext(List<AbstractExecutorChain> chainList) {
this.chainList = chainList.stream().sorted(AnnotationAwareOrderComparator.INSTANCE).collect(Collectors.toList());
}
/**
* 执行责任链
*/
public boolean handle() {
if (CollectionUtils.isEmpty(chainList)) {
log.info("责任链初始化失败!");
}
log.info("chainList:{}", chainList);
for (AbstractExecutorChain abstractExecutorChain : chainList) {
if (!abstractExecutorChain.executor()) {
return false;
}
}
return true;
}
}
4.使用
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class ChainTest {
@Resource
private ChainContext context;
@Test
public void test() {
boolean handle = context.handle();
log.info("责任链执行结果:{}", handle);
}
}