Spring学习(五)--Spring的IOC

1、BeanDefinition在IOC的注册

当BeanDefinition完成载入和解析之后,用户定义的BeanDefinition在IOC容器中已经建立自己的数据结构和数据表示,但是无法使用,需要进行注册,注册就是把解析得到的BeanDefinition放置到HashMap中。

通过在BeanLisabletDefinition中实现BeanDefinitionRegisitry接口,来完成注册。

注册调用过程:

2、IOC容器的依赖注入

依赖注入是用户第一次在IOC容器中查找Bean时发生的,通过BeanFactory接口的getBean()方法触发依赖注入。

依赖注入的过程:getBean()->creatBean()->instantiate()

生成Bean对象:(1)通过BeanUtils,JVN反射

       (2)通过CGLIB,SimpleInstantatiationStrategy()方法

依赖注入是发生在BeanWrapper的setProperty Values中实现的,具体的完成在BeanWrapper子类BeanWrapperImpl中。

在Bean的创建和对象依赖注入的过程中,需要依据BeaDefinition中的信息来递归的完成依赖注入。这些地柜都是以getBean()为入口的,一个递归是在上下文体系中查找需要的Bean和创建Bean的递归调用,另一个递归是在依赖注入时,通过递归调用GetBean()方法,得到当前Bean所依赖的Bean,同时触发对依赖Bean的创建和注入。

3、ApplicationContext和Bean的初始化和销毁

ApplicationContext启动是在AbstractApplicationContext中实现的。

使用上下文需要做一些准备工作,这些准备工作是在prepareBeanFactory()中实现的,这些方法中为容器配置了ClassLoader、PropteryEditor、BeanPostProcessor等。

容器的初始化和关闭过程:

容器关闭是在doClose()方法中完成的。

先发出容器关闭信号,再逐条关闭Bean,最后关闭容器。

Bean在IOC中的生命周期:

(1)Bean实例的创建。

(2)为Bean实例设置属性。

(3)调用Bean的初始化方法。

在initializeBean()方法中实现,调用初始化方法之前会调用一系列aware接口,把相关的的BeanClassLoader、BeanName、BeanFactory注入到Bean中去。

(4)应用通过IOC容器使用Bean。

(5)容器关闭时,销毁Bean。

3、lazy-init属性和预实例化

在finishBeanFeactoryInitialization的方法中封装了对lazy-init属性操作的方法,实际的处理是在DefultListableBeanFactory这个基本容器的preInstantiateSingletons方法中完成的。

4、BeanPostProcessor

BeanPostProcessor是Bean的后置处理器,是一个监听器,它可以监听容器触发的事件,实现BeanPostProcessor接口,然后设置到XML的Bean配置文件中。

猜你喜欢

转载自www.cnblogs.com/carblack/p/10872116.html