项目开发过程中遇到的难题,业务接口需要执行TestListener接口所有实现类,且依照开发者想要的顺序执行.拓展思考下,通过创建TestListener接口方式减少了与业务接口的耦合性,想象下如果将TestListener接口实现类的代码全部平铺在业务接口中该有多恐怖...使用这种接口实现类方式,后期再有需求直接创建TestListener接口实现类即可,解决了复杂且且不利于后期维护的问题,废话不多讲,直接上代码
接口实现类添加@Order注解
public interface TestListener {
/**
* 发生催记前需要执行的方法
*/
void execute(LogVo vo);
}
@Component
@Order(0)
public class TestListenerImpl01 implements TestListener {
@Override
public void execute(LogVo vo) {
System.out.println("TestListenerImpl01的执行顺序order(0)");
}
}
@Component
@Order(1)
public class TestListenerImpl02 implements TestListener {
@Override
public void execute(LogVo vo) {
System.out.println("TestListenerImpl02的执行顺序order(1)");
}
}
业务接口逻辑整改
原逻辑代码
Map<String, TestListener> beansOfType = SpringUtils.getApplicationContext().getBeansOfType(TestListener.class);
for (Map.Entry<String, TestListener> entry : beansOfType.entrySet()) {
TestListener testListener = entry.getValue();
testListener.execute(vo);
}
整改后逻辑代码
List<LogListener> runners = new ArrayList();
runners.addAll(SpringUtils.getApplicationContext().getBeansOfType(TestListener.class).values());
//重点来了,按照定义的优先级顺序排序
AnnotationAwareOrderComparator.sort(runners);
for (LogListener runner : runners) {
runner.execute(vo);
}
打印结构
TestListenerImpl01的执行顺序order(0)
TestListenerImpl02的执行顺序order(1)