spring 之 BeanPostProcessor、BeanDefinitionRegistryPostProcessor执行原理

扩展原理:
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);
		
	}

}

测试结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值