spring的配置加载原理及源码解读

spring的配置是怎样加载的,加载配置的同时都干了什么,配置的先加载后加载造成的影响
1、spring 配置加载
spring的配置加载原理及源码解读_第1张图片
(图1.1.1)
spring的配置信息是在spring refresh方法时候在创建beanFactory的时候调用的。
spring的配置加载原理及源码解读_第2张图片
(图1.1.2)
spring的配置加载原理及源码解读_第3张图片
(图1.1.3)
spring的配置加载原理及源码解读_第4张图片
(图1.1.3.1)
从源码看出spring是按照顺序加载文件中的bean,也就是按照配置文件的读取加载顺序加载的,为什么关心顺序是因为哪些配置先加载后加载会影响到执行的效果。下面会详解。
spring的配置加载原理及源码解读_第5张图片
(图1.1.4)
这里描述的是xml读取机载并注册bean描述信息的实现
spring的配置加载原理及源码解读_第6张图片
(图1.1.5)
spring的配置加载原理及源码解读_第7张图片
(图1.1.6)
spring的配置加载原理及源码解读_第8张图片
(图1.1.7)
spring的配置加载原理及源码解读_第9张图片
(图1.1.8)
spring的配置加载原理及源码解读_第10张图片
(图1.1.9)
以上代码是处理配置文件的读取,从代码看出来除了默认的元素(bean,beans,alias,import这些标签)没有使用特殊的解析器,其余都使用了定义的解析器(在spring标签使用的解析器)而且是通过元素的名称来选取自己对应的解析器。这些名称是使用spring自带的nameSpaceHandler及自定义的NamespaceHandler,他们都是NamespaceHandlerSupport的子类。

2、spring加载完配置注册配置的时候都做了什么呢
下面介绍两种非常常用的解析器,其余相关可按照此方法自行查看源码
对于代理而言有时候会选择出ConfigBeanDefinitionParser解析器(专门处理aspect ()切面的,
有时也会选择出AnnotationDrivenBeanDefinitionParser ,他是处理事务的代理的配置的等等,都是元素获取的如:
为什么说这两种呢,卖个关子,这两种非常特殊。
而这两种都会去注册自动代理创建者:
spring的配置加载原理及源码解读_第11张图片
(图2.1)
也就说无论事务,还是aspect都是aop的一种,同时在spring中他们都是代理的创建者,也是建言者的创建者。个人认为切面aspectj切面,事务代理,所有代理都是建言者(可能含有多个建言)。
spring的配置加载原理及源码解读_第12张图片
(图2.2)
从以上源码看出spring的代理创建者只有这么多,而使用哪种代理创建者取决于使用了哪种标签解析器。他们创建者是怎么注册的请看下面代码

3、配置的先加载后加载造成的影响
spring的配置加载原理及源码解读_第13张图片
(图3.1)
public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
“org.springframework.aop.config.internalAutoProxyCreator”;
名称为这个的代理创建者bean,当前容器中只有一个,先注册了就不会在创建第二个了。这个代理创建者的class也不会变。

由于加载配置文件是顺序加载并同时注册bean配置信息,那么如果先加载事务文件,那么这个代理创建者bean的实例就会是
InfrastructureAdvisorAutoProxyCreator,就算在再加载aop所在文件这个bean也不会是AspectJAwareAdvisorAutoProxyCreator了。这个实质性区别影响的非常大,而且非常占篇幅,我在下一篇针对一个实际问题来说明这个情况。

你可能感兴趣的:(spring,java,源码)