package com.zdc.sp.kuozhan.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.zdc.sp.kuozhan.model.ExModel;
/**
* 扩展原理
* 一、BeanPostProcessor;bean后置处理器,bean创建对象初始化前后进行拦截工作的
*
* BeanFactoryPostProcessor: beanFactory的后置处理器:
* 在BeanFactory标准初始化之后调用;所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
*
* 过程:
* 1)、ioc容器创建对象
* 2)、invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor;
* 如何找到所有的BeanFactoryPostProcessor并执行他们的方法:
* 1、直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
* 2、在初始化创建其它组件前面执行
*
*二、BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
* postProcessBeanDefinitionRegistry();
* 在所有bean定义信息将要被加载,bean实例还未创建的;
* 优先于beanFactoryPostProcessor执行;
* 利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件;
*
* 过程:
* 1)、IOC容器创建
* 2)、refresh()==>invokeBeanFactoryPostProcessors(beanfactory)
* 3)、从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件;
* 1、依此触发所有的postProcessBeanDefinitionRegistry()。
* 2、再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor
* 4)、再来容器中找到BeanFactoryPostProcessor组件,然后依触发postProcessBeanFactory()方法
*
*
*/
@ComponentScan("com.zdc.sp.kuozhan")
@Configuration
public class ExConfig {
@Bean
public ExModel exModel(){
return new ExModel();
}
}
测试类:
1、BeanPostProcessor;bean后置处理器
package com.zdc.sp.kuozhan.myobj;
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..........");
/**
* 获取bean定义的数量
*/
int count = beanFactory.getBeanDefinitionCount();
String[] names = beanFactory.getBeanDefinitionNames();
System.out.println("当前beanfactory中有"+count+" 个bean");
System.out.println("当前beanfactory中的bean名称:"+Arrays.asList(names));
}
}
2、BeanDefinitionRegistryPostProcessor;bean定制后置处理器
package com.zdc.sp.kuozhan.myobj;
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.stereotype.Component;
import com.zdc.sp.kuozhan.model.ExModel;
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor...bean的数量:"+beanFactory.getBeanDefinitionCount());
}
//BeanDefinitionRegistry Bean定义信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实例
@Override
public void postProcessBeanDefinitionRegistry(
BeanDefinitionRegistry registry) throws BeansException {
System.out.println("postProcessBeanDefinitionRegistry...bean的数量:"+registry.getBeanDefinitionCount());
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(ExModel.class).getBeanDefinition();
registry.registerBeanDefinition("hello", beanDefinition);
}
}