BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的
BeanFactoryPostProcessor是什么:beanFactory的后置处理器;
* 在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
* 所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
*
BeanFactoryPostProcessor原理:
* 1)、ioc容器创建对象
* 2)、invokeBeanFactoryPostProcessors(beanFactory);
* 如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
* 1)、直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
* 2)、在初始化创建其他组件前面执行
BeanDefinitionRegistryPostProcessor是什么:
BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
* postProcessBeanDefinitionRegistry();
* 在所有bean定义信息将要被加载,bean实例还未创建的时候加载;
*
* 优先于BeanFactoryPostProcessor执行;
* 利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件;
*
BeanDefinitionRegistryPostProcessor原理:
* 1)、ioc创建对象
* 2)、refresh()-》invokeBeanFactoryPostProcessors(beanFactory);
* 3)、从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件。
* 1、依次触发所有的postProcessBeanDefinitionRegistry()方法
* 2、再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor;
*
* 4)、再来从容器中找到BeanFactoryPostProcessor组件;然后依次触发postProcessBeanFactory()方法
注意执行顺序:BeanDefinitionRegistryPostProcessor优先于BeanFactoryPostProcessor执行,BeanFactoryPostProcessor优先于bean实例化执行;
测试:
1、新建MyBeanDefinitionRegistryPostProcessor .java类
- 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("MyBeanDefinitionRegistryPostProcessor...bean的数量:"+beanFactory.getBeanDefinitionCount());
- }
-
- //BeanDefinitionRegistry Bean定义信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实例;
- @Override
- public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println("postProcessBeanDefinitionRegistry...bean的数量:"+registry.getBeanDefinitionCount());
- //RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class);
- AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();
- registry.registerBeanDefinition("hello", beanDefinition);
- }
-
- }
2、新建MyBeanFactoryPostProcessor.java类
- 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("当前BeanFactory中有"+count+" 个Bean");
- System.out.println(Arrays.asList(names));
- }
-
- }
3、新建配置类
- @ComponentScan("com.atguigu.ext")
- @Configuration
- public class ExtConfig {
-
- @Bean
- public Blue blue(){
- return new Blue();
- }
-
- }
4、测试
- 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();
- }
-
- }
测试结果:
说明:按执行顺序1,2,3,说明BeanDefinitionRegistryPostProcessor优先于BeanFactoryPostProcessor执行,BeanFactoryPostProcessor优先于bean实例化执行;