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实例化执行;