当前位置: 首页 > news >正文

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对象创建好了。

http://www.dtcms.com/a/395142.html

相关文章:

  • 速通ACM省铜第十二天 赋源码(Kirei Attacks the Estate)
  • 海外仓一件代发怎样优化拣货流程?用什么WMS能减少错拣漏拣?
  • SQL Server 定时作业
  • 大模型笔试选择题:题组1
  • 关于STL
  • clickhouse使用问题记录
  • Java 大视界:基于 Java 的大数据实时流处理在金融高频交易数据分析中的创新应用
  • 【脑电分析系列】第25篇:情绪识别与认知研究中的EEG应用:一个完整的实验设计与数据分析流程
  • Tensorflow基础——数据类型、计算图
  • 在Anaconda中安装TensorFlow1.14.0与TensorFlow2.0.0
  • 面试题:分布式锁要点总结(Redisson)
  • C++第四篇:函数增强
  • C#上位机软件:1.7 熟悉VS并开启你的第一个C#程序
  • Nextcloud App增加模块内嵌网页
  • 04-django配置日志-loguru
  • docker离线部署gpt-oss-20b流程,从下载到安装再到可以使用
  • 关系数据库MySQL的常用基础命令详解实战
  • 面向动态环境的MEC突破:MLGO微算法科技推出自适应权重深度确定性策略梯度(AWDDPG)算法,革新多用户任务迁移技术
  • Ansys Zemax | 确保自由曲面设计的可制造性
  • 智造新势力:看“文化+科技”如何重塑制造新范式
  • 【算法训练营Day25】动态规划part1
  • 打破网络壁垒:使用内网穿透轻松实现远程桌面访问
  • 2025 PyCharm IDE 社区版与专业版合并后,新手该如何安装?(附 Toolbox 图形化安装教程)
  • 07-css元素定位布局
  • 波动率曲面及SVI模型的Python数值拟合
  • 基于Python新闻平台的文本数据挖掘系统
  • 2017/12 JLPT听力原文 问题四
  • 【Tawk】Tawk.to聊天小部件移动端位置调整完整指南
  • jieba 库
  • 开启 3D 之旅 - 你的第一个 WebGL 三角形