首先什么是spring的Ioc过程呢,如下代码所示:
ApplicationContext applicationContext = new ClasspathXmlApplicationContext("applicationContext.xml");
这条语句执行完毕,我们就说spring的IOC过程结束了,以为这你可以通过applicationContext随心所欲的获取你在配置文件中定义的各种Bean并加以使用。因此spring的IOC过程包括配置文件的定位、解析、加载,BeanFatory的创建等一系列过程。本文首先介绍IOC过程,然后对每个阶段进行详细介绍。流程图如下所示:
定位配置文件
spring定位配置文件的逻辑如下图所示:
解析配置文件
spring的ApplicationContext定位到配置文件以后,接下来便会解析配置文件。spring解析XML配置采用的是JDK的自带的DOM api来解析的,每解析一个Element标签,便会调用的相应的类来处理,那么标签和类之间的映射关系是如何对应上的呢?这个主要是由spring.handlers文件决决定,文件样式如图所示:
http\://www.springframework.org/schema/c=org.springframework.beans.factory.xml.SimpleConstructorNamespaceHandler
http\://www.springframework.org/schema/p=org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler
http\://www.springframework.org/schema/util=org.springframework.beans.factory.xml.UtilNamespaceHandler
spring是通过标签找到对应的URL,由URL找到对应的处理类,然后在这些处理类中将所有的标签解析成一个个BeanDefinition。在spring的应用程序中,默认的BeanDefinition实现类型是GenericBeanDefinition。在介绍Bean定义的属性和BeanDefinition对应之前,首要要介绍一下有哪些因素可以影响一个Bean的属性值,而要想介绍清楚这一点,首要要明白一个Bean按照作用域来划分,可以分为外部Bean和内部Bean,如下所示:
<beans>
<bean id=“firstBean” class=“org.ioc.FirstBean”> <!—外部Bean— >
<property name=“secondBean”>
<bean class=“org.ioc.SecondBean”/> <!— 内部Bean —>
</property>
</bean>
</beans>
如果一个Bean是外部Bean,那么影响他属性值的因素包括parentBean,标签中定义的Bean。如果一个Ban是内部Bean,影响他属性值的因素包括外部Bean。而且优先级都是自定义的属性值要高于parentBean或者外部Bean,但有一个例外,那就是内部Bean的scope属性,外部Bean的scope属性优先级要高于内部Bean的优先级,不难理解这是出于线程安全因素考虑。下面我们来阐述BeanDefinition和Bean定义之间的对应关系,如下表所示:原文