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

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也不会变。

经验分享 程序员 微信小程序 职场和发展