spring的IoC初始化和依赖注入

来源:互联网 发布:java中random怎么用 编辑:程序博客网 时间:2024/05/16 05:40

跟随着《Spring技术内幕》,尝试去理解Spring中的原理,咬牙读着源码倒也有点儿收获了。两天时间看完了IoC机制,记录如下:

BeanFactory——为提供给用户使用的IoC容器所设定的最基本的功能规范。IoC容器的职责包括定位资源文件、载入解析BeanDefinition、注册Bean到容器的beanDefinitionMap中,若应用中需要用到bean则触发getBean方法来进行Bean的实例化和设置Bean之间的依赖关系。

BeanDefinition——Bean定义和依赖关系在IoC容器的抽象,是IoC容器管理基于Spring应用中的各种对象的核心数据结构。

DefaultListableBeanFactory——包含了基本IoC容器所具有的重要功能。Spring中,实际上是把DefaultListableBeanFactory作为一个默认的功能完整的IoC容器来使用。

FactoryBean——一个能产生或修饰对象生成的工厂Bean。用户使用容器时,可用转义符“&”来得到FactoryBean本身,用来区分通过容器来获取FactoryBean产生的对象和获取FactoryBean本身。


IoC的初始化:Resource定位BeanDefinition文件——》BeanDefinition载入和解析(置入BeanDefinitionHolder中)——》向容器注册BeanDefinition(beanDefinitionMap.put(beanName, beanDefinition)放入HashMap中,beanDefinitionMap存在于DefaultListableBeanFactory中)。

注册完毕之后,所有的BeanDefinition已经可以被使用,都在beanDefinitionMap里被检索和使用。这些信息是建立依赖反转的基础。


IoC容器的依赖注入——除了通过设置lazyinit属性对Bean预实例化外,其它Bean都是用户第一次向IoC容器索要Bean时触发依赖注入。

触发点getBean():

1、先从缓存中取得Bean,处理那些已经被创建过的单例Bean

 2、若1没取到,则对IoC容器中的BeanDefinition是否存在进行检查,若在当前的BeanFactory中取不到BeanDefinition,则到双亲IoC中取,以此类推,顺着双亲    BeanFactory链向上找。

 3、否则,开始创建Bean(createBean),获得当前Bean的所有依赖Bean,这样会触发getBean的递归调用,知道取到一个没有任何依赖的Bean为止。

(1)createBean(createBeanInstance进行实例化、populateBean设置依赖关系)

(2)然后getObjectBeanInstance(beanInstance,....),如果beanInstance为普通bean,则返回它;否则若beanInstance为FactoryBean则返回生产出的Bean

Spring实例化Bean的三种方式分别是

1,xml配置使用bean的类构造器

2,xml配置+factory类,使用静态工厂方法实例化

3,xml配置+factory类,使用实例工厂方法实例化


0 0
原创粉丝点击