SpringBoot調(diào)整ApplicationContextAware如何實現(xiàn)類加載順序
SpringBoot調(diào)整ApplicationContextAware實現(xiàn)類加載順序
自己需要在項目中使用redis-cache插件,但是官方放出來的包太老了,倉庫代碼更新倒是還可以,所以打算自己封裝下,修改下加載配置文件的方式。
需求
有時候需要在普通類獲取到Bean,但是new出來的對象不會被注入,這時就需要通過SpringBoot上下文去獲取Bean,思路很簡單,實現(xiàn)ApplicationContextAware后在類上加個@Componse注解就可以很容易的實現(xiàn)加載上下文
例如:
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}思路很簡單,但是有個坑,有時使用到getBean的地方可能applicationContext還沒被注入,這時會報空指針錯誤,但是在測試中又能正確注入,很是惱火。
坑
本機使用Ubuntu+IDEA開發(fā),由maven進行構(gòu)建,本地環(huán)境以及版本與目標環(huán)境一致,但是構(gòu)建出來的包(md5)不一樣,本地構(gòu)建出來的包可以在本地以及目標環(huán)境運行,但是直接在目標環(huán)境構(gòu)建的在哪都會報applicationContext空指針錯誤,可能某些潛在原因,導致編譯結(jié)果不一致,不過既然本地可以正常運行,那么肯定有解決辦法。
解決思路
通過調(diào)試發(fā)現(xiàn)使用getBean的地方比注入ApplicationContext要早,最終也會注入,所以解決思路就是讓需要ApplicationContext的類優(yōu)先加載。
解決辦法兩個
1.最簡單,但最奇葩
Bean工具類示例
@Component
public class SpringUtils implements ApplicationContextAware {
// 還是老樣子
}啟動類添加注解注解@DependsOn(value = "SpringUtils")
注:默認方式掃包必須保證SpringUtils在使用getBean文件的前邊,例如同一個包下SpringUtils文件排在了前遍
2.比較常規(guī)的
Bean工具類示例
@Component //實測這個沒有都行
public class SpringUtils implements ApplicationContextAware {
// 還是老樣子
}啟動類添加注解注解@Import(SpringUtils.class),并強依賴使用
···
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
···
···
@Import(SpringUtils.class)
public class LBlogApplication {
@Autowired
public void setRedisConfigurationBuilder(RedisConfigurationBuilder redisConfigurationBuilder) {
// 為了優(yōu)先加載
}
public static void main(String[] args) {
···
}
}ApplicationContextAware加載順序遇到的問題
公司使用的是自主研發(fā)的框架,類似ibatis,封裝可統(tǒng)一的list查詢接口,自定義SpringBeanFactory實現(xiàn)ApplicationContextAware獲取spring上下文對象。
問題
之前在mvc環(huán)境下使用一直沒有問題,最近切換成springboot框架,系統(tǒng)啟動時list接口類會調(diào)用SpringBeanFactory的getbean方法注入一個bean,發(fā)現(xiàn)SpringBeanFactory的set方法還沒有調(diào)用,就是系統(tǒng)還沒有掃描到SpringBeanFactory對象;
開始在list接口類上加@Lazy注解,調(diào)用到當前類時再初始化,可以解決當前問題,后期發(fā)現(xiàn)這個類還有靜態(tài)變量,其他地方要用到,如果沒有調(diào)到這個接口他的靜態(tài)變量使用是否會有問題?靜態(tài)代碼塊是否執(zhí)行?(時間問題,沒有測試)考慮到這些問題,決定不使用@Lazy注解,百度一下發(fā)現(xiàn)
@DependsOn(value = “springBeanFactory”)
可以解決這個問題。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Elasticsearch中FST與前綴搜索應用實戰(zhàn)解析
這篇文章主要為大家介紹了Elasticsearch中FST與前綴搜索應用實戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
springboot?集成identityserver4身份驗證的過程解析
這篇文章主要介紹了springboot?集成identityserver4身份驗證的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
在Java的MyBatis框架中建立接口進行CRUD操作的方法
這篇文章主要介紹了在Java的MyBatis框架中建立接口進行CRUD操作的方法,CRUD是指在做計算處理時的增加(Create)、重新取得數(shù)據(jù)(Retrieve)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫,需要的朋友可以參考下2016-04-04

