Spring中@Order注解有什么用途?

76

我看到了一段使用了@Order注解的代码。我想知道在Spring Security或Spring MVC中,这个注解的作用是什么。

这里是一个例子:

@Order(1)
public class StatelessAuthenticationSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private TokenAuthenticationService tokenAuthenticationService;

}

如果我们不使用这个注解,上述类的顺序会发生什么变化?


2
请查看以下链接以获取与Spring框架中的@Order注解相关的文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/annotation/Order.html。 - Aleksandr M
关于Spring Security,这可能会定义安全过滤器应用的顺序。 - S. Pauk
3个回答

90

它用于建议执行优先级。

最高优先级的建议将首先运行。数字越低,优先级越高。例如,给定两个“before”建议,具有最高优先级的建议将首先运行。

另一种使用方法是用于排序Autowired集合。

@Component
@Order(2)
class Toyota extends Car {
    public String getName() {
        return "Toyota";
    }
}

@Component
@Order(1)
class Mazda extends Car {
    public String getName() {
        return "Mazda";
    }
}

@Component
public class Cars {
    @Autowired
    List<Car> cars;

    public void printNames(String [] args) {

        for(Car car : cars) {
            System.out.println(car.getName())
        }
    }
}

您可以在此处找到可执行代码:https://github.com/patrikbego/spring-order-demo.git

希望这能进一步澄清。

输出:

Mazda Toyota


这个可以用来指定不同的bean应该被销毁的顺序吗? - Sahil Chhabra
我不觉得有什么问题。 - Patrik Bego
4
关于自动装配集合,如果集合中的某些bean有@Order而其他没有,会发生什么?那些没有的会自动成为“最后一个”吗? - user1884155
2
我知道这很老,但如果Bean不包括@Order,而集合中的其他bean则有,则它隐含地具有默认值,即:Ordered.LOWEST_PRECEDENCE - Voronin

15

@Order注解(以及Ordered接口)暗示了Spring将加载或优先考虑的特定顺序。

较小的数字表示更高的优先级。该功能可用于按特定顺序将bean添加到集合中(例如通过@Autowired),等等其他用途。

在您特定的示例中,该注解不会改变类本身的任何内容。无论在哪里使用这个特定的类,它都具有最高的优先级(因为它被设置为'1'),可能是因为其他类中附加但依赖的信息以较低的优先级排序。


9

@Order 注解指定了Spring容器加载Bean的顺序。顺序数值越小,优先级越高。因此,顺序为0的Bean比顺序为10的Bean具有更高的优先级。同样,顺序为-100的Bean比顺序为0的Bean具有更高的优先级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接