最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot如何讀取自定義properties并注入到bean中

 更新時間:2021年11月29日 10:39:22   作者:ming199481  
這篇文章主要介紹了springboot讀取自定義properties并注入到bean中,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

讀取自定義properties注入到bean

在使用springboot項目時,可使用@value的方式直接讀取application.properties中的文件,但有時我們需要配置自定義的properties,下面方法將在springboot啟動時利用fileinputstream讀取properties文件中的內(nèi)容,并注入到bean中,@Configuration注解會在springboot啟動時執(zhí)行一次,代碼如下:

package com.shanqis.parking.properties; 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
 
/**
 * 讀取resource下的.properties文件,將文件中的內(nèi)容封裝到map中,注入到bean中方便依賴注入
 *
 * @author Administrator
 */
@Configuration
public class PropertiesClassLoader { 
    private Logger logger = LoggerFactory.getLogger(PropertiesClassLoader.class); 
    private Map<String, Object> versionProperties = new HashMap<>(16); 
    private void init(String name) { 
        try {
            Properties properties = new Properties(); 
            InputStream in = PropertiesClassLoader.class.getClassLoader().getResourceAsStream(name + ".properties"); 
            properties.load(in); 
            logger.info("加載{}.properties參數(shù)", name); 
            for (String keyName : properties.stringPropertyNames()) {
                String value = properties.getProperty(keyName); 
                if ("version".equals(name)) {
                    versionProperties.put(keyName, value);
                } 
                logger.info("{}.properties---------key:{},value:{}", name, keyName, value);
            }
            logger.info("{}.properties參數(shù)加載完畢", name);
        } catch (IOException ignored) { 
        } 
    }
 
    @Bean(name = "versionProperties")
    public Map<String, Object> commonMap() {
        init("version");
        return versionProperties;
    }
}

springboot啟動日志如下

然后在controller層或者service層等可以這樣使用

/**
	 * 讀取common.properties文件
	 */
	@Autowired @Qualifier("commonMap")
	protected Map<String, String> commonMap;

springboot bean實例化和屬性注入過程

springboot版本(2.0.4 RELEASE)

大致描述springboot中bean的實例化和屬性注入過程流程

1) 在某一時刻Spring調(diào)用了Bean工廠的getBean(beanName)方法。beanName可能是simpleController,或者simpleService,simpleDao,順序沒關(guān)系(因為后面會有依賴關(guān)系的處理)。我們假設(shè)simpleController吧

2)getBean方法首先會調(diào)用Bean工廠中定義的getSingleton(beanName)方法,來判斷是否存在該名字的bean單例,如果存在則返回,方法調(diào)用結(jié)束(spring默認是單例,這樣可以提高效率)

3) 否則,Spring會檢查是否存在父工廠,如果有則返回,方法調(diào)用結(jié)束

4) 否則,Spring會檢查bean定義(BeanDefinition實例,用來描述Bean結(jié)果,component-scan掃描后,就是將beanDefinition實例放入Bean工廠,此時還沒有被實例化)是否有依賴關(guān)系,如果有,執(zhí)行1)步,獲取依賴的bean實例

5) 否則,Spring會嘗試創(chuàng)建這個bean實例,創(chuàng)建實例前,Spring會檢查調(diào)用的構(gòu)造器,并實例化該Bean,(通過Constructor.newInstance(args)進行實例化)

6) 實例化完成后,Spring會調(diào)用Bean工廠的populateBean方法來填充bean實例的屬性,也就是自動裝配。populateBean方法便是調(diào)用了BeanPostProcessor實例來完成屬性元素的自動裝配工作

7)在元素裝配過程中,Spring會檢查被裝配的屬性是否存在自動裝配的其他屬性,然后遞歸調(diào)用getBean方法,知道所有@Autowired的元素都被裝配完成。如在裝配simpleController中的simpleService屬性時,發(fā)現(xiàn)SimpleServiceImpl實例中存在@Autowired屬性simpleDao,然后調(diào)用getBean(simpleDao)方法,同樣會執(zhí)行1)----7)整個過程。所有可以看成一個遞歸過程。

8)裝配完成后,Bean工廠會將所有的bean實例都添加到工廠中來。

Bean的實例化

1. 進入SpringApplication類中refreshContext()方法

2. 進入AbstractApplicationContext類中refresh()方法,找到this.finishBeanFactoryInitialization()方法,這個方法就是完成beanFactory的實例化

3. 進入AbstractApplicationContext類中finishBeanFactoryInitialization()方法,找到preInstantiateSingletons()

4. 進入DefaultListableBeanFactory類中preInstantiateSingletons()方法,找到getBean()方法

5. 進入AbstractBeanFactory類中g(shù)etBean()方法,找到doGetBean()方法

6. 在AbstractBeanFactory類中doGetBean方法中,找到createBean()方法

7. 進入AbstractAutowireCapableBeanFactory類中createBean方法中,找到doCreateBean()方法

8. 在AbstractAutowireCapableBeanFactory類中doCreateBean()方法中,找到createBeanInstance()方法,看名字就知道是實例化bean的

9. 在AbstractAutowireCapableBeanFactory類createBeanInstance()方法中,找到instantiateBean()方法

10. 在AbstractAutowireCapableBeanFactory類instantiateBean()方法中,找到instantiate()方法

11. 在SimpleInstantiationStrategy類instantiate()方法中,找到instantiateClass()方法

12. 在BeanUtils類instantiateClass()方法中,可知bean的實例化是通過Constructor.newInstance()進行實例化

Bean的屬性注入

1. 在AbstractAutowireCapableBeanFactory類doCreateBean()方法中,找到populateBean()方法,從名字可知是用來填充bean的

2. 在AbstractAutowireCapableBeanFactory類中populateBean()方法,找到postProcessPropertyValues()方法

3. 進入AutowiredAnnotationBeanPostProcessor類中postProcessPropertyValues()方法中,找到findAutowiringMetadata()方法,在這個方法中,如果屬性中含有@Autowired注解則會遞歸getBean()。沒有然后進入inject()方法中

4. 進入AutowiredAnnotationBeanPostProcessor類inject方法中,找到resolveDependency()方法,通過這個方法獲取對應(yīng)字段的值

5. 進入AutowiredAnnotationBeanPostProcessor類inject方法中,找到field.set(bean, value)方法,通過反射將值設(shè)置到屬性中

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

相關(guān)文章

  • java設(shè)計模式之組合模式(Composite)

    java設(shè)計模式之組合模式(Composite)

    這篇文章主要為大家詳細介紹了java設(shè)計模式之組合模式Composite,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • java使用MulticastSocket實現(xiàn)基于廣播的多人聊天室

    java使用MulticastSocket實現(xiàn)基于廣播的多人聊天室

    這篇文章主要為大家詳細介紹了java使用MulticastSocket實現(xiàn)基于廣播的多人聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java調(diào)用商品詳情API的項目實踐

    Java調(diào)用商品詳情API的項目實踐

    在現(xiàn)代電子商務(wù)網(wǎng)站中,商品詳情API是一個重要的組件,本文就來介紹一下Java調(diào)用商品詳情API的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • spring-boot項目啟動遲緩異常排查解決記錄

    spring-boot項目啟動遲緩異常排查解決記錄

    這篇文章主要為大家介紹了spring-boot項目啟動遲緩異常排查解決記錄,突然在本地啟動不起來了,表象特征就是在本地IDEA上運行時,進程卡住也不退出,應(yīng)用啟動時加載相關(guān)組件的日志也不輸出
    2022-02-02
  • Java實戰(zhàn)之利用POI生成Excel圖表

    Java實戰(zhàn)之利用POI生成Excel圖表

    Apache POI是Java生態(tài)中處理Office文檔的核心工具,這篇文章主要為大家詳細介紹了如何在Excel中創(chuàng)建折線圖,柱狀圖,餅圖等常見圖表,需要的可以參考下
    2025-02-02
  • 超詳細解析Spring Bean的創(chuàng)建過程

    超詳細解析Spring Bean的創(chuàng)建過程

    這篇文章主要揭秘了Spring Bean的創(chuàng)建過程,文中通過代碼示例和圖文結(jié)合的方式解析的超級詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Java線程的6種狀態(tài)及切換教程

    Java線程的6種狀態(tài)及切換教程

    這篇文章主要給大家介紹了關(guān)于Java線程的6種狀態(tài)及切換教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的開發(fā)工作中,處理數(shù)據(jù)庫查詢是一個非常常見的任務(wù),尤其是當(dāng)我們需要在復(fù)雜條件下篩選數(shù)據(jù)時,如何編寫高效、簡潔且可維護的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下
    2024-10-10
  • Java導(dǎo)出oracle表結(jié)構(gòu)實例詳解

    Java導(dǎo)出oracle表結(jié)構(gòu)實例詳解

    這篇文章主要介紹了 Java導(dǎo)出oracle表結(jié)構(gòu)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring Cloud-Feign服務(wù)調(diào)用的問題及處理方法

    Spring Cloud-Feign服務(wù)調(diào)用的問題及處理方法

    Feign 是一個聲明式的 REST 客戶端,它用了基于接口的注解方式,很方便實現(xiàn)客戶端配置。接下來通過本文給大家介紹Spring Cloud-Feign服務(wù)調(diào)用,需要的朋友可以參考下
    2021-10-10

最新評論

崇阳县| 荔波县| 安丘市| 洛川县| 康平县| 古浪县| 内江市| 巨鹿县| 吉安市| 南投县| 孟连| 钟祥市| 额敏县| 菏泽市| 涡阳县| 璧山县| 蒙自县| 卓尼县| 邢台县| 托克托县| 徐闻县| 兴安县| 崇仁县| 富川| 吉木萨尔县| 资源县| 衢州市| 龙泉市| 分宜县| 微山县| 集贤县| 日照市| 永善县| 阳谷县| 旬阳县| 东兰县| 万荣县| 祁东县| 佛学| 虎林市| 祁阳县|