Spring中的@Order注解

2023/05/13

1. 概述

在本文中,我们将介绍Spring的@Order注解。@Order定义了带注解的component或bean的优先级顺序

它有一个可选的value参数,用于确定组件的顺序;默认值为Ordered.LOWEST_PRECEDENCE。这标志着该组件在所有其他组件中的优先级最低。

同样,Ordered.HIGHEST_PRECEDENCE可用于覆盖组件中的最高优先级。

2. 何时使用@Order

在Spring 4.0之前,@Order注解仅用于AspectJ执行顺序。这意味着最高级别的通知将首先运行。

从Spring 4.0开始,它支持将注入的组件排序到集合中。因此,Spring将根据它们的order值自动注入相同类型的bean。

让我们用一个简单的例子来说明。

3. 如何使用@Order

3.1 创建接口

让我们创建决定产品评级的Rating接口:

public interface Rating {
    int getRating();
}

3.2 创建组件

最后,让我们创建三个组件来定义某些产品的评级:


@Component
@Order(1)
public class Excellent implements Rating {

    @Override
    public int getRating() {
        return 1;
    }
}

@Component
@Order(2)
public class Good implements Rating {

    @Override
    public int getRating() {
        return 2;
    }
}

@Component
@Order(Ordered.LOWEST_PRECEDENCE)
public class Average implements Rating {

    @Override
    public int getRating() {
        return 3;
    }
}

请注意,Average类的优先级最低,因为它的value属性指定为Ordered.LOWEST_PRECEDENCE。

4. 测试

到目前为止,我们已经创建了所有必需的组件和接口来测试@Order注解。现在,让我们对其进行测试以确认它是否按预期工作:


@ExtendWith(SpringExtension.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
class RatingRetrieverUnitTest {

    @Autowired
    private List<Rating> ratings;

    @Test
    void givenOrderOnComponents_whenInjected_thenAutowireByOrderValue() {
        assertThat(ratings.get(0).getRating(), is(equalTo(1)));
        assertThat(ratings.get(1).getRating(), is(equalTo(2)));
        assertThat(ratings.get(2).getRating(), is(equalTo(3)));
    }

    @Configuration
    @ComponentScan(basePackages = {"cn.tuyucheng.taketoday.spring.order"})
    static class ContextConfiguration {
    }
}

5. 总结

在这篇文章中我们了解了@Order注解。我们可以在各种用例中找到@Order的应用,其中最重要的是自动注入组件的顺序。一个例子是Spring的请求过滤器。

由于它对注入优先级的影响,它似乎也可能影响单例启动顺序。但相比之下,依赖关系和@DependsOn声明决定了单例启动顺序。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章