zoukankan      html  css  js  c++  java
  • Spring IOC 学习(三)IOC容器的依赖注入

    前面两 个小结中学习了spring 中的 bean 解析,装载过程。

    先回顾一下吧!简单可以将这个过程分为四个步骤分别是

    1,资源定位(spring 可以有多种创建bean的资源 xml,properties...) Resource 及其实现在spring框架中就担任定位资源文件的重要功能。

    2,创建承载bean的容器 BeanFactory 就是完成这项功能的顶级接口。默认实现DefaultListableBeanFactory

    3,bean 的解析根据不同的资源文件解析得到bean对象的描述信息 BeanDefinition 对象。该过程是由BeanDefaintionRender接口和其集团实现来完成的。居于xml的XmlBeanDefaintionRender...

    4,将解析的 bean 注册到IOC 容器中去,BeanDefaintionRegister接口中声明的loadBeanDefinitions(Resource);

    就是要完成该功能。默认容器DefaultListableBeanFactory中已经实现。

    回顾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 

    ...未完....

  • 相关阅读:
    黑客网银木马服务器曝光 14家银行网银遭监控 狼人:
    卡巴斯基实验室CE0来华启动卡巴斯基安全中国行 狼人:
    天清汉马UTM获“北京市自主创新产品”称号 狼人:
    IBM称欧亚受Conficker病毒感染最严重 狼人:
    卡巴斯基联手功夫巨星成龙 五月鸟巢开唱 狼人:
    微软4月14日起不再为所有XP用户提供安全补丁 狼人:
    卡巴斯基爱好者见面会 卡巴斯基先生与卡fans亲密互动 狼人:
    愚人节黑客以身试法 人民法院被挂马 狼人:
    微软:97%电子邮件属于垃圾邮件 狼人:
    4月3日 尤金.卡巴斯基在北大精彩演讲 狼人:
  • 原文地址:https://www.cnblogs.com/javafengyi/p/3624487.html
Copyright © 2011-2022 走看看