spring-core中@Order和Ordered接口的说明
Posted mufeng07
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring-core中@Order和Ordered接口的说明相关的知识,希望对你有一定的参考价值。
spring版本为5.0.11
注意:注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响;
Ordered接口,用来排序的。
Spring是一个大量使用策略设计模式的框架,这意味着有很多相同接口的实现类,那么必定会有优先级的问题。
于是,Spring就提供了Ordered这个接口,来处理相同接口实现类的优先级问题。
getOrder()值越小,优先级越高。
PriorityOrdered是个接口,继承自Ordered接口,未定义任何方法
OrderComparator比较器进行排序的时候,若2个对象中有一个对象实现了PriorityOrdered接口,那么这个对象的优先级更高。
若2个对象都是PriorityOrdered或Ordered接口的实现类,那么比较Ordered接口的getOrder方法得到order值,值越低,优先级越高。
@Order
1.spring4.2可以用@Order控制配置类的加载顺序
2.常用于aop优先事务执行
3.@Order不标注数字,默认最低优先级,即int的最大值
Ordered接口的源码
/** * {@code Ordered} is an interface that can be implemented by objects that * should be <em>orderable</em>, for example in a {@code Collection}. * * <p>The actual {@link #getOrder() order} can be interpreted as prioritization, * with the first object (with the lowest order value) having the highest * priority. * * <p>Note that there is also a <em>priority</em> marker for this interface: * {@link PriorityOrdered}. Consult the Javadoc for {@code PriorityOrdered} for * details on how {@code PriorityOrdered} objects are ordered relative to * <em>plain</em> {@link Ordered} objects. * * <p>Consult the Javadoc for {@link OrderComparator} for details on the * sort semantics for non-ordered objects. * * @author Juergen Hoeller * @author Sam Brannen * @since 07.04.2003 * @see PriorityOrdered * @see OrderComparator * @see org.springframework.core.annotation.Order * @see org.springframework.core.annotation.AnnotationAwareOrderComparator */ public interface Ordered { /** * Useful constant for the highest precedence value. * @see java.lang.Integer#MIN_VALUE */ int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; /** * Useful constant for the lowest precedence value. * @see java.lang.Integer#MAX_VALUE */ int LOWEST_PRECEDENCE = Integer.MAX_VALUE; /** * Get the order value of this object. * <p>Higher values are interpreted as lower priority. As a consequence, * the object with the lowest value has the highest priority (somewhat * analogous to Servlet {@code load-on-startup} values). * <p>Same order values will result in arbitrary sort positions for the * affected objects. * @return the order value * @see #HIGHEST_PRECEDENCE * @see #LOWEST_PRECEDENCE */ int getOrder(); }
@Order源码
/** * {@code @Order} defines the sort order for an annotated component. * * <p>The {@link #value} is optional and represents an order value as defined in the * {@link Ordered} interface. Lower values have higher priority. The default value is * {@code Ordered.LOWEST_PRECEDENCE}, indicating lowest priority (losing to any other * specified order value). * * <p><b>NOTE:</b> Since Spring 4.0, annotation-based ordering is supported for many * kinds of components in Spring, even for collection injection where the order values * of the target components are taken into account (either from their target class or * from their {@code @Bean} method). While such order values may influence priorities * at injection points, please be aware that they do not influence singleton startup * order which is an orthogonal concern determined by dependency relationships and * {@code @DependsOn} declarations (influencing a runtime-determined dependency graph). * * <p>Since Spring 4.1, the standard {@link javax.annotation.Priority} annotation * can be used as a drop-in replacement for this annotation in ordering scenarios. * Note that {@code @Priority} may have additional semantics when a single element * has to be picked (see {@link AnnotationAwareOrderComparator#getPriority}). * * <p>Alternatively, order values may also be determined on a per-instance basis * through the {@link Ordered} interface, allowing for configuration-determined * instance values instead of hard-coded values attached to a particular class. * * <p>Consult the javadoc for {@link org.springframework.core.OrderComparator * OrderComparator} for details on the sort semantics for non-ordered objects. * * @author Rod Johnson * @author Juergen Hoeller * @since 2.0 * @see org.springframework.core.Ordered * @see AnnotationAwareOrderComparator * @see OrderUtils * @see javax.annotation.Priority */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @Documented public @interface Order { /** * The order value. * <p>Default is {@link Ordered#LOWEST_PRECEDENCE}. * @see Ordered#getOrder() */ int value() default Ordered.LOWEST_PRECEDENCE; }
以上是关于spring-core中@Order和Ordered接口的说明的主要内容,如果未能解决你的问题,请参考以下文章
spring-context 和 spring-core 依赖有啥区别?
org.springframework.boot.SpringApplication 与 spring-core 3.2.5.RELEASE