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注冊beanDefinitionbeanFactory.registerBeanDefinition("config", beanDefinition);//驗證,獲取所有的BeanDefinitionNamesfor (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {//beanDefinitionNames===configSystem.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.internalEventListenerFactorySystem.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=bean2System.out.println("beanDefinitionNames==3="+beanDefinitionName);}//如果想提前創建好bean對象,而不是等使用時候創建beanFactory.preInstantiateSingletons();//準備好所有的單例System.out.println("====================================");//在用到Bean對象時候,才回去創建。之前都是定義bean信息,從bean對象構造方法調用的時機可以證明//null,說明@Autowired注解對于BeanFactory來說又是另一個擴展功能//>>>>com.xkj.org.TestBeanFactory$Bean2@2c34f934System.out.println(">>>>" + beanFactory.getBean(Bean1.class).getBean2());}@Configurationstatic class Config{@Beanpublic Bean1 bean1() {return new Bean1();}@Beanpublic Bean2 bean2() {return new Bean2();}}static class Bean1 {private static final Logger log = LoggerFactory.getLogger(Bean1.class);public Bean1() {log.debug("構造Bean1()");}@Autowiredprivate 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.不會主動初始化單例