spring Ioc大致过程

spring IoC 就是一个容器。类似一个hashMap,存的key是beanName,value是beanDefinition。


要读取配置文件,如xml或者property文件。

第一步就是要创建一个资源加载器ResourceLoader,这个类实例会根据路径(先判断是绝对路径还是相对路径)拿到所有的资源文件。

第二步是从Resource中读取BeanDefinition,通过loadBeandefinition()方法,将xml文件转化成DOM对象。解析过程会由documentLoader对象来进行。

第三步是解析过程。获取到Bean定义的Document对象根元素的所有子节点。用if ( node instanceOf Element) 获得是xml元素的节点,再看该节点是否使用的是spring默认的命名空间。如果是,就使用spring的bean规则解析元素节点。如果不是,就使用用户自定义的解析规则。

    进行解析

解析中要考虑到各种不同的bean类型。如是否为单例之类。

开始解析。判断是哪一种标签。

1、先解析<import>导入元素,从给定的导入路径加载定义资源到Spring IoC容器中。(其中要获取location属性值,使用系统变量值SystemPropertyUtils解析location属性值,标示是否为绝对路径)。

2、解析别名元素。通过加一个映射,指向对应的bean 

3、解析<Bean>,如果没有配置id,别名或name,且没有包含子<Bean>元素,就会为解析的bean生成一个唯一的beanName并注册。如果有子<Bean>,取别名再注册。

4、 解析<property>。解析<property>,a、ref被封装为指向依赖对象的一个引用 b、value配置都会封装成一个字符串类型的对象 c、ref和value都通过“解析的数据类型属性值.setSource(extractSource(ele));”方法将属性值/引用与所引用的属性关联起来。 

5、 解析<property>的子元素


注意,解析并没有实例化对象。只是生成了IoC容器所识别的数据结构BeanDefinition。并向容器了中注册了解析的bean。IoC容器的作用就是对注册的Bean的定义信息进行处理和维护。


依赖注入发生的时间在 1、第一次用户调用getBean的时候 2、<Bean>元素有lazy-init属性的时候。

lazy-init的bean是如何被解析的呢?Autotired是如何被解析的?暂时先不回答。


注入的方式就是通过反射。知道了beanName。class.forname("")拿到class对象。newInstance()来生成实例,再用BeanDefinition中的信息调用实例的set()方法,将实例的属性进行赋值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值