Spring如何使用注解@DependsOn控制Bean加載順序
1. 前言
默認(rèn)情況下,Spring加載Bean的順序是不確定的(或者可以理解為,按編譯后的class文件順序加載)。當(dāng)我們需要控制Bean加載順序以滿足特定的需求時,@DependsOn就派上用場了。
假設(shè)需求場景:
C類加載時要從緩存讀取數(shù)據(jù),D類加載時會初始化緩存數(shù)據(jù)。因此,我們必須控制D類優(yōu)先加載,否則C讀到的緩存會是空的。

2. 代碼實現(xiàn)
先驗證沒有加 @DependsOn 的效果
創(chuàng)建緩存類 MyCache
public class MyCache {
private static Map<String, Object> cache = new HashMap<>();
public static Object get(String key){
return cache.get(key);
}
public static void set(String key, Object value){
cache.put(key, value);
}
}創(chuàng)建 C 類,并在構(gòu)造函數(shù)讀取 MyCache:
@Component
public class C {
public C(){
System.out.println("name:" + MyCache.get("name"));
}
}創(chuàng)建 D 類,并在構(gòu)造函數(shù)初始化 MyCache:
@Component
public class D {
public D(){
MyCache.set("name", "fuhb");
}
}啟動程序,這時會輸出空的數(shù)據(jù):
name:null
這明顯不符合我們的需求,因此修改 C 類,增加 @DependsOn 注解
@Component
@DependsOn(value = { "d" })
public class C {
public C(){
System.out.println("name:" + MyCache.get("name"));
}
}重新啟動程序,正常讀取了MyCache的數(shù)據(jù),說明D優(yōu)先于C加載
name:fuhb
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java之MyBatis的Dao方式以及Dao動態(tài)代理詳解
這篇文章主要介紹了Java之MyBatis的Dao方式以及Dao動態(tài)代理詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
eclipse創(chuàng)建springboot項目的三種方式總結(jié)
這篇文章主要介紹了eclipse創(chuàng)建springboot項目的三種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
關(guān)于Java實體類Serializable序列化接口的作用和必要性解析
序列化是將對象狀態(tài)轉(zhuǎn)化為可保持或者傳輸?shù)母袷竭^程,與序列化相反的是反序列化,完成序列化和反序列化,可以存儲或傳輸數(shù)據(jù),一般情況下,在定義實體類時會使用Serializable,需要的朋友可以參考下2023-05-05
解決grails服務(wù)端口沖突的辦法(grails修改端口號)
grails中默認(rèn)的服務(wù)端口為8080,當(dāng)本機(jī)中需要同時啟動兩個不同的項目時,就會造成端口沖突,下面給出解決方法2013-12-12

