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类,使用实例工厂方法实例化
- spring的IoC初始化和依赖注入
- spring IOC容器的初始化和依赖注入
- Spring的依赖注入IoC
- Spring ioc 的依赖注入
- Spring的Ioc和DI依赖注入的理解
- spring的IOC,DI依赖注入和AOP
- spring的IoC(控制反转)和DI(依赖注入)
- Spring的控制反转(IoC)和依赖注入(DI)
- Spring的依赖注入(DI)和控制反转(IOC)
- Spring的IOC和依赖注入DI理解
- Spring容器的控制反转(IOC)和依赖注入(DI)
- Spring IoC(控制反转)和DI(依赖注入)的理解
- Spring IoC(控制反转)和DI(依赖注入)的理解
- spring ioc依赖注入
- spring IOC依赖注入
- spring ioc 依赖注入
- Spring IOC 依赖注入
- Spring IoC依赖注入
- 抓取1688产品的代码
- Python 调用 C 语言的简单流程(二)
- iscroll.js用法
- 达芬奇平台-EMCV移植和测试
- HTML标签用法,这样去写你的 HTML
- spring的IoC初始化和依赖注入
- 启动ssh服务时,提示Could not load host key: /etc/ssh/ssh_host_rsa_key
- pat 1045
- oracle中 rownum和rowid的用法
- Android中常用适配器及定义自己的适配器
- ANDROID性能调优
- BF算法和KMP算法对比
- [cocos2dx 3.0 (一)] 对文件读写操作 +FileUtils类
- CF 229B. Planets