SpringBoot之Order注解启动顺序说明

网友投稿 634 2022-09-27


SpringBoot之Order注解启动顺序说明

目录Order注解启动顺序order的规则见下它们的启动日志@Order注解提供消费顺序@org.springframework.core.annotation.Order

Order注解启动顺序

order的规则

order的值越小,优先级越高

order如果不标注数字,默认最低优先级,因为其默认值是int最大值

该注解等同于实现Ordered接口getOrder方法,并返回数字。

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})

@Documented

public @interface Order {

/**

* The order value.

*

Default is {@link Ordered#LOWEST_PRECEDENCE}.

* @see Ordered#getOrder()

*/

int value() default Ordered.LOWEST_PRECEDENCE;

}

int LOWEST_PRECEDENCE = Integer.MAX_VALUE;

@Aspect

@Component

public class DataSourceAspect implements Ordered {

@Override

public int getOrder() {

return 1;

}

}

见下

OrderRunner1.java

@Component

@Order(1)

public class OrderRunner1 implements CommandLineRunner {

@Override

public void run(String... args) throws Exception {

System.out.println("The OrderRunner1 start to initialize ...");

}

}

OrderRunner2.java

@Component

@Order(2)

public class OrderRunner2 implements CommandLineRunner {

@Override

public void run(String... args) throws Exception {

System.out.println("The OrderRunner2 start to initialize ...");

}

}

Runner.java

@Component

public class Runner implements CommandLineRunner {

@Override

public void run(String... args) throws Exception {

System.out.println("The Runner start to initialize ...");

}

}

@SpringBootApplication

public class CommandLineRunnerApplication {

public static void main(String[] args) {

System.out.println("The service to start.");

SpringApplication.run(CommandLineRunnerApplication.class, args);

System.out.println("The service has started.");

}

}

它们的启动日志

The service to start.

...

...

The OrderRunner1 start to initialize ...

The OrderRunner2 start to initialize ...

The Runner start to initialize ...

The service has started.

@Order注解提供消费顺序

Order注解可以做到集合bean依赖注入的时候,定义集合内部Bean的加载顺序,因此在需要有序消费bean的时候,不需要再次排序,直接定义好Order注解得value值就好。

但是这个order值并不影响bean本身实例化的顺序,因为实例化的顺序取决于依赖关系。

@org.springframework.core.annotation.Order

@RestController

@RequestMapping(value = "/pc/api/v1/monitor")

@RequiredArgsConstructor

public class AfterRepairConsumer {

private final List postConsumers;

@GetMapping(value = "/create")

public ResponseData create() {

final String repairId = "1";

if (CollectionUtils.isNotEmpty(postConsumers)) {

postConsumers.forEach(e -> e.postHandler(repairId));

}

return new ResponseData<>("success");

}

}

public interface RepairCreatePostConsumer {

/**

* 创建报修单后做什么

*

* @param repairId 报修单ID

*/

void postHandler(String repairId);

}

import org.springframework.core.annotation.Order;

@Service

@RequiredArgsConstructor

@Order(value = 3)

public class SendEmail implements RepairCreatePostConsumer {

@Override

public void postHandler(String repairId) {

System.out.println("为报修单" + repairId + "发送邮件");

}

}

import org.springframework.core.annotation.Order;

@Service

@RequiredArgsConstructor

@Order(value = 2)

public class SendInvoice implements RepairCreatePostConsumer {

@Override

public void postHandler(String repairId) {

System.out.println("为报修单" + repairId + "发送发票");

}

}

import org.springframework.core.annotation.Order;

@Service

@RequiredArgsConstructor

@Order(value = 1)

public class SendMessage implements RepairCreatePostConsumer {

@Override

public void postHandler(String repairId) {

System.out.println("为报修单" + repairId + "发送消息");

}

}

运行结果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:分发列表在重分布中的应用
下一篇:Cisco 路由器上传IOS(二)(cisco路由器设置)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~