BeanFactoryPostProcessor
BeanFactoryProcessor是Bean工厂处理器,对beanFactory的进行扩展,可以解析@Configuration @Bean注解。
主要功能是对BeanFactory的补充。
//获取所有bean工厂的处理器<Bean名字,bean工厂处理器>
Map<String, BeanFactoryPostProcessor> beanFactoryPostProcessorMap =
beanFactory.getBeansOfType(BeanFactoryPostProcessor.class);
beanFactoryPostProcessorMap.values().forEach(beanFactoryPostProcessor -> {
//执行bean工厂处理器
beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
});
BeanPostProcessor
BeanPostProcessor是Bean的处理器,对Bean进行扩展,可以解析@Autowired @Resource等注解。
//Bean 后处理器,针对Bean的生命周期的各个阶段提供扩展,例如@Autowired @Resource...
Map<String, BeanPostProcessor> beanPostProcessorMap = beanFactory.getBeansOfType(BeanPostProcessor.class);
beanPostProcessorMap.values().forEach(beanPostProcessor -> {
//执行bean处理器,@Autowired才会生效
beanFactory.addBeanPostProcessor(beanPostProcessor);
});
package com.xkj.org;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
public class TestBeanFactory {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//创建bean定义,将Config.class交给beanFactory去管理
AbstractBeanDefinition beanDefinition =
BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();
//向beanFactory注册beanDefinition
beanFactory.registerBeanDefinition("config", beanDefinition);
//验证,获取所有的BeanDefinitionNames
for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
//beanDefinitionNames===config
System.out.println("beanDefinitionNames==="+beanDefinitionName);
}
//由此可以看出,原始的BeanFactory并没有解析@Configuration @Bean这些注解的能力
//给BeanFactory添加一些后处理器(处理器可以解析@Bean @Configuration这些注解能力)
//BeanFactory的扩展功能,就是这些处理器,处理器只是加入到bean工厂,但是还未工作
AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
for (String beanDefinitionName: beanFactory.getBeanDefinitionNames()) {
//beanDefinitionNames==x=config
//beanDefinitionNames==x=org.springframework.context.annotation.internalConfigurationAnnotationProcessor
//beanDefinitionNames==x=org.springframework.context.annotation.internalAutowiredAnnotationProcessor
//beanDefinitionNames==x=org.springframework.context.annotation.internalCommonAnnotationProcessor
//beanDefinitionNames==x=org.springframework.context.event.internalEventListenerProcessor
//beanDefinitionNames==x=org.springframework.context.event.internalEventListenerFactory
System.out.println("beanDefinitionNames==x="+beanDefinitionName);
}
//获取所有bean工厂的处理器<Bean名字,bean工厂处理器>
Map<String, BeanFactoryPostProcessor> beanFactoryPostProcessorMap =
beanFactory.getBeansOfType(BeanFactoryPostProcessor.class);
beanFactoryPostProcessorMap.values().forEach(beanFactoryPostProcessor -> {
//执行bean工厂处理器
beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
});
//Bean 后处理器,针对Bean的生命周期的各个阶段提供扩展,例如@Autowired @Resource...
Map<String, BeanPostProcessor> beanPostProcessorMap = beanFactory.getBeansOfType(BeanPostProcessor.class);
beanPostProcessorMap.values().forEach(beanPostProcessor -> {
//建立bean工厂与bean处理器之间的联系
//执行bean处理器,@Autowired才会生效
beanFactory.addBeanPostProcessor(beanPostProcessor);
});
for (String beanDefinitionName: beanFactory.getBeanDefinitionNames()) {
//beanDefinitionNames==3=config
//beanDefinitionNames==3=org.springframework.context.annotation.internalConfigurationAnnotationProcessor
//beanDefinitionNames==3=org.springframework.context.annotation.internalAutowiredAnnotationProcessor
//beanDefinitionNames==3=org.springframework.context.annotation.internalCommonAnnotationProcessor
//beanDefinitionNames==3=org.springframework.context.event.internalEventListenerProcessor
//beanDefinitionNames==3=org.springframework.context.event.internalEventListenerFactory
//beanDefinitionNames==3=bean1
//beanDefinitionNames==3=bean2
System.out.println("beanDefinitionNames==3="+beanDefinitionName);
}
//如果想提前创建好bean对象,而不是等使用时候创建
beanFactory.preInstantiateSingletons();//准备好所有的单例
System.out.println("====================================");
//在用到Bean对象时候,才回去创建。之前都是定义bean信息,从bean对象构造方法调用的时机可以证明
//null,说明@Autowired注解对于BeanFactory来说又是另一个扩展功能
//>>>>com.xkj.org.TestBeanFactory$Bean2@2c34f934
System.out.println(">>>>" + beanFactory.getBean(Bean1.class).getBean2());
}
@Configuration
static class Config{
@Bean
public Bean1 bean1() {
return new Bean1();
}
@Bean
public Bean2 bean2() {
return new Bean2();
}
}
static class Bean1 {
private static final Logger log = LoggerFactory.getLogger(Bean1.class);
public Bean1() {
log.debug("构造Bean1()");
}
@Autowired
private Bean2 bean2;
public Bean2 getBean2() {
return bean2;
}
}
static class Bean2 {
private static final Logger log = LoggerFactory.getLogger(Bean2.class);
public Bean2() {
log.debug("构造Bean2()");
}
}
}
beanFactory:
1.不会主动调用BeanFactory后处理器
2.不会主动添加Bean后处理器
3.不会主动初始化单例