spring源码系列(三)——beanDefinition(1)

腾讯T6!万字长文体系化讲解Spring源码,码农:太透彻了,学会了 上一篇是分享的是《Spring SPI 机制总结》,这篇给大家分享《spring源码系列之BeanDefinition》,这篇文章略长,纯干货,大家准备好,发车啦。 【spring源码系列】之【BeanDefinition】 1. BeanDefinition简介 BeanDefinition有三个实现类,ChildBeanDefinition、GenericBeanDefinition、RootBeanDefinition,三者都继承AbstractBeanDefinition,对三个子类.. 阅读详情
AI摘要

深入探讨Spring框架中BeanDefinition的重要性,它是Bean实例化的模型对象,负责存储Bean的元数据,如作用域、懒加载等信息。文章解析BeanDefinition的创建过程及如何通过BeanFactoryPostProcessor进行扩展。

如果想系统的学习spring源码那么第一个需要搞明白的知识便是spring当中的BeanDefinition——spring bean的建模对象;

笔者特别强调,beanDefintion的比较枯燥和晦涩难懂,但是非常非常重要,我打算写三篇来把beanDefintion知识讲完;如果你想精读spring源码,请你一定细读三篇beanDefintion的知识,他是spring framework当中的基石;

那么什么是spring bean的建模对象呢?一言概之就是把一个bean实例化出来的模型对象?有人会问把一个bean实例化出来有Class就行了啊,Class也就是我们通常说的类对象,就是一个普通对象的建模对象,那么为什么spring不能用Class来建立bean呢?很简单,因为Class无法完成bean的抽象,比如bean的作用域,bean的注入模型,bean是否是懒加载等等信息,Class是无法抽象出来的,故而需要一个BeanDefinition类来抽象这些信息,以便于spring能够完美的实例化一个bean(关于什么是bean什么是对象,请参考我写的第一篇循环引用笔者有解释)

上述文字可以简单理解spring当中的BeanDefinition就是java当中的Class
Class可以用来描述一个类的属性和方法等等其他信息
BeanDefintion可以描述springbean当中的scope、lazy,以及属性和方法等等其他信息

用一副图来说明java实例化一个对象的基本流程

在这里插入图片描述
对上图的文字说明:假设磁盘上有N个.java文件,首先我们把这些java文件编译成class文件,继而java虚拟机启动会把这些class文件load到内存,当遇到new关键字的时候会根据类的模板信息实例化这个对象也就是在堆上面分配内存

但是spring的bean实例化过程和一个普通java对象的实例化过程还是有区别的,同样用一幅图来说明一下

在这里插入图片描述

下面我会对这幅图做大篇幅的说明,在springbean实例化简图当中我一共标记了⑤步;逐一来说明吧

前提:假设在你的项目或者磁盘上有X和Y两个类,X是被加了spring注解的,Y没有加spring的注解;也就是正常情况下当spring容器启动之后通过getBean(X)能正常返回X的bean,但是如果getBean(Y)则会出异常,因为Y不能被spring容器扫描到不能被正常实例化;

①[^1]当spring容器启动的时候会去调用ConfigurationClassPostProcessor这个bean工厂的后置处理器完成扫描,关于什么是bean工厂的后置处理器下文再来详细解释;spring完成扫描的具体源码放到后续的文章中再来说。阅读本文读者只需知道扫描具体干了什么事情即可;其实所谓的spring扫描就是把类的信息读取到,但是读取到类的信息存放到哪里呢?比如类的类型(class),比如类的名字,类的构造方法。可能有读者会有疑问这些信息不需要存啊,直接存在class对象里面不就可以?比如当spring扫描到X的时候Class clazzx = X.class;那么这个classx里面就已经具备的前面说的那些信息了,确实如此,但是spring实例化一个bean不仅仅只需要这些信息,还有我上文说到的scope,lazy,dependsOn等等信息需要存储,所以spring设计了一个BeanDefintion的类用来存储这些信息。故而当spring读取到类的信息之后②[2]会实例化一个BeanDefinition的对象,继而调用这个对象的各种set方法存储信息;每扫描到一个符合规则的类,spring都会实例化一个BeanDefinition对象,然后把根据类的类名生成一个bean的名字(比如一个类IndexService,spring会根据类名IndexService生成一个bean的名字`indexService`,spring内部有一套默认的名字生成规则,但是程序员可以提供自己的名字生成器覆盖spring内置的,这个后面更新),`③`[3]继而spring会把这个beanDefinition对象和生成的beanName放到一个map当中,key=beanName,value=beanDefinition对象;至此上图的第①②③步完成。

这里需要说明的是spring启动的时候会做很多工作,不仅仅是完成扫描,在扫描之前spring还干了其他大量事情;比如实例化beanFacctory、比如实例化类扫描器等等,这里不讨论,在以后的文章再来讨论

用一段代码和结果来证明上面的理论

Appconfig.java
@ComponentScan("com.luban.beanDefinition")
@Configuration
public class Appconfig {
}

X.java
@Component
public class X {
	public X(){
		System.out.println("X Constructor");
	}
}

Y.java
public class Y {
}

Test.java
public class Test{
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
		ac.register(Appconfig.class);
		ac.refresh();
		}
	}

上述代码里面有X和Y两个类(下面有笔者运行这些代码的结果截图),X被注解了,Y没注解,并且在X当中有个构造方法一旦X被实例化便会打印"X Constructor";而且在main方法的最开始打印了"start"按照上面笔者的理论spring首先会扫描X继而把X解析称为一个beanDefinition对象放到map;笔者在spring的源码org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors方法上打了一个断点(invokeBeanFactoryPostProcessors方法里面就完成了上述所说的扫描解析功能),当应用程序启动的时候首先会打印start,继而启动spring容器,然后调用invokeBeanFactoryPostProcessors方法,在没有执行该方法之前查看beanDefintionMap当中并没有key为"x"的元素,说明X并没有被扫描,然后继续执行,当执行完invokeBeanFactoryPostProcessors方法时候再次查看beanDefintionMap可以看到map当中多了一个key为"x"的元素,其对应的value就是一个beanDefintion的对象,最后查看后台发现还没有打印"X Constructor"这说明这个时候X并没有被实例化,这个例子说明spring是先把类扫描出来解析称为一个beanDefintion对象,然后put到beanDefintionMap后面才会去实例化X,至于这个beanDefintionMap后面的文章我会详细讲解,本文读者只需知道他是一个专门来存放beanDefinition的集合即可
在这里插入图片描述

④当spring把类所对应的beanDefintion对象存到map之后,spring会调用程序员提供的bean工厂后置处理器。什么叫bean工厂后置处理器?在spring的代码级别是用一个接口来表示BeanFactoryPostProcessor,只要实现这个接口便是一个bean工厂后置处理器了,BeanFactoryPostProcessor的详细源码解析后面文章再来分析,这里先说一下他的基本作用。BeanFactoryPostProcessor接口在spring内部也有实现,比如第①步当中完成扫描功能的类ConfigurationClassPostProcessor便是一个spring自己实现的bean工厂后置处理器,这个类笔者认为是阅读spring源码当中最重要的类,没有之一;他完成的功能太多了,以后我们一一分析,先看一下这个类的类结构图。
在这里插入图片描述
ConfigurationClassPostProcessor实现了很多接口,和本文有关的只需关注两个接口BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor;但是由于BeanDefinitionRegistryPostProcessor是继承了BeanFactoryPostProcessor所以读者也可以理解这是一个接口,但是笔者更加建议你理解成两个接口比较合适,因为spring完成上述①②③步的功能就是调用BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法完成的,到了第④步的时候spring是执行BeanFactoryPostProcessor的postProcessBeanFactory方法;这里可能说的有点绕,大概意思spring完成①②③的功能是调用ConfigurationClassPostProcessor的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,到了第④步spring首先会调用ConfigurationClassPostProcessor的BeanFactoryPostProcessor的postProcessBeanFactory的方法,然后在调用程序员提供的BeanFactoryPostProcessor的postProcessBeanFactory方法,所以上图当中第④步我画的是红色虚线,因为第④步可能没有(如果程序员没有提供自己的BeanFactoryPostProcessor;当然这里一定得说明,即使程序员没有提供自己扩展的BeanFactoryPostProcessor,spring也会执行内置的BeanFactoryPostProcessor也就是ConfigurationClassPostProcessor,所以上图画的并不标准,少了一步;即spring执行内置的BeanFactoryPostProcessor;

重点:我们用自己的话总结一下BeanFactoryPostProcessor的执行时机(不管内置的还是程序员提供)————Ⅰ:如果是直接实现BeanFactoryPostProcessor的类是在spring完成扫描类之后(所谓的扫描包括把类变成beanDefinition然后put到map之中),在实例化bean(第⑤步)之前执行;Ⅱ如果是实现BeanDefinitionRegistryPostProcessor接口的类;诚然这种也叫bean工厂后置处理器他的执行时机是在执行直接实现BeanFactoryPostProcessor的类之前,和扫描(上面①②③步)是同期执行;假设你的程序扩展一个功能,需要在这个时期做某个功能则可以实现这个接口;但是笔者至今没有遇到这样的需求,如果以后遇到或者看到再来补上;(说明一下当笔者发表这篇博客有一个读者联系笔者说他看到了一个主流框架就是扩展了BeanDefinitionRegistryPostProcessor类,瞬间笔者如久旱遇甘霖,光棍遇寡妇;遂立马请教;那位读者说mybatis的最新代码里面便是扩展这个类来实现的,笔者记得以前mybatis是扩展没有用到这个接口,后来笔者看了一下最新的mybatis源码确实如那位读者所言,在下一篇笔者分析主流框架如何扩展spring的时候更新)

在这里插入图片描述

这里再次啰嗦一下,这一段比较枯燥和晦涩,但是非常重要,如果想做到精读spring源码这一段尤为重要,建议读者多看多理解;

那么第④步当中提到的执行程序员提供的BeanFactoryPostProcessor到底有什么意义呢?程序员提供BeanFactoryPostProcessor的场景在哪里?有哪些主流框架这么干过呢?

首先回答第一个问题,意义在哪里?可以看一下这个接口的方法签名

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 
throws BeansException;

其实讨论这个方法的意义就是讨论BeanFactoryPostProcessor的作用或者说意义,参考这个方法的一句javadoc

Modify the application context’s internal bean factory after its standard initialization
在应用程序上下文的标准初始化之后修改它的内部bean工厂

再结合这个方法的执行时机和这段javadoc我们可以理解bean工厂的后置处理器(这里只讨论直接实现BeanFactoryPostProcessor的后置处理器,不包括实现BeanDefinitionRegistryPostProcessor的后置处理器)其实是spring提供的一个扩展点(spring提供很多扩展点,学习spring源码的一个非常重要的原因就是要学会这些扩展点,以便对spring做二次开发或者写出优雅的插件),可以让程序员干预bean工厂的初始化过程(重点会考);这句话最重要的几个字是初始化过程,注意不是实例化过程 ;初始化和实例化有很大的区别的,特别是在读spring源码的时候一定要注意这两个名词;翻开spring源码你会发现整个容器初始化过程就是spring各种后置处理器调用过程;而各种后置处理器当中大体分为两种;一种关于实例化的后置处理器一种是关于初始化的后置处理器,这里不是笔者臆想出来的,如果读者熟悉spring的后置处理器体系就可以从spring的后置处理器命名看出来spring对初始化和实例化是有非常大的区分的。

说白了就是——beanFactory怎么new出来的(实例化)BeanFactoryPostProcessor是干预不了的,但是beanFactory new出来之后各种属性的填充或者修改(初始化)是可以通过BeanFactoryPostProcessor来干预;可以看到BeanFactoryPostProcessor里唯一的方法postProcessBeanFactory中唯一的参数就是一个标准的beanFactory对象——ConfigurableListableBeanFactory;既然spring在调用postProcessBeanFactory方法的时候把已经实例化好的beanFactory对象传过来了,那么自然而然我们可以对这个beanFactory肆意妄为了;

虽然肆意妄为听起来很酷,实则很多人会很迷茫;就相当于现在送给了你一辆奥迪A6(笔者的dream car!重点会考)告诉你可以对这辆车肆意妄为,可你如果只是会按按喇叭,那就对不起赠送者的一番美意了;其实你根本不知道可以在午夜开车这辆车去长沙的解放西路转一圈,继而会收货很多意外的“爱情”;笔者举这个例子就是想说当你拿到beanFactory对象的时候不能只会sout,那不叫肆意妄为;我们可以干很多事情,但是你必须要了解beanFactory的特性或者beanFactory的各种api,但是beanFactory这个对象太复杂了,这里不适合展开讨论,与本文相关的只要知道上述我们讲到的那个beanDefintionMap(存储beanDefintion的集合)就定义在beanFactory当中;而且他也提供额api供程序员来操作这个map,比如可以修改这个map当中的beanDefinition对象,也可以添加一个beanDefinition对象到这个map当中;看一段代码

@Component
public class TestBeanFactoryPostPorcessor implements BeanFactoryPostProcessor {
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		//转换为子类,因为父类没有添加beanDefintion对象的api
		DefaultListableBeanFactory defaultbf =
				(DefaultListableBeanFactory) beanFactory;

		//new一个Y的beanDefinition对象,方便测试动态添加
		GenericBeanDefinition y= new GenericBeanDefinition();
		y.setBeanClass(Y.class);
		//添加一个beanDefinition对象,原本这个Y没有被spring扫描到
		defaultbf.registerBeanDefinition("y", y);

		//得到一个已经被扫描出来的beanDefintion对象x
		//因为X本来就被扫描出来了,所以是直接从map中获取
		BeanDefinition x = defaultbf.getBeanDefinition("x");
		//修改这个X的beanDefintion对象的class为Z
		//原本这个x代表的class为X.class;现在为Z.class
		x.setBeanClassName("com.luban.beanDefinition.Z");
	}
	
}

项目里面有三个类X,Y,Z其中只有X加了@Component注解;也就是当代码执行到上面那个方法的时候只扫描到了X;beanFactory里的beanDefinitionMap当中也只有X所对应的beanDefinition对象;笔者首先new了一个Y所对应的beanDefinition对象然后调用registerBeanDefinition("y", y);把y对应的beanDefinition对象put到beanDefinitionMap,这是演示动态添加一个自己实例化的beanDefinition对象;继而又调用getBeanDefinition("x")得到一个已经存在的beanDefinition对象,然后调用x.setBeanClassName("Z");把x所对应的beanDefinition对象所对应的class改成了Z,这是演示动态修改一个已经扫描完成的beanDefinition对象;

测试代码如下:

public static void main(String[] args) {
		AnnotationConfigApplicationContext ac =
		 new AnnotationConfigApplicationContext();
		ac.register(Appconfig.class);
		ac.refresh();
		//正常打印
		System.out.println(ac.getBean(Y.class));
		//正常打印
		System.out.println(ac.getBean(Z.class));
		//异常打印
		//虽然X加了注解,但是被偷梁换柱了,故而异常
		System.out.println(ac.getBean(X.class));
	}

附图:
在这里插入图片描述

总结一下上面那副图,spring实例化一个bean其实和你提供的那个类并没有直接关系,而是和一个beanDefintion对象所对应的那个类有直接关系(正常情况下一个beanDefinition对象会对应一个类,但是也有不正常的情况);打个庸俗的比方好比读者你喜欢一个女生小A;而小A喜欢笔者,但是你不能说你也喜欢笔者;而且笔者还是钢铁直男无论如何也不被可能掰弯的;

看完这个结果你还敢轻视spring当中的建模对象beanDefintion的作用了吗?但是BeanDefinition这个接口有太多的实现类,是一个比较复杂的体现,下一篇我慢慢把spring体现当的各种beanDefinition对象逐一介绍清楚;

那么第④步当中提到的执行程序员提供的BeanFactoryPostProcessor到底有什么意义呢?程序员提供BeanFactoryPostProcessor的场景在哪里?有哪些主流框架这么干过呢?
第一个问题我们大概回答了一下,程序员一般提供BeanFactoryPostProcessor是为了对beanFactory做修改或者叫做干预他的初始化;能修改什么?或者能干预什么?这个问题比较庞大,至少你现在知道可以修改beanFactory当中的beanDefinitionMap
至于剩下两个问题,我以后更新吧

Spring源码分析(三)Spring是如何把元素解析成BeanDefinition对象的 spring中解析元素最重要的一个对象应该就属于 BeanDefinition了;这个Spring容器中最基本的内部数据结构;它让xml文件中所有的配置有了一个归属的地方;在xml中存在的配置都能在BeanDefinition找到对应的属性;我们今天来看看BeanDefinition是如何被创建的 1.BeanDefinition Spring 容器中的内部数据结构,是转换为容器中b... 阅读详情

相关推荐

Spring源码解析(四)Spring是怎么处理BeanDefinition的?

上一篇文章中分析了 BeanDefinition是怎么被解析出来的,在这一篇文章中我们主要看下 解析完了之后所做的事情; 一、DefaultBeanDefinitionDocumentReader 源码入口 processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) /** ...

石臻说AI(szzdzhp001) 【原名 石臻臻的杂货铺】 5495

Spring系列 什么是BeanDefinition(超通俗易懂、超细致)

在Spring框架中,BeanDefinition是描述和定义Spring容器中的Bean的元数据对象。它包含了**定义Bean的相关信息**,例如Bean的类名、作用域、生命周期等。

weixin_45663027的博客 7984

《鲁班学院》子路老师spring底层原理分析视频全集.rar

整个视频课程将由浅入深,介绍spring5源码的构建、spring5IOC容器的初始化过程、bean的声明周期过程、spring BeanFactoryPostporcessor并且结合原理给出当前流行的应用框架如何利用spring的源码知识写出优雅的代码,比如mybaits的源码当中到底如何利用了spring的扩展点写出优雅的代码。

什么是 BeanDefinition?

BeanDefinition 是定义 Bean 的配置元信息接口,包含: Bean 的类名 设置父 bean 名称、是否为 primary、 Bean 行为配置信息,作用域、自动绑定模式、生命周期回调、延迟加载、初始方法、销毁方法等 Bean 之间的依赖设置,dependencies 构造参数、属性设置 ... BeanDefinition 子类方法更为丰富些。 派生出AnnotatedBeanDefinition 接口,以及常用子类RootBeanDefinition、Gene...

ConstXiong 1万+

网易数智CoreAgent实战:5步教你打造企业级AI数字员工(附避坑指南)

本文以网易数智CoreAgent智能体协作中枢为核心,提供了一份企业级AI数字员工的实战部署指南。文章详细拆解了从环境准备、智能体配置、业务集成、安全合规到效果评估的五个关键步骤,并分享了部署过程中的常见“避坑”经验,旨在帮助企业技术团队高效、安全地将AI智能体落地于实际业务场景,解决AI落地难题。

rice5的博客 953

python调用hypermesh调用tcl_TclTk如何调用HyperMesh运行tcl脚本文件

#Tcl/Tk编写界面部分set t [toplevel .tp]focus $tgrab $tset Filename "E:/CAE_Tech/process_files/88/Example.tcl"set Font "Times 12 bold"wm title $t "Call HyperMesh"wm attribute $t -topmost 1wm withdraw $tset t...

weixin_39541681的博客 1600

spring源码系列(三)——beanDefinition(1)【讲的很透】

转载自:spring源码系列(三)——beanDefinition(1)_java_lyvee的专栏-优快云博客_beandefinition

HD243608836的博客 229

智能检查点优化:动态频率与差异化存储的断点续训实践(模型训练丨容错机制丨人工智能)

本文深入探讨了大规模模型训练中智能检查点优化的核心实践。针对传统固定频率保存导致的存储浪费与恢复缓慢问题,提出了基于损失变化率的动态频率算法与分层差异化存储策略。通过PyTorch代码示例,详细展示了如何实现动态调度与增量保存,有效降低存储成本,并确保训练中断后能快速、可靠地恢复,显著提升训练任务的容错能力与经济效益。

weixin_29072299的博客 333

深度解析 Spring 源码:从BeanDefinition源码探索Bean的本质

本文深入解析Spring框架的核心组件之一,即BeanDefinition,探索Bean的本质。首先介绍了BeanDefinition的概念和作用,它是Spring中管理Bean配置元数据的接口,定义了Bean的各种属性和行为。接着,分析了BeanDefinition的实现类以及其重要属性,如Bean的类名、作用域、构造函数、依赖关系等。通过深入研究BeanDefinition的源码,揭示了Spring是如何管理和创建Bean实例的过程。

忆~遂愿的博客 5075

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 604

[逆向实战] 淘宝x5sec滑条验证码slidedata参数逆向与自动化过码方案

本文详细解析了淘宝x5sec滑条验证码的核心参数slidedata的生成机制与逆向过程,提供了Python自动化过码方案。通过分析滑动轨迹加密流程、还原AES加密算法,并设计人类行为模拟轨迹,帮助开发者有效绕过淘宝滑块验证,适用于爬虫开发与自动化测试场景。

weixin_30851867的博客 735

spring源码之BeanDefinition

spring源码阅读之BeanDefinition

qq_37729171的博客 1166

Unity卡牌游戏UI框架:数据驱动与模块化设计实践

在Unity游戏开发中,UI系统是连接玩家与游戏逻辑的关键桥梁,其核心在于实现数据与表现的高效同步。数据驱动设计通过分离数据模型、逻辑状态与视图表现,利用观察者模式自动响应状态变化,确保了代码的清晰与可维护性。这种架构显著提升了开发效率,尤其在需要复杂状态管理和实时反馈的交互场景中,如卡牌游戏的拖拽、布局与动画系统。基于模块化思想,开发者可以将卡牌视图、布局管理、区域控制等组件像积木一样组合,快速构建出动态的手牌弧形布局、战场区域管理等特色功能。通过集成对象池、图集优化等性能方案,还能有效管理绘制调用与网格

weixin_34262482的博客 453

Spring中的BeanDefinition系列(三)—— BeanDefinition实现类

前言 在 Spring中的BeanDefinition系列(二)中,我们讲解了AbstractBeanDefinition,AbstractBeanDefinition是BeanDefinition实现类的公用代码部分,那么这一节我们就来讲解 BeanDefinition各个重点实现类。 BeanDefinition重点实现类有哪些 RootBeanDefinition– 不能设置paren...

LCDZhao的艺术世界 1840

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1886

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

深入源码:Spring BeanFactoryPostProcessor 定制与修改 BeanDefinition 的原理与实战

BeanFactoryPostProcessor(Bean 工厂后置处理器)是 Spring IoC 容器生命周期中最早暴露给开发者的扩展点之一,它允许容器在**读取完 BeanDefinition 元数据之后、实例化任何普通 Bean 之前**,对 Bean 的定义信息进行读取与修改。本文以 `doocs/source-code-hunter` 仓库中 [Spring-BeanFactoryPo

gitblog_00581的博客 872

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Spring源码系列(三)BeanDefinition(二)

1.写在前面 在上篇博客《Spring源码系列(二)BeanDefinition(一)》我们大概的介绍了下BeanDefinition接口中的一些属性,还有两个BeanDefinition的父接口。同时简单的介绍了下对应的实现类AbstractBeanDefinition。但是还有些属性没有介绍,这篇博客会把这些属性介绍了,同时会介绍一下BeanDefinition接口的一些实现类。还是那句话,Spring创建Bean都是根据这个BeanDefinition来的,所以要搞懂Spring的源码,必须要搞懂这些

了不起的盖茨比的博客 688

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

spring源码分析之BeanDefinition相关

BeanDeifntion是spring比较核心的组件,它将我们定义的bean都会抽像成对应的BeanDefintion实例对象。了解其相关的知识点对于我们以后通读spring源码以及更加得心应手的应用有很多的好处。本篇博文针对BeanDefintion的家族相关的类与接口进行相关的介绍,同时针对我们项目中相关xml中定义相关的bean(各种各样bean)的属性进行了使用以及应用场景的介绍。以后会追加相关注解(好像没必要相关xml概念可以直接移植到注解的使用方式也是可用的)。

liushangzaibeijing的博客 6万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring源码系列(十六)Spring合并BeanDefinition的原理

1.写在前面 前面的博客,笔者介绍spring中创建Bean的过程,但是还是没有讲完,只讲了如何将这个Bean给实例化出来,但是有关这个bean的所有的内容、属性等等东西,都还没有填充,由于将后面的创建的Bean的流程,需要了解合并BeanDefinition的原理,所以今天笔者打算讲下合并BeanDefinition的原理讲下。 2.什么是合并BeanDefinition 我们先来看个例子,具体的代码如下: package com.ys.mergeBeanDefinition; public class

了不起的盖茨比的博客 2235

spring的beanDefinition是什么

在spring源码中,会涉及到bean和beanDefinition这两个概念,接下来,说下什么是bean,什么是beanDefinition

小小少年的博客 3600

Spring扫描BeanDefinition源码

类/接口职责扫描类路径下的组件,生成。处理和,触发扫描流程。读取类元数据(如注解信息),无需加载类。注册到容器。通过以上流程,Spring 完成从组件扫描到注册的全过程。如果需要自定义扫描逻辑(如过滤规则),可以通过扩展TypeFilter或重写方法实现。

weixin_44658106的博客 665
上一篇: spring源码系列(二)——毁三观的spring自动注入
下一篇: spring源码系列(四)——beanDefinition(2)
子路程序员
博客等级 码龄17年 8814粉丝 10原创
评论 79
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子路程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值