6.BeanFactory处理器Bean处理器

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.不会主动初始化单例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Simulink中的S函数深入解析

Simulink中的S函数深入解析 在Simulink环境中&#xff0c;S函数&#xff08;Simulink Functions&#xff09;扮演着至关重要的角色&#xff0c;它们允许用户将自定义算法和行为集成到Simulink模型中。本文将详细探讨S函数的定义、应用和编写方法&#xff0c;以及在模型中如何利…

Android设备信息(DevInfo)

软件介绍 设备信息&#xff08;DevInfo&#xff09;一款评分非常不错的手机硬件及各种信息检测应用&#xff0c;安卓设备硬件检测工具。可以全面查看手机的各种信息、包括&#xff1a;Android系统版本的详细信息、芯片CPU处理器的详细信息、全球卫星定位、测试功能、硬件温度、…

Python爬虫技术及其原理探秘

导言 随着互联网的发展&#xff0c;大量的数据被存储在网络上&#xff0c;而我们需要从中获取有用的信息。Python作为一种功能强大且易于学习的编程语言&#xff0c;被广泛用于网络爬虫的开发。本文将详细介绍Python爬虫所需的技术及其原理&#xff0c;并提供相关的代码案例。…

c++高阶-1-模板

文章目录 模板一、模板基本语法二、函数模板1.基本语法2.函数模板注意事项3.普通函数和函数模板区别4.普通函数和函数模板调用规则 三、类模板1.基本语法2.类模板和函数模板的区别3.类模板中成员函数调用时机4.类模板对象做函数参数5.类模板与继承6.成员函数的类外实现 模板 一…

Ansys Zemax|场曲跟畸变图的前世今生

实现 OpticStudio通过在X和Y方向&#xff08;弧矢和子午方向&#xff09;的傍轴光线追踪确定近轴图像平面的Z坐标&#xff0c;并测量该近轴焦平面与系统图像平面的Z坐标之间的距离。 切向数据是沿Z轴从图像平面到近轴图像平面在切向&#xff08;YZ&#xff09;平面测量的距离…

Qt Creator配置以及使用Git

Qt Creator配置以及使用Git 引言一、Qt Creator配置git二、Qt Creator使用git2.1 创建git仓库 or git项目导入Qt2.2 配置远端&#xff0c;拉代码 or 上传代码2.3 查看更改2.4 更多细节可参考官方文档 三、参考的博客以及文档 引言 Qt Creator配置Git之后&#xff0c;可以看作是…

【AIGC】DiffuToon:稳定的视频卡通化技术方案

论文&#xff1a;https://arxiv.org/pdf/2401.16224 github&#xff1a;https://github.com/modelscope/DiffSynth-Studio/tree/main/examples/Diffutoon 网络结构 两个主要分支&#xff1a;主要的卡通化管线和编辑分支 重要技术 使用了fastblend(无需模型的视频帧之间的平滑…

动态规划解决0/1背包问题详解

一、引言 在日常生活中,我们经常面临各种选择和决策。有些决策涉及到资源的有限性和选择的最优性,这就需要我们运用一些算法来帮助我们做出最佳的选择。0/1背包问题就是这样一个经典的优化问题,它要求我们在给定的背包容量和物品集合中,选择出总价值最大的物品组合。本文将…

不同操作系统下的换行符

1. 关键字2. 换行符的比较3. ASCII码4. 修改换行符 4.1. VSCode 5. 参考文档 1. 关键字 CR LF CRLF 换行符 2. 换行符的比较 英文全称英文缩写中文含义转义字符ASCII码值操作系统Carriage ReturnCR回车\r13MacIntosh&#xff08;早期的Mac&#xff09;LinefeedLF换行/新行\…

C++程序演示如何使用类和对象进行简单的面向对象编程。

下面是一个简单的C程序示例&#xff0c;展示了如何使用类和对象进行面向对象编程。这个示例定义了一个名为Person的类&#xff0c;它包含私有成员变量&#xff08;姓名和年龄&#xff09;以及公共成员函数&#xff08;用于设置和获取这些成员变量的值&#xff09;。然后&#x…

【C语言】指针经典例题

题1&#xff1a; #include <stdio.h>int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&#xff1f; 解答如下&#xff1a; 题2&#xff1a; #include <std…

提取含日期字符串并格式化输出

背景 OCR识别的字符串中&#xff0c;日期类型存在字符串中&#xff0c;需要提取出来&#xff0c;并格式化 环境以及依赖package NStudyPy0.0.12 NStudyPy 工具包 , 一个有用的工具包&#xff0c;可以简化开发流程&#xff0c;详细介绍可以参考 NStudyPy 本教程使用 python 3.10…

Coze终于顶不住了?开始收费了

&#x1f914;各位老铁都知道&#xff0c;之前Coze以免费出圈&#xff0c;香碰碰&#xff0c;字节一个月几个亿补贴用户。现在终于顶不住了&#xff0c;开始收费了&#xff01; 我们来看看具体情况吧&#xff01; &#x1f4b8;收费情况一览 目前国内版本还没有开始收费&#x…

VisActor vs ECharts: 哪个更适合你的数据可视化需求?

VisActor vs ECharts: 哪个更适合你的数据可视化需求&#xff1f; 在当今数据驱动的世界里&#xff0c;选择合适的数据可视化工具是至关重要的。ECharts作为广受欢迎的可视化库&#xff0c;已经在行业内拥有了长久的历史和广泛的用户基础。然而&#xff0c;VisActor作为新兴的…

企业该如何选择工时管理工具?

在数字化时代&#xff0c;企业的管理效率直接关系到其市场竞争力。工时管理作为企业管理的重要一环&#xff0c;不仅关乎员工的工作效率&#xff0c;还直接影响到企业的成本控制和决策质量。那么&#xff0c;面对市场上琳琅满目的工时管理工具&#xff0c;企业应该如何做出明智…

麒麟v10-yum下载命令

1、下载抓包工具 tcpdump下载时只能直接安装&#xff1b;想要cp到其他机器的时候就需要用到其他命令了。 2、yum命令只下载不安装 yum install tcpdump --downloadonly 3、下载完成后&#xff0c;安装包的路径 /var/cache/dnf/ks10-adv-os-0c2e217e51b7a335/packages/tcpdump…

前端基础--Vue3核心语法

vue的核心语法 简单入门 Vue3向下兼容Vue2语法&#xff0c;且Vue3中的模板中可以没有根标签 <template><div class"person"><h2>姓名&#xff1a;{{name}}</h2><h2>年龄&#xff1a;{{age}}</h2><button click"chang…

关于ant design vue 使用Modal无法关闭弹窗的解决思路

文章目录 1: 出现问题的版本2.出现问题&#xff08;1&#xff09;ant design 的问题&#xff08;2&#xff09;poina的提示报错 3.正确版本总结 1: 出现问题的版本 "ant-design-vue": "^3.2.20", "pinia": "^2.1.7", "vue"…

人工智能工具在软件开发中的作用与未来展望

随着生成式人工智能&#xff08;AIGC&#xff09;的迅猛发展&#xff0c;软件开发领域正经历着深刻的变革。从代码生成、错误检测到自动化测试&#xff0c;AI工具正在逐渐成为开发者的重要助手。然而&#xff0c;这也引发了对开发者职业前景和技能需求变化的广泛讨论&#xff1…

好看的风景视频素材在哪下载啊?下载风景视频素材网站分享

随着短视频和自媒体的兴起&#xff0c;美丽的风景视频不仅能让人眼前一亮&#xff0c;更能吸引大量观众。无论是旅游博主分享那些令人心旷神怡的旅行片段&#xff0c;还是视频编辑师寻找背景素材来增强作品的视觉效果&#xff0c;高质量的风景视频素材需求量巨大。以下是几个下…