基于SpringBoot開(kāi)機(jī)啟動(dòng)與@Order注解
SpringBoot開(kāi)機(jī)啟動(dòng)與@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標(biāo)記
@Order標(biāo)記定義了組件的加載順序
@Order標(biāo)記從spring 2.0出現(xiàn),但是在spring 4.0之前,@Order標(biāo)記只支持AspectJ的切面排序。spring 4.0對(duì)@Order做了增強(qiáng),它開(kāi)始支持對(duì)裝載在諸如Lists和Arrays容器中的自動(dòng)包裝(auto-wired)組件的排序。
在spring內(nèi)部,對(duì)基于spring xml的應(yīng)用,spring使用OrderComparator類來(lái)實(shí)現(xiàn)排序。對(duì)基于注解的應(yīng)用,spring采用AnnotationAwareOrderComparator來(lái)實(shí)現(xiàn)排序。
@Order 標(biāo)記定義如下:
@Retention(value=RUNTIME)
@Target(value={TYPE,METHOD,FIELD})
@Documented
public @interface Order
這個(gè)標(biāo)記包含一個(gè)value屬性。屬性接受整形值。如:1,2 等等。值越小擁有越高的優(yōu)先級(jí)。
下面讓我們來(lái)看一個(gè)
使用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();
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <context:component-scan base-package="com.javapapers.spring3"/> </beans>
RanksClient.java
package com.javapapers.spring3.autowire.collection;
import org.springframework.context.ApplicationContext;
import org.springframework.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);
}
}
輸出結(jié)果:
[RankOne, RankThree, RankTwo]
從結(jié)果可以看出,結(jié)果是沒(méi)有順序的。因?yàn)閟pring 3.x不支持對(duì)自動(dòng)包裝組件的排序。
接下來(lái),我升級(jí)spring的版本至4.x, 并對(duì)RanOne,RankTwo和RankThree加上order標(biāo)記,值做相應(yīng)的調(diào)整。
@Component
@Order(1)
public class RankOne implements Ranks{
private String rank = "RankOne";
public String toString(){
return this.rank;
}
}
輸出結(jié)果如下:
[RankOne, RankTwo, RankThree]
參考文章: http://javapapers.com/spring/spring-order-annotation/
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java 實(shí)現(xiàn)回調(diào)代碼實(shí)例
本文主要介紹Java的回調(diào)機(jī)制,并附實(shí)例代碼以供大家參考學(xué)習(xí),有需要的小伙伴可以看下2016-07-07
logback的ShutdownHook關(guān)閉原理解析
這篇文章主要為大家介紹了logback的ShutdownHook關(guān)閉原理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
IDEA中配置多個(gè)版本的JDK的實(shí)現(xiàn)示例
IDEA可以配置多個(gè)JDK,根據(jù)需要使用不同版本的,本文就來(lái)介紹一下IDEA中配置多個(gè)版本的JDK的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
Maven實(shí)戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)
本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Java實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類操作,結(jié)合完整示例形式分析了Java動(dòng)態(tài)創(chuàng)建類的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
java中ThreadPoolExecutor常識(shí)匯總
這篇文章主要介紹了java中ThreadPoolExecutor常識(shí)匯總,線程池技術(shù)在并發(fā)時(shí)經(jīng)常會(huì)使用到,java中的線程池的使用是通過(guò)調(diào)用ThreadPoolExecutor來(lái)實(shí)現(xiàn)的,需要的朋友可以參考下2019-06-06
Java中mybatis關(guān)于example類的使用詳解
這篇文章主要介紹了Java中mybatis中關(guān)于example類的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
SpringBoot生產(chǎn)環(huán)境打包如何去除無(wú)用依賴
這篇文章主要介紹了SpringBoot生產(chǎn)環(huán)境打包如何去除無(wú)用依賴問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

