zoukankan      html  css  js  c++  java
  • 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;
    
    }
  • 相关阅读:
    大厂机密!30 个提升团队研发效能的锦囊
    爆肝 200 小时,我做了个编程导航!
    AJAX数据传输之请求与发送
    JS高级技巧之函数节流
    JS实战笔记
    JS获取DOM元素位置与大小
    JS实现快排算法
    构造可重用的Ajax对象
    JS字符串操作总结
    JS常用函数小结
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12202666.html
Copyright © 2011-2022 走看看