Spring 方面排序

Spring aspect ordering

如果我有 3 个方面,"way in" 上的调用顺序是什么:

@Order(Ordered.HIGHEST_PRECEDENCE)
public class Aspect1

public class Aspect2

@Order(Ordered.LOWEST_PRECEDENCE)
public class Aspect3

所以 Aspect2 没有任何顺序注释。

很明显Aspect1会在Aspect3之前被调用,但是Aspect2是否总是在两者之间被调用?

来自官方 javadoc 关于 @Order:

Annotation that defines ordering. The value is optional, and represents order value as defined in the Ordered interface. Lower values have higher priority. The default value is Ordered.LOWEST_PRECEDENCE, indicating lowest priority (losing to any other specified order value).

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

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

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

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

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

或者在 Aspect2 上输入 Integer.MIN_VALUEInteger.MAX_VALUE 之间的值:

@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]

但是如果你在@SpringApplicationConfiguration中改变类23的顺序,Class2将被调用。