基于SpringBoot开机启动与@Order注解

网友投稿 1041 2022-12-08

基于SpringBoot开机启动与@Order注解

基于SpringBoot开机启动与@Order注解

目录SpringBoot开机启动与@Order注解spring @Order标记@Order标记定义了组件的加载顺序使用spring 3.x 和spring 4.x 的例子

SpringBoot开机启动与@Order注解

package com.example.zcw.runner;

import lombok.extern.slf4j.Slf4j;

import org.springframework.boot.ApplicationArguments;

import org.springframework.boot.ApplicationRunner;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

/**

* @Classname BootApplicationRunner

* @Description TODO

* @Date 2020/3/6 13:06

* @Created by zhaocunwei

*/

@Order(2)

@Slf4j

@Component

public class BootApplicationRunner implements ApplicationRunner {

@Override

public void run(ApplicationArguments args) throws Exception {

log.info("This is BootApplicationRunner ...");

}

}

package com.example.zcw.runner;

import lombok.extern.slf4j.Slf4j;

import org.springframework.boot.CommandLineRunner;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

/**

* @Classname BootCommandLineRunner

* @Description TODO

* @Date 2020/3/6 13:09

* @Created by zhaocunwei

*/

@Order(1)

@Slf4j

@Component

public class BootCommandLineRunner implements CommandLineRunner {

@Override

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

log.info("This is BootCommandLineRunner ...");

}

}

spring @Order标记

@Order标记定义了组件的加载顺序

@Order标记从spring 2.0出现,但是在spring 4.0之前,@Order标记只支持AspectJ的切面排序。spring 4.0对@Order做了增强,它开始支持对装载在诸如Lists和Arrays容器中的自动包装(auto-wired)组件的排序。

在spring内部,对基于spring xml的应用,spring使用OrderComparator类来实现排序。对基于注解的应用,spring采用AnnotationAwareOrderComparator来实现排序。

@Order 标记定义如下:

@Retention(value=RUNTIME)

@Target(value={TYPE,METHOD,FIELD})

@Documented

public @interface Order

这个标记包含一个value属性。属性接受整形值。如:1,2 等等。值越小拥有越高的优先级。

下面让我们来看一个

使用spring 3.x 和spring 4.x 的例子

Ranks.java

package com.javapapers.spring3.autowire.collection;

public interface Ranks {

}

RankOne.java

package com.javapapers.spring3.autowire.collection;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

@Component

public class RankOne implements Ranks{

private String rank = "RankOne";

public String toString(){

return this.rank;

}

}

RankTwo.java

package com.javapapers.spring3.autowire.collection;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

@Component

public class RankTwo implements Ranks{

private String rank = "RankTwo";

public String toString(){

return this.rank;

}

}

RankThree.java

package com.javapapers.spring3.autowire.collection;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

@Component

public class RankThree implements Ranks{

private String rank = "RankThree";

public String toString(){

return this.rank;

}

}

Results.java

Component to hold student ranks in a collection as shown below.

package com.javapapers.spring3.autowire.collection;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

@Component

public class Results {

@Autowired

private List ranks ;

@Override

public String toString(){

return ranks.toString();http://

}

}

beans.xml

xmlns="http://springframework.org/schema/beans"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context.xsd">

xmlns="http://springframework.org/schema/beans"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context.xsd">

RanksClient.java

package com.javapapers.spring3.autowire.collection;

import org.springframework.context.ApplicationContext;

import org.sprhttp://ingframework.context.support.ClassPathXmlApplicationContext;

public class RanksClient {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Results results = (Results)context.getBean("results");

System.out.println(results);

}

}

输出结果:

[RankOne, RankThree, RankTwo]

从结果可以看出,结果是没有顺序的。因为spring 3.x不支持对自动包装组件的排序。

接下来,我升级spring的版本至4.x, 并对RanOne,RankTwo和RankThree加上order标记,值做相应的调整。

@Component

@Order(1)

public class RankOne implements Ranks{

private String rank = "RankOne";

public String toString(){

return this.rank;

}

}

输出结果如下:

[RankOne, RankTwo, RankThree]

参考文章: http://javapapers.com/spring/spring-order-annotation/

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

上一篇:使用springBoot中的info等级通过druid打印sql
下一篇:关于Spring的@Autowired依赖注入常见错误的总结
相关文章

 发表评论

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