BeanFactory接口作用(二)
beanFactory接口还可以添加bean的后处理器以及提前初始化单例,不过beanFactory不会主动做这些事情,需要我们主动调用方法处理。
1.调用Bean后处理器
beanFatory可以添加Bean的后处理器,针对bean的生命周期的各个阶段做拓展,例如@Autowired @Resource。
public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//bean的定义(class,scope,初始化,销毁)AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();beanFactory.registerBeanDefinition("config",beanDefinition);//给BeanFactory一些常用的后处理器AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);//BeanFactory后处理器主要功能是补充一些bean的定义beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach(beanFactoryPostProcessor -> {beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);});//Bean后处理器beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);for(String name:beanFactory.getBeanDefinitionNames()){System.out.println(name);}System.out.println(beanFactory.getBean(Bean1.class).getBean2());}
配置类如下,这样通过@Autowired注入的Bean2才能被解析,否则最后一个输出为null。
@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);@Autowiredprivate Bean2 bean2;public Bean1(){log.debug("构造bean1");}public Bean2 getBean2(){return bean2;}}static class Bean2{private static final Logger log = LoggerFactory.getLogger(Bean2.class);public Bean2(){log.debug("构造 Bean2()");}}
结果如下:
bean2对象被打印了。
其中config下面打印了5个类,它们是通过AnnotationConfigUtils创建的,里面的第二个类就是用来处理@Autowired注解的。打开AnnotationConfigUtils的源码可以看到,
当类中不存internalAutowiredAnnotationProcessor的时候,便会重新注册一个,并且它的类型属于AutowiredAnnotationBeanPostProcessor。
继续看AutowiredAnnotationBeanPostProcessor类的继承图,可以看到它实现的类继承了BeanPostProcessor接口。
之前的internalConfigurationAnnotationProcessor类也是一样的,最后发现它继承自BeanFactoryPostProcessor。
2.提前初始单例
通过上述例子的打印可以知道,最后使用bean1对象的时候,才会创建bean1对象,默认都是延迟创建。通过主动调用beanFactory的方法,可以提前初始化单例对象。
package com.example.springdemo.demos.a21;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;/*** @author zhou* @version 1.0* @description TODO* @date 2025/9/21 20:46*/
public class TestBeanFactory {public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//bean的定义(class,scope,初始化,销毁)AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();beanFactory.registerBeanDefinition("config",beanDefinition);//给BeanFactory一些常用的后处理器AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);//BeanFactory后处理器主要功能是补充一些bean的定义beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach(beanFactoryPostProcessor -> {beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);});//Bean后处理器beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);for(String name:beanFactory.getBeanDefinitionNames()){System.out.println(name);}beanFactory.preInstantiateSingletons();System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println(beanFactory.getBean(Bean1.class).getBean2());}
}
如图所示:
在分隔符之前就把bean1和bean2对象创建好了。