SpringIOC容器的实现(简述)

Spring的IOC和DI实际上说的是同一件事情。

IOC:(Inversion of Control)控制反转,简单的将就是将原始类A使用类B时需要在类A中创建B的操作,交给第三方(容器),将A控制B的权利反转给容器。

DI:(Dependency Injection)依赖注入,控制反转的概念有些不易理解,所以,换一种说法是A使用B,A不自己创建B,而依赖容器类帮他创建并注入到A中。

而Spring就是这样一个容器,它承担了创建bean的任务,并在使用的时候注入到合适地方,使类A和B的关系得到解耦。


下面先介绍一下主要涉及到的类。

BeanFactory:是IOC容器的核心接口, 它定义了IOC的基本功能,我们看到它主要定义了getBean方法。getBean方法是IOC容器获取bean对象和引发依赖注入的起点。

ApplicationContext:是IOC容器另一个重要接口, 它继承了BeanFactory的基本功能, 同时也继承了容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)等。

看下BeanFactory和ApplicationContex的类图


BeanDefinition:对应的是Spring的Bean配置文件中Bean定义内容的数据结构,也就是说Spring将bean的配置解析后,将这些bean以beanDefinition对象存放在内存的HashMap中等待调用。

BeanWrapper:主要完成依赖注入时bean属性的注入, 这些属性值包括List、Array、Map和非集合类的内容(bean本身和单值等)。注入是通过反射机制获得set方法,将对象设置进去的。



1、容器的初始化过程

1.1定位资源:这个过程使用,ResourceLoader进行,所谓资源就是定义了Bean的xml文件。spring定义了多种资源存放的方式, 如classpath、文件系统等。FileSystemResource、ClassPathResource、ServletContextResoruce。用户可以根据需选择合适的资源实现类访问资源。我们一般都使用类路径或文件系统定位资源。

1.2载入、解析、注册bean:找到了定义bean资源位置,下一步就就是讲他们载入到系统中。IOC将xml中定义的bean读入成为Document对象,并将Document对象解析成为BeanDefinition对象。spring将BeanDefinition对象存放中HashMap中,Ioc容器载入并解析完bean后,将BeanDefinition通过存放在了BeanFactory的beanDefinitionMap中。至此完成了容器的初始化过程。


2、依赖注入过程

容器完成初始化,并没有完成依赖注入。或者说大部分bean实例并没有在这个时候创建出来,也没有注入到需要使用它们的bean中。 

依赖注入是发生在第一次调用getBean方法时(除了lazy-init方式)。

2.1创建bean:在SimpleInstantiationStrategy中,通过JDK的反射创建了bean实例,也可以通过CGLIB创建bean实例。

2.2注入属性:通过BeanWrapper对bean的属性进行注入。

通过BeanDefinition中对bean的定义信息进行递归,注入的是bean,就调用getBean创建和注入bean;注入的是属性,就直接注入属性。

下面看一下流程图:


本文转自:http://blog.csdn.net/adoocoke/article/details/8290699

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值