《Spring源码深度解析》学习笔记-默认标签的解析
1.bean标签的解析及注册
1)通过解析委托类的方法返回BeanDefintionHolder实例
BeanDeifnition及其实现类图如下:

备注内为网上翻译的源码注释,总结就是有三种实现,Root和Child是硬编码,即在编写代码的时候就必须知道他们之间的关系。
自Spring 2.5 出来以后,已经被GenericBeanDefinition代替,可以动态的指定parent属性。
解析子元素meta

解析子元素lookup-method

解析子元素replaced-method

扩展:对应上面两种元素其实对应spring的两种注入--查找方法注入和强行替换注入,原理是AOP的cglib动态代理注入。
AOP动态代理有两种方式:JDK和CGLIB
JDK动态代理:业务类必须有对应的接口,动态代理类继承了Proxy,Java单继承,不能再继承其他类,只能通过实现接口实现
对代理实例封装实现InvocationHandler接口,通过Proxy.newProxyInstance()动态产生代理类
生成的代理类继承了Proxy实现了业务接口

CGLIB动态代理:有没有接口都可以,因为采用的是继承,继续业务类,产生其子类代理,所以不能对 final 修饰的类进行代理
实现CGLIB动态代理必须实现MethodInterceptor(方法拦截器)接口
注:由于CGLIB的大部分类是直接对Java字节码进行操作,这样生成的类会在Java的永久堆中,存在触发OutOfMemory异常的风险。
spring默认使用jdk动态代理,如果类没有接口,则使用cglib
Spring4已经完全内置了Cglib的功能,无需要额外的Cglib的jar包
解析子元素constructor-org:
提取index、type、name属性-->解析ref(RuntimeBeanReference封装)和value(TypeStringValue封装)属性-->子元素(镶嵌map)
指定index属性,属性信息被保存到indexedArgumentValues属性中;否则保存到genericArgumentValues属性中

解析子元素property

解析子元素qulifier:获取改元素最多的还是注解形式
2)返回的实例不为空时,默认标签子节点下再有自定义属性,还需要继续对自定义标签解析
XML转换为GenericBeanDefinition,GenericBeanDefinition只是子类,大部分属性都保存在了AbstractBeanDefinition中
3)解析完成后,对解析后的实例进行注册,该操作委托给了bean定义读取工具中的方法
BeanDefinitionReaderUtils.registBeanDefinition(bdHolder,getResoureceContext().getRegistry())


注: fail-fast 机制是Java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast(快速失败)事件
4)最后发出响应事件,通知监听器,bean已加载完成
getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
--------------------------------------------------------------------------------------------------------------------------
2.alias标签的解析

3.import标签的解析
applicationContext.xml使用import导入模块配置文件,简化后期维护复杂度,易于管理
eg: <import resource="XXX.xml">

4.嵌入式beans标签的解析
与单独的配置文件区别不大

浙公网安备 33010602011771号