欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot調(diào)整ApplicationContextAware如何實(shí)現(xiàn)類加載順序

 更新時(shí)間:2023年05月26日 15:13:56   作者:windSnowLi  
SpringBoot調(diào)整ApplicationContextAware實(shí)現(xiàn)類加載順序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot調(diào)整ApplicationContextAware實(shí)現(xiàn)類加載順序

自己需要在項(xiàng)目中使用redis-cache插件,但是官方放出來的包太老了,倉(cāng)庫(kù)代碼更新倒是還可以,所以打算自己封裝下,修改下加載配置文件的方式。

需求

有時(shí)候需要在普通類獲取到Bean,但是new出來的對(duì)象不會(huì)被注入,這時(shí)就需要通過SpringBoot上下文去獲取Bean,思路很簡(jiǎn)單,實(shí)現(xiàn)ApplicationContextAware后在類上加個(gè)@Componse注解就可以很容易的實(shí)現(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);
    }
}

思路很簡(jiǎn)單,但是有個(gè)坑,有時(shí)使用到getBean的地方可能applicationContext還沒被注入,這時(shí)會(huì)報(bào)空指針錯(cuò)誤,但是在測(cè)試中又能正確注入,很是惱火。

本機(jī)使用Ubuntu+IDEA開發(fā),由maven進(jìn)行構(gòu)建,本地環(huán)境以及版本與目標(biāo)環(huán)境一致,但是構(gòu)建出來的包(md5)不一樣,本地構(gòu)建出來的包可以在本地以及目標(biāo)環(huán)境運(yùn)行,但是直接在目標(biāo)環(huán)境構(gòu)建的在哪都會(huì)報(bào)applicationContext空指針錯(cuò)誤,可能某些潛在原因,導(dǎo)致編譯結(jié)果不一致,不過既然本地可以正常運(yùn)行,那么肯定有解決辦法。

解決思路

通過調(diào)試發(fā)現(xiàn)使用getBean的地方比注入ApplicationContext要早,最終也會(huì)注入,所以解決思路就是讓需要ApplicationContext的類優(yōu)先加載。

解決辦法兩個(gè)

1.最簡(jiǎn)單,但最奇葩

Bean工具類示例

@Component
public class SpringUtils implements ApplicationContextAware {
	// 還是老樣子
}

啟動(dòng)類添加注解注解@DependsOn(value = "SpringUtils")

注:默認(rèn)方式掃包必須保證SpringUtils在使用getBean文件的前邊,例如同一個(gè)包下SpringUtils文件排在了前遍

2.比較常規(guī)的

Bean工具類示例

@Component //實(shí)測(cè)這個(gè)沒有都行
public class SpringUtils implements ApplicationContextAware {
	// 還是老樣子
}

啟動(dòng)類添加注解注解@Import(SpringUtils.class),并強(qiáng)依賴使用

···
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實(shí)現(xiàn)ApplicationContextAware獲取spring上下文對(duì)象。

問題

之前在mvc環(huán)境下使用一直沒有問題,最近切換成springboot框架,系統(tǒng)啟動(dòng)時(shí)list接口類會(huì)調(diào)用SpringBeanFactory的getbean方法注入一個(gè)bean,發(fā)現(xiàn)SpringBeanFactory的set方法還沒有調(diào)用,就是系統(tǒng)還沒有掃描到SpringBeanFactory對(duì)象;

開始在list接口類上加@Lazy注解,調(diào)用到當(dāng)前類時(shí)再初始化,可以解決當(dāng)前問題,后期發(fā)現(xiàn)這個(gè)類還有靜態(tài)變量,其他地方要用到,如果沒有調(diào)到這個(gè)接口他的靜態(tài)變量使用是否會(huì)有問題?靜態(tài)代碼塊是否執(zhí)行?(時(shí)間問題,沒有測(cè)試)考慮到這些問題,決定不使用@Lazy注解,百度一下發(fā)現(xiàn)

@DependsOn(value = “springBeanFactory”)

可以解決這個(gè)問題。 

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文教你如何使用Java靈活讀取Excel內(nèi)容

    一文教你如何使用Java靈活讀取Excel內(nèi)容

    這篇文章主要給大家介紹了關(guān)于如何使用Java靈活讀取Excel內(nèi)容的相關(guān)資料,讀取Excel數(shù)據(jù)是Java開發(fā)中常見的任務(wù),文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • spring boot項(xiàng)目中MongoDB的使用方法

    spring boot項(xiàng)目中MongoDB的使用方法

    前段時(shí)間分享了關(guān)于Spring Boot中使用Redis的文章,除了Redis之后,我們?cè)诨ヂ?lián)網(wǎng)產(chǎn)品中還經(jīng)常會(huì)用到另外一款著名的NoSQL數(shù)據(jù)庫(kù)MongoDB。下面這篇文章主要給大家介紹了關(guān)于在spring boot項(xiàng)目中MongoDB的使用方法,需要的朋友可以參考下。
    2017-09-09
  • Spring Boot啟動(dòng)過程完全解析(二)

    Spring Boot啟動(dòng)過程完全解析(二)

    這篇文章主要介紹了Spring Boot啟動(dòng)過程完全解析(二),需要的朋友可以參考下
    2017-04-04
  • Maven默認(rèn)使用JDK1.5的問題及解決方案

    Maven默認(rèn)使用JDK1.5的問題及解決方案

    這篇文章主要介紹了Maven默認(rèn)使用JDK1.5的問題及解決方案,本文給大家分享兩種方式,通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Elasticsearch中FST與前綴搜索應(yīng)用實(shí)戰(zhàn)解析

    Elasticsearch中FST與前綴搜索應(yīng)用實(shí)戰(zhàn)解析

    這篇文章主要為大家介紹了Elasticsearch中FST與前綴搜索應(yīng)用實(shí)戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 微服務(wù)之間如何通過feign調(diào)用接口上傳文件

    微服務(wù)之間如何通過feign調(diào)用接口上傳文件

    這篇文章主要介紹了微服務(wù)之間如何通過feign調(diào)用接口上傳文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • springboot?集成identityserver4身份驗(yàn)證的過程解析

    springboot?集成identityserver4身份驗(yàn)證的過程解析

    這篇文章主要介紹了springboot?集成identityserver4身份驗(yàn)證的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 詳解java==運(yùn)算符和equals()方法的區(qū)別

    詳解java==運(yùn)算符和equals()方法的區(qū)別

    這篇文章主要介紹了java==運(yùn)算符和equals()方法的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法

    在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法

    這篇文章主要介紹了在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法,CRUD是指在做計(jì)算處理時(shí)的增加(Create)、重新取得數(shù)據(jù)(Retrieve)、更新(Update)和刪除(Delete)幾個(gè)單詞的首字母簡(jiǎn)寫,需要的朋友可以參考下
    2016-04-04
  • xxl-job的部署及springboot集成使用示例詳解

    xxl-job的部署及springboot集成使用示例詳解

    XXL-Job是一個(gè)分布式任務(wù)調(diào)度平臺(tái),可進(jìn)行任務(wù)調(diào)度、管理和監(jiān)控,并提供任務(wù)分片、失敗重試、動(dòng)態(tài)分配等功能,這篇文章主要介紹了xxl-job的部署及springboot集成使用,需要的朋友可以參考下
    2023-06-06

最新評(píng)論