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

Bean實(shí)例化之前修改BeanDefinition示例詳解

 更新時(shí)間:2022年12月26日 15:25:55   作者:刨紅薯的小羊竿爾  
這篇文章主要為大家介紹了Bean實(shí)例化之前修改BeanDefinition示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

BeanFactory

BeanFactory是Spring中容器功能的基礎(chǔ),用于存放所有已經(jīng)加載的bean,為了保證程序上的高可擴(kuò)展性,Spring針對(duì)BeanFactory做了大量的擴(kuò)展。BeanFactoryPostProcessor是BeanFactory的后置處理器;比如在postProcessBeanFactory方法中,可以獲取BeanDefinition的相關(guān)對(duì)象,并且修改該對(duì)象的屬性。

@FunctionalInterface
public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}

通過BeanDefinition對(duì)象實(shí)例化Bean對(duì)象

Spring IOC在實(shí)例化Bean對(duì)象之前,需要先讀取Bean的相關(guān)屬性,保存到BeanDefinition對(duì)象中,然后通過BeanDefinition對(duì)象,實(shí)例化Bean對(duì)象。如果我們需要修改BeanDefinition對(duì)象中的屬性,就可以實(shí)現(xiàn)BeanFactoryPostProcessor接口,重寫postProcessBeanFactory方法進(jìn)行自定義,是不是很方便呢。

    @Component
    public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
            DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
            BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
            beanDefinitionBuilder.addPropertyValue("id", 123456);
            beanDefinitionBuilder.addPropertyValue("label", "技術(shù)那些事兒");
            defaultListableBeanFactory.registerBeanDefinition("user", beanDefinitionBuilder.getBeanDefinition());
        }
    }

BeanFactoryPostProcessor使用目的:在BeanFactory標(biāo)準(zhǔn)初始化之后調(diào)用,用來定制和修改BeanFactory的內(nèi)容;

BeanFactoryPostProcessor工作時(shí)機(jī):所有的bean定義已經(jīng)保存加載到beanFactory中,但bean的實(shí)例還沒創(chuàng)建;

BeanFactoryPostProcessor和BeanPostProcessor類似,可以對(duì)beanDefinition進(jìn)行處理,也就是說SpringIOC容器允許BeanFactoryPostProcessor在容器實(shí)際實(shí)例化任何bean之前讀取beanDefinition,并有可能修改它。并且我們還可以配置自定義的BeanFactoryPostProcessor,如果想改變bean,那么使用beanPostProcessor。

并可以通過order屬性來控制BeanFactoryPostProcessor的執(zhí)行次序;因?yàn)橹挥袑?shí)現(xiàn)了Ordered接口時(shí),才可以設(shè)置這個(gè)屬性,所以在實(shí)現(xiàn)BeanFactoryPostProcessor的時(shí)候,就應(yīng)該考慮實(shí)現(xiàn)Ordered接口。

BeanFactoryPostProcessor的作用域是容器級(jí)的,只和你使用的容器有關(guān),如果在一個(gè)容器中定義了一個(gè)BeanFactoryPostProcessor,它僅僅對(duì)此容器中的beanDefinition進(jìn)行后處理。BeanFactoryPostProcessor不會(huì)對(duì)定義在另一個(gè)容器中的bean進(jìn)行后處理,即便這兩個(gè)容器都在同一個(gè)層次上。

BeanFactoryPostProcessor還有一個(gè)子接口BeanDefinitionRegistryPostProcessor,其內(nèi)部添加了一個(gè)方法postProcessBeanDefinitionRegistry:

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

ConfigurationClassPostProcessor這個(gè)類非常重要,其實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口與PriorityOrdered接口:

public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor,
                PriorityOrdered, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware 
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
	int registryId = System.identityHashCode(registry);
	if (this.registriesPostProcessed.contains(registryId)) {
		throw new IllegalStateException(
				"postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
	}
	if (this.factoriesPostProcessed.contains(registryId)) {
		throw new IllegalStateException(
				"postProcessBeanFactory already called on this post-processor against " + registry);
	}
	this.registriesPostProcessed.add(registryId);
	/**
	 * @author lcy
	 * 處理配置beanDefinition
	 */
	processConfigBeanDefinitions(registry);
}

就是在這個(gè)方法里將配置類指定的類解析為BeanDefinition對(duì)象,并放入BeanFactory的beanDefinitionMap中。還有一點(diǎn)需要說明,這個(gè)類是在執(zhí)行AnnotationConfigApplicationContext的無參構(gòu)造方法時(shí)被解析為beanDefinition并放入map中的。在AnnotationConfigApplicationContext的refresh()內(nèi)部的 invokeBeanFactoryPostProcessors(beanFactory)方法完成了對(duì) BeanFactoryPostProcessor對(duì)象與BeanDefinitionRegistryPostProcessor對(duì)象相關(guān)方法的執(zhí)行。

以上就是Bean實(shí)例化之前修改BeanDefinition示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Bean實(shí)例化修改BeanDefinition的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java設(shè)計(jì)模式之構(gòu)建者模式知識(shí)總結(jié)

    Java設(shè)計(jì)模式之構(gòu)建者模式知識(shí)總結(jié)

    這幾天剛好在復(fù)習(xí)Java的設(shè)計(jì)模式,今天就給小伙伴們?nèi)婵偨Y(jié)一下開發(fā)中最常用的設(shè)計(jì)模式-建造者模式的相關(guān)知識(shí),里面有很詳細(xì)的代碼示例及注釋哦,需要的朋友可以參考下
    2021-05-05
  • Java實(shí)現(xiàn)掃雷游戲詳細(xì)代碼講解

    Java實(shí)現(xiàn)掃雷游戲詳細(xì)代碼講解

    windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經(jīng)典游戲,本文將利用Java語言實(shí)現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Java基于Scanner對(duì)象的簡單輸入計(jì)算功能示例

    Java基于Scanner對(duì)象的簡單輸入計(jì)算功能示例

    這篇文章主要介紹了Java基于Scanner對(duì)象的簡單輸入計(jì)算功能,結(jié)合實(shí)例形式分析了Java使用Scanner對(duì)象獲取用戶輸入半徑值計(jì)算圓形面積功能,需要的朋友可以參考下
    2018-01-01
  • Java實(shí)現(xiàn)按中文首字母排序的具體實(shí)例

    Java實(shí)現(xiàn)按中文首字母排序的具體實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)按中文首字母排序的具體實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • mybatis中點(diǎn)擊mapper接口快速定位到對(duì)應(yīng)xml中sql方式

    mybatis中點(diǎn)擊mapper接口快速定位到對(duì)應(yīng)xml中sql方式

    這篇文章主要介紹了mybatis中點(diǎn)擊mapper接口快速定位到對(duì)應(yīng)xml中sql方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 如何設(shè)置springboot啟動(dòng)端口

    如何設(shè)置springboot啟動(dòng)端口

    spring boot是個(gè)好東西,可以不用容器直接在main方法中啟動(dòng),而且無需配置文件,方便快速搭建環(huán)境。下面給大家介紹springboot啟動(dòng)端口的設(shè)置方法和spring boot創(chuàng)建應(yīng)用端口沖突8080 問題,感興趣的朋友一起看看吧
    2017-08-08
  • Spring Boot中快速操作Mongodb數(shù)據(jù)庫指南

    Spring Boot中快速操作Mongodb數(shù)據(jù)庫指南

    這篇文章主要給大家介紹了關(guān)于Spring Boot中如何快速操作Mongodb的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java實(shí)現(xiàn)PDF在線預(yù)覽功能(四種方式)

    Java實(shí)現(xiàn)PDF在線預(yù)覽功能(四種方式)

    這篇文章主要介紹了Java實(shí)現(xiàn)PDF在線預(yù)覽功能的四種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot集成tomcat詳解實(shí)現(xiàn)過程

    SpringBoot集成tomcat詳解實(shí)現(xiàn)過程

    采用spring boot之后,一切變得如此簡單,打包->java-jar->運(yùn)維,只需要一個(gè)jar包便可以隨意部署安裝。這篇文章,將對(duì) spring boot集成tomcat的源碼進(jìn)行分析,探索其內(nèi)部的原理
    2023-02-02
  • springboot如何通過@Value,@ConfigurationProperties獲取配置

    springboot如何通過@Value,@ConfigurationProperties獲取配置

    這篇文章主要介紹了springboot如何通過@Value,@ConfigurationProperties獲取配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

上饶市| 涞水县| 尼玛县| 绍兴县| 保山市| 靖宇县| 萍乡市| 确山县| 都兰县| 嵩明县| 聂荣县| 双流县| 醴陵市| 连江县| 通河县| 齐齐哈尔市| 嵩明县| 浦北县| 微山县| 中方县| 泗洪县| 车致| 元氏县| 海淀区| 城步| 达尔| 马山县| 苍山县| 宁阳县| 临漳县| 东莞市| 黔江区| 高密市| 临潭县| 西平县| 深水埗区| 马边| 德庆县| 赤壁市| 囊谦县| 阜宁县|