中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

高唐企業(yè)做網(wǎng)站推廣網(wǎng)絡(luò)服務(wù)器多少錢一臺

高唐企業(yè)做網(wǎng)站推廣,網(wǎng)絡(luò)服務(wù)器多少錢一臺,網(wǎng)站平臺搭建要多少,公司網(wǎng)站怎么做百度競價(jià)Spring的ApplicationContext是Spring框架中的核心接口之一,它擴(kuò)展了BeanFactory接口,提供了更多的高級特性,如事件發(fā)布、國際化支持、資源訪問等。ApplicationContext的裝載過程是Spring框架中非常重要的一個(gè)環(huán)節(jié)。以下是ApplicationContext裝…

Spring的ApplicationContext是Spring框架中的核心接口之一,它擴(kuò)展了BeanFactory接口,提供了更多的高級特性,如事件發(fā)布、國際化支持、資源訪問等。ApplicationContext的裝載過程是Spring框架中非常重要的一個(gè)環(huán)節(jié)。以下是ApplicationContext裝載過程的源碼分析:

1. 創(chuàng)建ApplicationContext實(shí)例
裝載過程的第一步是創(chuàng)建一個(gè)ApplicationContext的實(shí)例。這通常通過調(diào)用ClassPathXmlApplicationContext、FileSystemXmlApplicationContext或AnnotationConfigApplicationContext等具體實(shí)現(xiàn)類的構(gòu)造函數(shù)來完成。

ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
2. 初始化BeanFactory
在ApplicationContext的實(shí)現(xiàn)類中,裝載過程首先會初始化一個(gè)DefaultListableBeanFactory實(shí)例,這是BeanFactory的一個(gè)具體實(shí)現(xiàn)。

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
3. 設(shè)置BeanFactory屬性
接著,ApplicationContext會設(shè)置BeanFactory的一些屬性,如類加載器、Bean表達(dá)式解析器等。

beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory));
4. 注冊BeanPostProcessors
ApplicationContext會注冊所有的BeanPostProcessor實(shí)現(xiàn)類。這些處理器會在Bean的初始化前后被調(diào)用。

beanFactory.addBeanPostProcessor(new MyBeanPostProcessor());
5. 裝載Bean定義
根據(jù)ApplicationContext的具體實(shí)現(xiàn),它會從不同的源裝載Bean定義。例如,ClassPathXmlApplicationContext會從類路徑下的XML文件中裝載Bean定義。

loadBeanDefinitions(beanFactory);
6. 初始化MessageSource
如果需要,ApplicationContext會初始化一個(gè)MessageSource用于國際化。

initMessageSource();
7. 初始化應(yīng)用事件多播器
ApplicationContext會初始化一個(gè)應(yīng)用事件多播器,用于事件發(fā)布和監(jiān)聽。

initApplicationEventMulticaster();
8. 注冊事件監(jiān)聽器
注冊所有的事件監(jiān)聽器。

registerEventListeners();
9. 初始化其他基礎(chǔ)設(shè)施
初始化其他Spring框架的基礎(chǔ)設(shè)施,如ResourcePatternResolver等。

10. 調(diào)用BeanFactory的preInstantiateSingletons方法
這個(gè)方法會觸發(fā)所有剩余的非懶加載的單例Bean的初始化。

beanFactory.preInstantiateSingletons();
11. 調(diào)用refresh()方法
最后,ApplicationContext會調(diào)用自身的refresh()方法來完成裝載過程。這個(gè)方法會執(zhí)行上述所有步驟,并確保容器完全初始化和就緒。

public void refresh() throws BeansException, IllegalStateException {
// …
}
refresh()方法是裝載過程的核心,它協(xié)調(diào)了容器的初始化和Bean的創(chuàng)建。通過分析refresh()方法的源碼,我們可以深入理解Spring容器是如何工作的。

請注意,上述步驟可能會根據(jù)不同的ApplicationContext實(shí)現(xiàn)類和配置有所變化。此外,Spring框架的版本更新也可能帶來一些實(shí)現(xiàn)上的變化。上述分析基于Spring框架的一般裝載過程。

BeanFactoryPostProcessor源碼分析

BeanFactoryPostProcessor是Spring框架中的一個(gè)重要接口,它允許開發(fā)者在容器實(shí)例化和屬性賦值完成后,初始化Bean之前,執(zhí)行一些自定義邏輯。BeanFactoryPostProcessor接口定義了一個(gè)方法:

public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
源碼分析
在Spring容器初始化過程中,BeanFactoryPostProcessor的邏輯主要在AbstractApplicationContext類中實(shí)現(xiàn)。以下是源碼分析的關(guān)鍵點(diǎn):

注冊BeanFactoryPostProcessor: 在容器初始化時(shí),所有的BeanFactoryPostProcessor實(shí)現(xiàn)類都會被注冊到容器中。

調(diào)用postProcessBeanFactory: 在BeanFactory的標(biāo)準(zhǔn)初始化之后,容器會調(diào)用所有注冊的BeanFactoryPostProcessor的postProcessBeanFactory方法。這個(gè)方法允許開發(fā)者查看和修改BeanFactory中的Bean定義。

修改Bean定義: 在postProcessBeanFactory方法中,開發(fā)者可以添加新的Bean定義、修改現(xiàn)有Bean定義、或者刪除某些Bean定義。

應(yīng)用順序: BeanFactoryPostProcessor的實(shí)現(xiàn)類可以定義它們的應(yīng)用順序。如果需要,可以通過實(shí)現(xiàn)Ordered接口或使用@Order注解來指定順序。

調(diào)用時(shí)機(jī): BeanFactoryPostProcessor的調(diào)用發(fā)生在Bean的屬性賦值之后,初始化之前。這意味著,此時(shí)Bean的屬性已經(jīng)設(shè)置完成,但Bean還沒有被初始化。

異常處理: 如果在BeanFactoryPostProcessor的調(diào)用過程中拋出了異常,容器會捕捉這個(gè)異常,并傳播出去。

與BeanPostProcessor的區(qū)別: BeanFactoryPostProcessor作用于BeanFactory,而BeanPostProcessor作用于具體的Bean。BeanFactoryPostProcessor可以在Bean初始化之前對BeanFactory進(jìn)行修改,而BeanPostProcessor可以在Bean的初始化過程中插入自定義邏輯。

示例
下面是一個(gè)簡單的BeanFactoryPostProcessor實(shí)現(xiàn)示例,它在BeanFactory初始化后打印所有Bean定義的名稱:

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {String[] beanNames = beanFactory.getBeanDefinitionNames();System.out.println("Bean names after BeanFactoryPostProcessor: ");for (String beanName : beanNames) {System.out.println(beanName);}
}

}
通過實(shí)現(xiàn)BeanFactoryPostProcessor接口,開發(fā)者可以在Spring容器初始化Bean之前,對BeanFactory進(jìn)行自定義操作,這為實(shí)現(xiàn)一些高級特性提供了可能,例如自動裝配、Bean定義的動態(tài)修改等。

BeanDefinitionRegistryPostProcessor源碼分析

BeanDefinitionRegistryPostProcessor 是 Spring 框架中的一個(gè)接口,它擴(kuò)展了 BeanFactoryPostProcessor 接口。與 BeanFactoryPostProcessor 相比,BeanDefinitionRegistryPostProcessor 提供了對 BeanDefinitionRegistry 的訪問,允許在 post-processing 階段注冊新的 BeanDefinition。這使得開發(fā)者可以在容器的 BeanDefinition 加載完成之后、實(shí)例化 Bean 之前,動態(tài)地添加或修改 BeanDefinition。

以下是 BeanDefinitionRegistryPostProcessor 接口的定義:

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

/*** 在 BeanFactoryPostProcessor 的 postProcessBeanFactory 調(diào)用之后調(diào)用。* 允許在 BeanDefinitionRegistry 中注冊更多的BeanDefinition。* @param registry BeanDefinitionRegistry 的實(shí)例* @throws org.springframework.beans.BeansException*/
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}
源碼分析
擴(kuò)展 BeanFactoryPostProcessor:BeanDefinitionRegistryPostProcessor 接口繼承自 BeanFactoryPostProcessor,因此它擁有 postProcessBeanFactory 方法的能力,并且可以訪問 ConfigurableListableBeanFactory。

postProcessBeanDefinitionRegistry 方法:這是 BeanDefinitionRegistryPostProcessor 的核心方法,它允許開發(fā)者在 BeanDefinitionRegistry 中注冊新的 BeanDefinition 或修改現(xiàn)有的 BeanDefinition。

調(diào)用時(shí)機(jī):postProcessBeanDefinitionRegistry 方法在 postProcessBeanFactory 方法之后調(diào)用,確保開發(fā)者在注冊新的 BeanDefinition 時(shí),已有的 BeanDefinition 已經(jīng)加載完成。

BeanDefinitionRegistry:BeanDefinitionRegistry 是一個(gè)接口,它定義了注冊、移除和獲取 BeanDefinition 的方法。postProcessBeanDefinitionRegistry 方法提供了對 BeanDefinitionRegistry 的訪問,使得開發(fā)者可以操作 BeanDefinition。

BeanDefinition 的動態(tài)注冊:開發(fā)者可以在 postProcessBeanDefinitionRegistry 方法中使用 BeanDefinitionRegistry 的 registerBeanDefinition 方法來注冊新的 BeanDefinition。

BeanDefinition 的修改:除了注冊新的 BeanDefinition,開發(fā)者還可以修改現(xiàn)有的 BeanDefinition,例如更改 Bean 的作用域、添加屬性等。

異常處理:如果在 postProcessBeanDefinitionRegistry 方法中拋出異常,容器會捕捉這個(gè)異常并傳播出去,這可能會中斷 Bean 的創(chuàng)建過程。

示例
下面是一個(gè)簡單的 BeanDefinitionRegistryPostProcessor 實(shí)現(xiàn)示例,它在 BeanDefinitionRegistry 中注冊一個(gè)新的 BeanDefinition:

public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 可以在這里訪問和修改 beanFactory
}@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 注冊一個(gè)新的 BeanDefinitionRootBeanDefinition beanDefinition = new RootBeanDefinition(MyBean.class);registry.registerBeanDefinition("myBean", beanDefinition);
}

}
通過實(shí)現(xiàn) BeanDefinitionRegistryPostProcessor 接口,開發(fā)者可以在 Spring 容器的 BeanDefinition 加載完成后,動態(tài)地注冊或修改 BeanDefinition,這為實(shí)現(xiàn)一些復(fù)雜的配置和自定義行為提供了強(qiáng)大的支持。

http://www.risenshineclean.com/news/23198.html

相關(guān)文章:

  • 做短視頻的網(wǎng)站收益北京seo公司網(wǎng)站
  • 用html制作網(wǎng)頁青島seo關(guān)鍵詞
  • 簡歷設(shè)計(jì)網(wǎng)官網(wǎng)手機(jī)seo百度點(diǎn)擊軟件
  • 廣州微網(wǎng)站建設(shè)效果長尾關(guān)鍵詞挖掘工具
  • 精品在線開發(fā)網(wǎng)站建設(shè)百度網(wǎng)盤官方網(wǎng)站
  • 服務(wù)一流的做網(wǎng)站短鏈接在線生成器
  • 深圳做網(wǎng)站(官網(wǎng))網(wǎng)頁設(shè)計(jì)制作網(wǎng)站教程
  • 網(wǎng)站制作com cn域名有什么區(qū)別百度認(rèn)證營銷顧問
  • 建站之星怎么免費(fèi)做網(wǎng)站網(wǎng)站百度收錄查詢
  • 企業(yè)公司做網(wǎng)站網(wǎng)絡(luò)推廣代理怎么做
  • 怎樣做克隆網(wǎng)站濟(jì)南網(wǎng)絡(luò)推廣公司
  • 沭陽住房城鄉(xiāng)建設(shè)局網(wǎng)站杭州seo搜索引擎優(yōu)化
  • 深圳網(wǎng)站策劃核心關(guān)鍵詞和長尾關(guān)鍵詞舉例
  • 從化市網(wǎng)站建設(shè)杭州網(wǎng)絡(luò)推廣有限公司
  • 國內(nèi)大型餐飲網(wǎng)站建設(shè)友情鏈接也稱為
  • 網(wǎng)站做跳轉(zhuǎn)南昌seo計(jì)費(fèi)管理
  • 網(wǎng)站建設(shè)做什么seo策略主要包括
  • 網(wǎng)站建設(shè)公司網(wǎng)站模版網(wǎng)頁代碼
  • 什么是網(wǎng)站銷售網(wǎng)站seo資訊
  • 網(wǎng)站制作怎么樣提供會員注冊網(wǎng)店推廣營銷方案
  • 做網(wǎng)站怎么做小圖標(biāo)免費(fèi)做網(wǎng)站怎么做網(wǎng)站
  • 網(wǎng)站宣傳的好處chrome 谷歌瀏覽器
  • 萊陽網(wǎng)站建設(shè)阿拉營銷網(wǎng)站
  • 前端工程師是做網(wǎng)站嗎sem廣告
  • php中網(wǎng)站不同模板后臺邏輯代碼怎么管理免費(fèi)網(wǎng)站注冊com
  • 搞網(wǎng)站網(wǎng)站交換鏈接友情鏈接的作用
  • 百度推廣 網(wǎng)站吸引力正規(guī)seo多少錢
  • 怎樣做阿里巴巴網(wǎng)站kj6699的seo綜合查詢
  • pc網(wǎng)站制作是指什么意思網(wǎng)絡(luò)平臺建設(shè)及運(yùn)營方案
  • 網(wǎng)站建設(shè)公司是什么泉州百度搜索推廣