如果我有3个方面,那么“进入”的调用顺序是什么:
@Order(Ordered.HIGHEST_PRECEDENCE)
public class Aspect1
public class Aspect2
@Order(Ordered.LOWEST_PRECEDENCE)
public class Aspect3
因此Aspect2没有任何订单注释。
很明显,在Aspect3之前会调用Aspect1,但这是否意味着Aspect2将始终在中间调用?
答案 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_VALUE
和Aspect2
之间加上一个值:
@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
。