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

  1. package com.atguigu.ext
  2. import org.springframework.beans.BeansException
  3. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
  4. import org.springframework.beans.factory.support.AbstractBeanDefinition
  5. import org.springframework.beans.factory.support.BeanDefinitionBuilder
  6. import org.springframework.beans.factory.support.BeanDefinitionRegistry
  7. import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
  8. import org.springframework.beans.factory.support.RootBeanDefinition
  9. import org.springframework.stereotype.Component
  10. import com.atguigu.bean.Blue
  11. @Component
  12. public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{
  13. @Override
  14. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  15. // TODO Auto-generated method stub
  16. System.out.println('Number of MyBeanDefinitionRegistryPostProcessor...beans:'+beanFactory.getBeanDefinitionCount())
  17. }
  18. //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.
  19. @Override
  20. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
  21. // TODO Auto-generated method stub
  22. System.out.println('Number of postProcessBeanDefinitionRegistry...beans:'+registry.getBeanDefinitionCount())
  23. //RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class)
  24. AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition()
  25. registry.registerBeanDefinition('hello', beanDefinition)
  26. }
  27. }

2, den nye MyBeanFactoryPostProcessor.java-klassen



  1. package com.atguigu.ext
  2. import java.util.Arrays
  3. import org.springframework.beans.BeansException
  4. import org.springframework.beans.factory.config.BeanFactoryPostProcessor
  5. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
  6. import org.springframework.stereotype.Component
  7. @Component
  8. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  9. @Override
  10. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  11. System.out.println('MyBeanFactoryPostProcessor...postProcessBeanFactory...')
  12. int count = beanFactory.getBeanDefinitionCount()
  13. String[] names = beanFactory.getBeanDefinitionNames()
  14. System.out.println('There is a current BeanFactory'+count+' Beans')
  15. System.out.println(Arrays.asList(names))
  16. }
  17. }

3, ny konfigurasjonsklasse

  1. @ComponentScan('com.atguigu.ext')
  2. @Configuration
  3. public class ExtConfig {
  4. @Bean
  5. public Blue blue(){
  6. return new Blue()
  7. }
  8. }

4, test

  1. package com.atguigu.test
  2. import org.junit.Test
  3. import org.springframework.context.ApplicationEvent
  4. import org.springframework.context.annotation.AnnotationConfigApplicationContext
  5. import com.atguigu.ext.ExtConfig
  6. public class IOCTest_Ext {
  7. @Test
  8. public void test01(){
  9. AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class)
  10. applicationContext.close()
  11. }
  12. }

Testresultater:

Beskrivelse: I henhold til utførelsesordren 1, 2, 3, forklar BeanDefinitionRegistryPostProcessor har forrang over BeanFactoryPostProcessor, og BeanFactoryPostProcessor har forrang over beaninstansiering