前面两 个小结中学习了spring 中的 bean 解析,装载过程。spring
先回顾一下吧!简单能够将这个过程分为四个步骤分别是框架
1,资源定位(spring 能够有多种建立bean的资源 xml,properties...) Resource 及其实如今spring框架中就担任定位资源文件的重要功能。学习
2,建立承载bean的容器 BeanFactory 就是完成这项功能的顶级接口。默认实现DefaultListableBeanFactoryprototype
3,bean 的解析根据不一样的资源文件解析获得bean对象的描述信息 BeanDefinition 对象。该过程是由BeanDefaintionRender接口和其集团实现来完成的。居于xml的XmlBeanDefaintionRender...xml
4,将解析的 bean 注册到IOC 容器中去,BeanDefaintionRegister接口中声明的loadBeanDefinitions(Resource);对象
就是要完成该功能。默认容器DefaultListableBeanFactory中已经实现。blog
回顾spring bean解析,装载过程以后接下来就是spring bean之间的依赖关系注入了.递归
解析,装载只是完成了bean的数据映射关系,只是将bean的基本信息映射为beanDefinition对象,能够看做是资源文件的解析过程。接口
spring 中bean是什么时候创建依赖关系的呢? 该过程是在于第一次获取bean的时候触发的(若是没有显示的声明 lazy-init)你也能够在加载bena 的时候就创建依赖关系可是这样的就会大大延长加载bean的时间。资源
也就是BeanFactory接口中的getBean(....);方法触发依赖关系的注入,该方法有多个重载形式但最后都会调用doGetBean(...);方法 该方法在AbstracBeanFactory中实现:
该方法主要完成如下几件事情:
1,根据名称查找容器中的BeanDefinition对象
2,获取当前 BeanDefinition 对象获取该bean依赖的其余bena对象。递归调用 getBean 方法 。
3,而后根据获得的BeanDefinition信息创建bean对象,这个对象创建好后依赖关系也就注入完毕了。(创建对象的时候singleton和prototype有所不一样)
singleton 建立完后放入map中 在 DefaultSingletonBeanRegistry类中实现。
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();
4 检查bean 的类型 返回bean对象。
singletone , prototype 两种bean 的建立过程源码再也不贴出,该方法中详细列出能够参看细节实现.
该方法还有一个值得注意的地方就是 在该方法中会调用 createBean(beanName, mbd, args); 该方法这是建立伊朗关系的具体代码实现方法。
该方法的实现是在 AbstractAutowireCapableBeanFactory 中实现
该方法检查bean 的状态,真正完成依赖关系注入的方法是doCrateBean方法
实例化不bean的实现createBeannInatance
...未完....