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_VALUE
和 Integer.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
中改变类2
和3
的顺序,Class2
将被调用。
如果我有 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_VALUE
和 Integer.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
中改变类2
和3
的顺序,Class2
将被调用。