spring的配置是怎样加载的,加载配置的同时都干了什么,配置的先加载后加载造成的影响
1、spring 配置加载
(图1.1.1)
spring的配置信息是在spring refresh方法时候在创建beanFactory的时候调用的。
(图1.1.2)
(图1.1.3)
(图1.1.3.1)
从源码看出spring是按照顺序加载文件中的bean,也就是按照配置文件的读取加载顺序加载的,为什么关心顺序是因为哪些配置先加载后加载会影响到执行的效果。下面会详解。
(图1.1.4)
这里描述的是xml读取机载并注册bean描述信息的实现
(图1.1.5)
(图1.1.6)
(图1.1.7)
(图1.1.8)
(图1.1.9)
以上代码是处理配置文件的读取,从代码看出来除了默认的元素(bean,beans,alias,import这些标签)没有使用特殊的解析器,其余都使用了定义的解析器(在spring标签使用的解析器)而且是通过元素的名称来选取自己对应的解析器。这些名称是使用spring自带的nameSpaceHandler及自定义的NamespaceHandler,他们都是NamespaceHandlerSupport的子类。
2、spring加载完配置注册配置的时候都做了什么呢
下面介绍两种非常常用的解析器,其余相关可按照此方法自行查看源码
对于代理而言有时候会选择出ConfigBeanDefinitionParser解析器(专门处理aspect ()切面的,
有时也会选择出AnnotationDrivenBeanDefinitionParser ,他是处理事务的代理的配置的等等,都是元素获取的如:
为什么说这两种呢,卖个关子,这两种非常特殊。
而这两种都会去注册自动代理创建者:
(图2.1)
也就说无论事务,还是aspect都是aop的一种,同时在spring中他们都是代理的创建者,也是建言者的创建者。个人认为切面aspectj切面,事务代理,所有代理都是建言者(可能含有多个建言)。
(图2.2)
从以上源码看出spring的代理创建者只有这么多,而使用哪种代理创建者取决于使用了哪种标签解析器。他们创建者是怎么注册的请看下面代码
3、配置的先加载后加载造成的影响
(图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框架如何加载配置信息,包括配置文件的读取顺序及其对应用的影响,并重点讲解了代理创建者注册的过程。
1843

被折叠的 条评论
为什么被折叠?



