真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

spring源碼:bean加載相關組件-創(chuàng)新互聯

BeanDefinition的注冊:

通過實現BeanDefinitionRegistry接口,并實現BeanDefinitionRegistry接口的registerBeanDefinition系列方法來將給定的BeanDefinition注冊到BeanFactory中,實現類為DefaultListableBeanFactory 注冊的bd保存到beanDefinitionMap中
1、BeanDefinitionReader接口
方法如loadBeanDefinitions 從xml文件或者類路徑下使用了@Component系列注解的類、或者從@Configuration注解的配置類,獲取BeanDefintiions,然后注冊到BeanFactory中。
實現類XmlBeanDefinitionReader 讀取解析xml文件,通過Parser解析xml文件的標簽。針對beans標簽,生成對應的BeanDefintions,然后注冊到BeanFactory中。 針對其他有特殊功能的標簽,如context:component-scan,context:anotation-config,還可以生成BeanFactoryPostProcessor,BeanPostProcessor接口實現類的bean等;除了可以生成BeanDefinitions之外,還可以實現其他功能。
NamespaceHandler:XML標簽名稱空間處理器 被XmlBeanDefinitionReader使用,XmlBeanDefinitionReader在處理每個XML標簽名稱空間的時候,如applicationContext.xml的context:mvc:,通過一個DefaultNamespaceHandlerResolver來獲取對應的NamespaceHandler實現類,然后通過這個NamespaceHandler實現類,進一步獲取該命名空間的內部標簽對應的BeanDefinitionParser實現類。
handlerMappings保存在META-INF/spring.handlers中 每個handlers繼承NamespaceHandlerSupport, 在內部init方法中通過調用registerBeanDefinitionParser注冊標簽與與對應的BeanDefinitionParser實現類 ,BeanDefinitionParser內部通過parse方法處理標簽邏輯
BeanDefinitionDocumentReader 被XmlBeanDefinitionReader使用,專門用于處理xml文件的beans標簽的標簽處理器。即XmlBeanDefinitionReader讀取xml文件,創(chuàng)建Document對象,然后交給BeanDefinitionDocumentReader處理。BeanDefinitionDocumentReader解析Document對象的Element節(jié)點,然后創(chuàng)建BeanDefinitions集合,通過XmlBeanDefinitionReader注冊到XmlBeanDefinitionReader所在的BeanFactory。

創(chuàng)新互聯建站是專業(yè)的阿勒泰網站建設公司,阿勒泰接單;提供成都做網站、網站制作、成都外貿網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行阿勒泰網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!

2、AnnotatedBeanDefinitionReader
注冊指定的類列表annotatedClasses 可以使用編程方法,顯示指定將哪些類需要注冊到BeanFactory,通過registerBean方法, 內部引用BeanDefinitionRegistry,最后通過registry.registerBeanDefinition注冊到beanFactory中
主要是被AnnotationConfigApplicationContext使用,即基于注解配置的ApplicationContext,這是SpringBoot的默認ApplicationContext。典型使用為:先獲取所有使用了@Configuration注解的類,然后通過AnnotatedBeanDefinitionReader生成與這些類對應的BeanDefinitions,并注冊到BeanFactory。

3、ClassPathBeanDefinitionScanner
調用scan方法 注冊指定的basePackages下面的類掃描指定類路徑(包basePackages)下面的類,檢測是否存在@Component注解及其子注解,從而生成BeanDefinition,然后注冊到BeanFactory。
沒有實現BeanDefinitionReader接口,與AnnotatedBeanDefinitionReader一樣,都是獲取指定類,生成該類的BeanDefinition注冊到BeanFactory,而不是像xml文件一樣已經通過bean標簽顯示說明這個就是bean。
三個使用場景:
1、被AnnotationConfigApplicationContext通過構造函數調用scan
2、在ComponentScanBeanDefinitionParser的parse方法中使用,處理context:component-scan標簽
3、在ComponentScanAnnotationParser的parse方法中使用,處理@Configuration配置類上面的@ComponentScan注解
4、ConfigurationClassBeanDefinitionReader:處理@Configuration注解的配置類,加在這些配置類上面的注解,即與@Configuration一起使用的注解,如@ComponentScan,@PropertySource,@Import,@Profile等。
主要被ConfigurationClassPostProcessor(是一個BeanFactoryPostProcessor)調用,在調用postProcessBeanFactory時在內部的processConfigBeanDefinitions方法中使用

beanDefinitionParser

bean元數據解析執(zhí)行者. xml文件的標簽的解析處理器,通過實現 BeanDefinitionParser接口,來針對每個標簽進行特定。典型用途包括:生成BeanDefintion對象,或BeanFactoryPostProcessor對象,或BeanPostProcessor對象,或者為針對標簽定義特定的功能,自定義該標簽的用途。Parser可以同時生成這三種類型中的一個或多個。如ComponentScanBeanDefinitionParser既生成BeanDefinitions,又生成ConfigurationClassPostProcessor(BeanFactoryPostProcessor接口實現類)。AnnotationConfigBeanDefinitionParser既生成BeanPostProcessor,又生成ConfigurationClassPostProcessor。

  • 直接創(chuàng)建beanDefinition
    DefaultBeanDefinitionDocumentReader、ComponentScanBeanDefinitionParser、ComponentScanAnnotationParser

  • 間接創(chuàng)建BeanDefinition
    創(chuàng)建BeanFactoryPostProcessor->ConfigurationClassPostProcessor:在ComponentScanBeanDefinitionParser和AnnotationConfigBeanDefinitionParser中會創(chuàng)建ConfigurationClassPostProcessor對象實例:這樣由這些parser創(chuàng)建的BeanDefinitions,就可以被ConfigurationClassPostProcessor進一步處理,創(chuàng)建更多的BeanDefintions:
    過濾獲取使用了@Configuration注解的類,然后從這些類的@Bean方法獲取BeanDefintions。

 1、ComponentScanBeanDefinitionParser:對應context:component-scan,在parse方法調用;
             2、AnnotationConfigBeanDefinitionParser:對應context:annotation-config,在parse方法調用;
             3、ClassPathBeanDefinitionScanner:在scan方法調用,該類在AnnotationConfigApplicationContext中使用;
             4、AnnotatedBeanDefinitionReader:在構造函數調用,該類在AnnotationConfigApplicationContext中使用。
  • 創(chuàng)建BeanPostProcessor
    AnnotationConfigBeanDefinitionParser和ComponentScanBeanDefinitionParser會調用AnnotationConfigUtils.registerAnnotationConfigProcessors創(chuàng)建兩個BeanPostProcessor:
 1、CommonAnnotationBeanPostProcessor:處理bean對象及其方法中的JDK自身的注解; @PostConstruct、@PreDestroy
             2、AutowiredAnnotationBeanPostProcessor:bean對象的依賴注入處理,如@Autowired、@Value 及jdk的@Inject
bean工廠后置處理器: BeanFactoryPostProcessor

bean元數據注冊的拓展,在BeanFactory創(chuàng)建好,加載好其所包含的所有beanDefinitions,但是還沒有實例化bean之前,執(zhí)行,具體為調用postProcessBeanFactory方法。
1. 加載更多的bean元數據
ConfigurationClassPostProcessor,用于從BeanFactory中檢測使用了@Configuration注解的類,對于這些類對應的BeanDefinitions集合,遍歷并依次交給ConfigurationClassParser,ConfigurationClassBeanDefinitionReader處理,分別是處理與@Configuration同時使用的其他注解和將類內部的使用@Bean注解的方法,生成BeanDefinition,注冊到BeanFactory。
2. 對bean元數據進行加工處理
BeanDefinition屬性填充、修改:在postProcessBeanFactory方法中,可以對beanFactory所包含的beanDefinitions的propertyValues和構造函數參數值進行修改,如使用PropertyPlaceHolderConfigurer來對BeanDefinition的propertyValues的占位符進行填充、賦值?;蛘呤褂肞ropertyResourceConfigurer獲取config文件中屬性,對BeanDefinitions的相關屬性進行賦值或者值覆蓋。

bean對象后置處理器:BeanPostProcessor

負責對已創(chuàng)建好的bean對象進行加工處理。主要是可以對新創(chuàng)建的bean實例進行修改,提供了一個類似于hook機制,對創(chuàng)建好的bean對象實例進行修改。
核心方法
postProcessBeforeInitialization:在創(chuàng)建好bean實例,但是在任何初始化回調執(zhí)行之前,如InitializingBean的afterPropertiesSet,先執(zhí)行該方法。
postProcessAfterInitialization:在創(chuàng)建好bean實例,并且所有的初始化回調都執(zhí)行完了,如InitializingBean的afterPropertiesSet,再執(zhí)行該方法。

BeanPostProcessor的注冊
定義:在注解配置工具類AnnotationConfigUtils的靜態(tài)方法registerAnnotationConfigProcessors方法中,定義注解的處理器的注冊邏輯。
調用:在BeanFactoryPostProcessor中調用這個靜態(tài)方法來完成將特定的BeanPostProcessor實現類,注冊到ApplicationContext的BeanPostProcessor列表。
AutowiredAnnotationBeanPostProcessor:處理bean對象的依賴注入關系,即從BeanFactory獲取該bean所依賴的bean,然后注入到該bean對應的成員變量中。
CommonAnnotationBeanPostProcessor:該bean中所使用了的JDK定義的注解的處理,如方法中的@PostConstruct,@PreDestroy,成員變量上的@Resource等。
PersistenceAnnotationBeanPostProcessor(JPA時添加):JPA相關bean的持久化處理。

Bean對象實例的注冊

1、通過實現SingletonBeanRegistry接口,實現類DefaultSingletonBeanRegistry, 方法registerSingleton ,保存到singletonObjects的map中,這個類中有三級緩存

//單例對象的緩存:bean名稱到bean實例.            
 private final MapsingletonObjects = new ConcurrentHashMap<>(256);
//單例工廠的緩存:bean name到ObjectFactory.   
private final Map>singletonFactories = new HashMap<>(16);
//早期單例對象的緩存:bean名稱到bean實例。       
private final MapearlySingletonObjects = new ConcurrentHashMap<>(16);
//已注冊的單例bean的名稱.                     
private final SetregisteredSingletons = new LinkedHashSet<>(256);

2、FactoryBean創(chuàng)建的bean對象容器FactoryBeanRegistrySupport:繼承于DefaultSingletonBeanRegistry,映射map中的bean對象實例是通過調用FactoryBean的getObject方法獲取的bean對象。

private final MapfactoryBeanObjectCache = new ConcurrentHashMap<>(16);
    

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧


本文名稱:spring源碼:bean加載相關組件-創(chuàng)新互聯
轉載來于:http://weahome.cn/article/ccogso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部