Spring方面排序

时间:2015-05-11 20:44:55

标签: spring aspectj spring-aop

如果我有3个方面,那么“进入”的调用顺序是什么:

@Order(Ordered.HIGHEST_PRECEDENCE)
public class Aspect1

public class Aspect2

@Order(Ordered.LOWEST_PRECEDENCE)
public class Aspect3

因此Aspect2没有任何订单注释。

很明显,在Aspect3之前会调用Aspect1,但这是否意味着Aspect2将始终在中间调用?

1 个答案:

答案 0 :(得分:0)

关于@Order的官方javadoc:

  

定义排序的注释。该值是可选的,表示Ordered接口中定义的顺序值。较低的值具有较高的优先级默认值为Ordered.LOWEST_PRECEDENCE,表示最低优先级(丢失到任何其他指定的订单值)。

这意味着Aspect2的值Ordered.LOWEST_PRECEDENCE也是Integer.MAX_VALUE。我不认为有一种方法可以100%确定在Aspect3之前总是会调用它 - 我相信它取决于组件扫描的顺序。

如果您想确定,可以输入准确的值:

@Order(1)
public class Aspect1 {...}

@Order(2)
public class Aspect2 {...}

@Order(3)
public class Aspect3 {...}

或者只需在Integer.MIN_VALUE上的Integer.MAX_VALUEAspect2之间加上一个值:

@Order(0)
public class Aspect2 {...}

这也是一个证实这一点的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes =
    {Class1.class, Class3.class, Class2.class})
public class TestTest {

    public static interface Test {}

    @Order(Ordered.HIGHEST_PRECEDENCE)
    @Component
    public static class Class1 implements Test {}

    @Order
    @Component
    public static class Class2 implements Test {}

    @Order(Ordered.LOWEST_PRECEDENCE)
    @Component
    public static class Class3 implements Test {}

    @Autowired
    List<Test> list;

    @Test
    public void test() {
        System.out.println("list: " + list);
    }
}

这将输出:

list: [TestTest$Class1@d21a74c, TestTest$Class3@6e509ffa, TestTest$Class2@2898ac89]

但如果您更改2中的课程3@SpringApplicationConfiguration的顺序,则会在第二位调用Class2