一 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的初始化和依赖注入。