Spring @Order批注

介绍:

Spring @Order注释是在Spring 2.0中首次引入的。 然后,它仅用于定义AspectJ建议中的顺序。 在Spring 4.0的后面,对该注释的实现进行了进一步改进。 从那时起,它还支持对Java数组或List之类的集合中的Spring组件或bean进行排序。

对于基于Spring XML的应用程序,此注释在内部使用OrderComparator类,对于基于注释的Spring应用程序,此注释在内部使用AnnotationAwareOrderComparator

在本教程中,我们将探讨如何使用此注释。

Spring

Spring @Order批注仅接受一个可选参数value ,该参数确定组件的顺序:

@Retention(value=RUNTIME)
@Target(value={TYPE,METHOD,FIELD})
@Documented
public @interface Order

此参数的值越低,其优先级越高。 换句话说,值较低的将在Java List或数组中排在第一位。

此参数默认值为Ordered。 LOWEST_PRECEDENCE 。 这意味着标记的组件在所有有序bean中的优先级最低。 类似地,我们可以使用Ordered.HIGHEST_PRECEDENCE标记具有最高优先级的Spring bean。

为什么使用?

@Order批注的一些常见用例包括:

  • 在AspectJ中订购建议; 最初引入它的真正意图
  • 当我们想定义加载CommandLineRunnerApplicationRunner类的顺序时
  • 用于以有序方式在Java数组或List中注入bean 列表
  • 在Spring Security的情况下定义过滤器执行的顺序

设置示例:

假设我们有一个Vehicle界面:

public interface Vehicle {
    public String getDetails();
}

我们定义了一些实现类:

@Order(1)
@Component
public class Bike implements Vehicle {
 
    public String getDetails() {
        return "Bike: 2 Wheeler";
    }
}
 
@Order(2)
@Component
public class Car implements Vehicle {
 
    public String getDetails() {
        return "Car: 4 Wheeler";
    }
}
 
@Order(3)
@Component
public class Truck implements Vehicle {
 
    public String getDetails() {
        return "Truck: 6 Wheeler";
    }
}

在这里,我们已经订购了所有这三个Spring组件。 Bike bean的优先级最高,其次是Car ,最后是Truck

测试我们的实施:

让我们快速编写一个Junit来看看它是如何工作的:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleAppTest {
 
    @Autowired
    private List<Vehicle> vehicles;
 
    @Test
    public void testSpringOrderAnnotation() {
        assertThat(vehicles.get(0).getDetails(), isEqual("Bike: 2 Wheeler"));
        assertThat(vehicles.get(1).getDetails(), isEqual("Car: 4 Wheeler"));
        assertThat(vehicles.get(2).getDetails(), isEqual("Truck: 6 Wheeler"));
    }
}

显然, Spring根据其优先级将我们的bean自动连接到了车辆 Java List中

结论

在本微型教程中,我们探讨了Spring @Order批注的用法。

翻译自: https://www.javacodegeeks.com/2019/09/spring-order-annotation.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值