IOC过程的一些注意点

一 lazy-init和预实例化

对lazy-init属性的处理是从refresh()方法开始的,在refresh()中的finishbeanfactoryInitialization封装了对lazy-init属性的处理,实际的处理是在DefaultListableBeanFactory这个容器的preInstantiateSingletons方法中完成的,该方法对单件Bean完成预实例化,这个方法里使用getbean来触发依赖注入。与其他在IOC容器初始化完成后进行依赖注入相比,lazy-init属性的类bean在初始化的同时就进行依赖注入

在这里插入图片描述
在这里插入图片描述

二 Factorybean的实现

FactoryBean为应用生成需要的对象,如proxyFactoryBean这样特殊的bean。Factorybean是从下面的方法调用中获取的:
bean = getobjectForBeanInstance(sharedinstance,name,beanName,mbd);

在这里插入图片描述
getobjectForBeanInstance调用getObjectFromFactoryBean方法,再调用dogetobjetcfromfactorybean,最后调用factory的getobejct对象或factorybean,Factorybean的产生采用了工厂模式。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三 BeanPostProcessor的实现

Beanpostprocesssor是使用IOC容器经常遇到的特性,这个Bean的后置处理器是一个监听器,可以监听容器触发的事件。当注册beanpostprocessor后,容器中的Bean具有了接受IOc容器事件回调的能力。一个具体的bean后处理器需要实现BeanPostProcessor,然后设置到xml的bean配置文件。它有两个接口方法:postprocessbeforeInitialization,在bean初始化前提供回调入口,一个是postprocessafterInitialization,在bean初始化后提供回调入口。

在这里插入图片描述
对postprocessbeforeInitialization和postprocessafterInitialization的调用是在populateBean完成之后的initializeBean里进行调用的。bean的初始化工作包括:类型为BeanNameAware的Bean设置Bean的名字,类型是BeanClassLoadAware的Bean设置装载器,类型是BeanFactoryAware的bean设置自身的Ioc容器以供回调使用,在初始化工作完成后可以得到由IOC容器托管的可以自由使用的bean。

在这里插入图片描述
在这里插入图片描述
四 autowiring自动装配的实现
通过beandefinition的属性值和构造函数以显示的方式对bean的依赖关系进行管理。相对于显示的依赖管理方式,Ioc还提供了自动装配的方式。主需要配置好autowiring属性,Ioc容器会根据属性的配置,使用反射自动查找属性的类型或名字,基于属性的类型或名字去匹配Ioc容器中的bean,完成注入。

对autowiring属性的bean的自动装配是在populatebean中实现的,在populate的实现中,在处理一般的bean前,先对autowiring属性进行处理。如果当前bean配置了autowire_by_name和autowire_by_type属性,调用相应的autowireByName方法或autowireByType方法。

例如对于autowire_by_name,首先通过反射机制从当前的Bean中得到需要注入的属性名,然后使用这个属性名向容器申请与之同名的Bean,调用getbean方法,实际上又促进另一个bean的初始化和依赖注入。

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值