Spring Post Processor - BeanFactoryPostProcessor and BeanDefinitionRegistryPostProcessor
Spring Post Processor Beanfactorypostprocessor
BeanPostProcessor : bønnepostprosessor, objektet for oppretting av bønner blir snappet opp før og etter initialisering
Hva er BeanFactoryPostProcessor? :Postprosessoren til beanFactory
* Kalt etter initialisering av BeanFactory for å tilpasse og modifisere innholdet i BeanFactory
*Alle bønnedefinisjoner er lagret og lastet inn i beanFactory, men bønneinstansen er ennå ikke opprettet.
*
BeanFactoryPostProcessor-prinsipp:
* 1), ioc container creation object
* 2) 、 påkalleBeanFactoryPostProcessors (beanFactory)
* Hvordan finne alle BeanFactoryPostProcessors og utføre metodene deres
* 1) Finn alle komponentene i BeanFactoryPostProcessor direkte i BeanFactory og utfør metodene deres
* 2), utfør før du initialiserer andre komponenter
Hva er BeanDefinitionRegistryPostProcessor:
BeanDefinitionRegistryPostProcessor utvider BeanFactoryPostProcessor
* postProcessBeanDefinitionRegistry ()
* Laster inn når all bønnedefinisjonsinformasjon er i ferd med å lastes inn og bønneinstansen ikke er opprettet ennå
*
*Utført fremfor BeanFactoryPostProcessor
*Bruk BeanDefinitionRegistryPostProcessor for å legge til flere komponenter i beholderen
*
BeanDefinitionRegistryPostProcessor prinsipp:
* 1), ioc skape objekt
* 2) 、 oppdater () -》 påkalleBeanFactoryPostProcessors (beanFactory)
* 3) Få alle BeanDefinitionRegistryPostProcessor-komponentene fra beholderen.
* 1. Utløs alle postProcessBeanDefinitionRegistry () -metoder i sin tur
* 2, og utløs deretter metoden postProcessBeanFactory () BeanFactoryPostProcessor
*
* 4), finn deretter BeanFactoryPostProcessor-komponenten fra beholderen, og utløs deretter postProcessBeanFactory () -metoden i sin tur
Merk rekkefølgen for utførelse: BeanDefinitionRegistryPostProcessor har forrang over BeanFactoryPostProcessor, og BeanFactoryPostProcessor har forrang over beaninstansiering
test:
1, opprett en ny MyBeanDefinitionRegistryPostProcessor .java-klasse
- package com.atguigu.ext
- import org.springframework.beans.BeansException
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
- import org.springframework.beans.factory.support.AbstractBeanDefinition
- import org.springframework.beans.factory.support.BeanDefinitionBuilder
- import org.springframework.beans.factory.support.BeanDefinitionRegistry
- import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
- import org.springframework.beans.factory.support.RootBeanDefinition
- import org.springframework.stereotype.Component
- import com.atguigu.bean.Blue
- @Component
- public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println('Number of MyBeanDefinitionRegistryPostProcessor...beans:'+beanFactory.getBeanDefinitionCount())
- }
- //BeanDefinitionRegistry Bean defines the save center of the information. Later, the BeanFactory creates a bean instance according to each bean definition information saved in the BeanDefinitionRegistry.
- @Override
- public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println('Number of postProcessBeanDefinitionRegistry...beans:'+registry.getBeanDefinitionCount())
- //RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class)
- AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition()
- registry.registerBeanDefinition('hello', beanDefinition)
- }
- }
2, den nye MyBeanFactoryPostProcessor.java-klassen
- package com.atguigu.ext
- import java.util.Arrays
- import org.springframework.beans.BeansException
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
- import org.springframework.stereotype.Component
- @Component
- public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
- System.out.println('MyBeanFactoryPostProcessor...postProcessBeanFactory...')
- int count = beanFactory.getBeanDefinitionCount()
- String[] names = beanFactory.getBeanDefinitionNames()
- System.out.println('There is a current BeanFactory'+count+' Beans')
- System.out.println(Arrays.asList(names))
- }
- }
3, ny konfigurasjonsklasse
- @ComponentScan('com.atguigu.ext')
- @Configuration
- public class ExtConfig {
- @Bean
- public Blue blue(){
- return new Blue()
- }
- }
4, test
- package com.atguigu.test
- import org.junit.Test
- import org.springframework.context.ApplicationEvent
- import org.springframework.context.annotation.AnnotationConfigApplicationContext
- import com.atguigu.ext.ExtConfig
- public class IOCTest_Ext {
- @Test
- public void test01(){
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class)
- applicationContext.close()
- }
- }
Testresultater:
Beskrivelse: I henhold til utførelsesordren 1, 2, 3, forklar BeanDefinitionRegistryPostProcessor har forrang over BeanFactoryPostProcessor, og BeanFactoryPostProcessor har forrang over beaninstansiering