扩展原理:
BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的
BeanFactoryPostProcessor :beanFactory的后置处理器:
在BeanFactory标准初始化之后调用;所有的bean定义已经保存加载到beanFactory,但是bean的实例还没有被创建
BeanFactoryPostProcessor原理:
1)、ioc容器创建对象
2)、refresh()-->invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor;
如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
1)、直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
2)、在初始化传教其他组件前面执行
代码演示
package com.factroy;
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 {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
System.out.println("执行了BeanFactoryPostProcessor中的postProcessBeanFactory方法");
//容器中有多少个bean
int a = beanFactory.getBeanDefinitionCount();
//获取bean中的名字
String[] strings = beanFactory.getBeanDefinitionNames();
System.out.println("当前beanFactory中有"+a+"个bean,bean别名分别是:"+Arrays.asList(strings));
}
}
注解类:
package com.factroy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.bean.Dog;
@Configuration
@ComponentScan("com.factroy")
public class ExtConfig {
@Bean
public Dog d(){
return new Dog();
}
}
测试类:
package com;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.factroy.ExtConfig;
import com.factroy.MyBeanFactoryPostProcessor;
import com.tx.UserServer;
public class DemoTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
MyBeanFactoryPostProcessor m = applicationContext.getBean(MyBeanFactoryPostProcessor.class);
//关闭容器
applicationContext.close();
}
}
测试结果:
六月 09, 2020 3:32:50 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Tue Jun 09 15:32:50 CST 2020]; root of context hierarchy
执行了BeanFactoryPostProcessor中的postProcessBeanFactory方法
当前beanFactory中有9个bean,bean别名分别是:[org.springframework.context.annotation.internalConfigurationAnnotationProcessor,
org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor,
org.springframework.context.annotation.internalCommonAnnotationProcessor,
org.springframework.context.event.internalEventListenerProcessor,
org.springframework.context.event.internalEventListenerFactory,
extConfig, myBeanFactoryPostProcessor, d]
创建Dog对象。。。。
六月 09, 2020 3:32:50 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Tue Jun 09 15:32:50 CST 2020]; root of context hierarchy
2、BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
postProcessBeanDefinitionRegistry();
在所有bean定义信息将要被加载,bean实例还未创建的;
优先于BeanFactoryPostProcessor执行;
利用BeanDefinitionRegistryPostProcessor给容器中在额外添加一些组件;
原理:
1、创建ioc容器
2、refresh()-->invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor;
3、从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件。
1、依次触发所有的postProcessBeanDefinitionRegistry()方法
2、在来触发postProcessBeanFactory()方法BeanFactoryPostProcessor
4)、在来从容器中找到BeanFactoryPostProcessor组件,然后依次触发BeanFactoryPostProcessor方法;
代码演示:
package com.factroy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
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.stereotype.Component;
import com.bean.Dog;
@Component
public class MYBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
System.out.println("MYBeanDefinitionRegistryPostProcessor ...bean的数量"+beanFactory.getBeanDefinitionCount()+"");
}
//bean定义的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean信息来创建实例
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// TODO Auto-generated method stub
System.out.println("MYBeanDefinitionRegistryPostProcessor ...bean的数量"+registry.getBeanDefinitionCount()+"");
//注册bean
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();
registry.registerBeanDefinition("hello", beanDefinition);
}
}
测试结果: