接口实现类执行顺序指定

712 阅读1分钟

项目开发过程中遇到的难题,业务接口需要执行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)