好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot之Order注解启动顺序说明

Order注解启动顺序

order的规则

order的值越小,优先级越高 order如果不标注数字,默认最低优先级,因为其默认值是int最大值 该注解等同于实现Ordered接口getOrder方法,并返回数字。

?

1

2

3

4

5

6

7

8

9

10

11

@Retention (RetentionPolicy.RUNTIME)

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

@Documented

public @interface Order {

  /**

   * The order value.

   * <p>Default is {@link Ordered#LOWEST_PRECEDENCE}.

   * @see Ordered#getOrder()

   */

  int value() default Ordered.LOWEST_PRECEDENCE;

}

?

1

int LOWEST_PRECEDENCE = Integer.MAX_VALUE;

?

1

2

3

4

5

6

7

8

@Aspect

@Component

public class DataSourceAspect implements Ordered {  

     @Override

     public int getOrder() {

         return 1 ;

     }

}

见下

OrderRunner1.java

?

1

2

3

4

5

6

7

8

@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

?

1

2

3

4

5

6

7

8

9

@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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@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." );

  }

}

它们的启动日志

?

1

2

3

4

5

6

7

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

@RestController

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

@RequiredArgsConstructor

public class AfterRepairConsumer {

     private final List<RepairCreatePostConsumer> 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 + "发送消息" );

     }

运行结果:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/jiangxwa/article/details/87892577

查看更多关于SpringBoot之Order注解启动顺序说明的详细内容...

  阅读:13次