@Order与Ordered 是控制顺序的, 是控制执行顺序,不控制Spring初始化顺序。
@Order / Ordered顺序是从小到大 执行
@Order 默认 2147483647
需要注意的是 在SpringBoot实现过滤器过程中使用 @WebFilter 这个时候@Order或者Ordered接口是失效的
参考过滤器实现方式: SpringBoot多种 Filter过滤器 配置方式
https://blog.csdn.net/qq825478739/article/details/125421560
@Order + @Bean
@Configuration
public class OrderCreateConfig {
@Bean
@Order(1)
public OrderService createOrder1Service(){
return new Order1ServiceImpl();
}
@Bean
@Order(2)
public OrderService createOrder2Service(){
return new Order2ServiceImpl();
}
@Bean
@Order(3)
public OrderService createOrder3Service(){
return new Order3ServiceImpl();
}
}
@Order + @Component
@Order(3)
@Service
public class Order1ServiceImpl implements OrderService {
public Order1ServiceImpl() {
System.out.println("Order1 创建了");
}
@Override
public void demo() {
System.out.println("Order1 执行了");
}
}
@Order(3)
@Component
public class Order1ServiceImpl implements OrderService {
public Order1ServiceImpl() {
System.out.println("Order1 创建了");
}
@Override
public void demo() {
System.out.println("Order1 执行了");
}
}
实现接口 Ordered
public class Order1ServiceImpl implements OrderService, Ordered {
public Order1ServiceImpl() {
System.out.println("Order1 创建了");
}
@Override
public void demo() {
System.out.println("Order1 执行了");
}
@Override
public int getOrder() {
return 1;
}
}
创建三个OrderServce 的实现类
public interface OrderService {
void demo();
}
@Order(3)
@Service
public class Order1ServiceImpl implements OrderService {
public Order1ServiceImpl() {
System.out.println("Order1 创建了");
}
@Override
public void demo() {
System.out.println("Order1 执行了");
}
}
@Order(2)
@Service
public class Order2ServiceImpl implements OrderService {
public Order2ServiceImpl() {
System.out.println("Order2 创建了");
}
@Override
public void demo() {
System.out.println("Order2 执行了");
}
}
@Order(1)
@Service
public class Order3ServiceImpl implements OrderService {
public Order3ServiceImpl() {
System.out.println("Order3 创建了");
}
@Override
public void demo() {
System.out.println("Order3 执行了");
}
}
Test 执行
@SpringBootTest
class SpringDemoApplicationTests {
@Autowired
private List<OrderService> orderServices;
@Test
void contextLoads() {
orderServices.forEach(orderService -> orderService.demo());
}
}
执行结构
Ordered / @Order 只控制执行顺序, 不控制Spring初始化Bean 的顺序
Spring 版本 5.3.23
各个版本的代码有差异
这个时候就需要对Spring源码有一定了解了
Spring源码解析之Bean实例化流程:https://blog.csdn.net/qq825478739/article/details/127363578?spm=1001.2014.3001.5502
创建一个servce 注入 private List orderServices;
@Component
public class OrderAutoWireDemo {
@Autowired
private List<OrderService> orderServices;
}
这里我们直接跳到 给 OrderAutoWireDemo 注入属性的时候,看他都干了什么。
直接从Spring DI注入属性开始 populateBean
Object result = converter.convertIfNecessary(matchingBeans.values(), type);
if (result instanceof List && ((List)result).size() > 1) {
Comparator<Object> comparator = this.adaptDependencyComparator(matchingBeans);
if (comparator != null) {
((List)result).sort(comparator);
}
}
this.adaptDependencyComparator(matchingBeans);
adaptDependencyComparator() 方法返回是 OrderComparator
OrderComparator实现比较器Comparator接口, ((List)result).sort(comparator);会根据@Order或者Ordered接口设置的int序值重写sort方法进行排序,值越小优先级越高。
通过debug我们我们可以看到注入属性的时候 做了sort排序
最后最后 : 有帮助点个赞 收藏下吧, 有阐述错误的地方请评论指出 。 共同进步