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的类图
![](https://img-my.csdn.net/uploads/201212/14/1355459003_4961.png)
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