Spring IOC(控制反转)与DI (依赖注入)
IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。
IoC和DI的关系,其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“ 依赖注入” 明确描述了“被注入对象依赖IoC 容器配置依赖对象”
Spring Bean的加载过程
- 容器的初始化做了几件事情:
- 资源的定位,就是定位你配置的xml文件
- 对resource文件进行解析,解析成spring 定义的BeanDefinition
- 对BeanDefinition 进行注册,其实就相当于把BeanDefinition 放到一个CurrentHashMap
- 依赖的注入:
- 根据BeanDefinition创建Bean实例
- 为Bean注入依赖的实例
下面是流程
这个接口体系是以BeanFactory和ApplicationContext为核心的。BeanFactory是IOC容器的最基本的接口,ApplicationContext一方面继承了BeanFactory体系的:ListableBeanFactory和HierachicalBeanFactory,具备了BeanFactory IOC容器的基本功能,另一方面,又通过继承MessageSource、ResourcePatternResource、EnvironmentCapable、ApplicationEventPublisher这些接口,拥有了更高级的IOC容器特性。
项目中Spring的过程
首先Web项目使用Spring是通过在web.xml里面配置org.springframework.web.context.ContextLoaderListener初始化IOC容器的
ContextLoaderListener继承了ContextLoader,并且实现ServletContextListener接口。当Server容器(一般指tomcat)启动时,会收到事件初始化。initWebApplicationContext方法是在org.springframework.web.context.ContextLoader类里面,它做了几件事情:首先是判断servletContext中是否已经注册了WebApplicationContext,如果有则抛出异常,避免重复注册。然后就是启用log,启动计时。接着进行了一系列复杂的东西, 将ServletContext设置成XmlWebApplicationContext的属性,这样就可以通过XmlWebApplicationContext读取web.xml中配置的spring文件,然后就是进行上面的IOC容器的实例化及bean的注入。
上面对于Spring的几个图和简单说明还是可以看的,不过Spring的源码读起来不是那么好看,这里给大家一个建议:沿主线把代码跟一遍,再回头去看辅助代码。因为Spring是一个很成熟的框架了,它在编码过程中要考虑的问题很多,比如IOC容器启动,我们只需要知道它是如何定位Resource,如何解析BeanDefinition,如何注册。那么在这个过程中,会有很多的基于安全、性能、扩展等等的考虑,加上Spring运用了很多的设计模式,也就产生了很多的我们眼中的冗余、不知道干啥的代码。所以,前几遍读源码,要能抛开这些代码跟着主线代码一直看下去,等你把这个过程搞清楚了,再回头去看一些前面的辅助代码。
相关推荐
在实际开发中,Spring使用了更加高效和灵活的方式来实现这些功能,比如使用`ApplicationContext`接口作为IOC容器的入口,以及`BeanFactory`作为底层的工厂。此外,Spring还提供了AOP(面向切面编程)、事务管理、...
IOC容器是 Spring 框架的核心组件之一,它提供了一个统一的方式来管理应用程序中的对象。IOC 容器的主要功能是将对象的创建、管理和依赖关系解耦,使得应用程序更加灵活、可维护和可扩展。 在 Spring 中,IOC 容器...
### Spring源码分析_Spring_IOC:深入理解Spring的IOC容器机制 #### 基本概念与核心作用 在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色...
### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...
本文的目标是分析 Spring 框架如何实现将资源配置(以 xml 配置为例)通过加载、解析、生成 BeanDefination 并注册到 IOC 容器中的。 IOC 初始化流程可以分为以下几个步骤: 1. 设置资源解析器和环境 在创建 IOC ...
- **IOC容器**:Spring容器(如BeanFactory或ApplicationContext)负责创建、配置和管理对象,提供了依赖注入的能力。 3. **Spring模块** - Spring分为多个模块,如Core Container(核心容器)、Data Access/...
根据提供的文件信息,本次解读将围绕Spring框架的核心概念与源码分析进行展开。Spring框架作为Java企业级开发中不可或缺的一部分,其源码的学习对于深入...希望以上内容能够为大家学习Spring源码提供一定的参考和帮助。
深入理解Spring源码需要对Java反射、动态代理、设计模式等有扎实的基础。建议从以下几个步骤入手: 1. 了解基本架构和模块划分。 2. 分析核心类如ApplicationContext、BeanFactory和DispatcherServlet的实现。 3. ...
3. 分析关键组件的源码,如IoC容器、AOP、MVC等。 4. 创建小型示例应用,利用源码中的功能,以便于实际操作和理解。 5. 使用断点、日志等方式进行调试,观察Spring框架内部工作流程。 通过以上步骤,开发者不仅可以...
标题 "手动实现一个IOC容器.zip" 提到的主题是关于如何从零开始构建自己的依赖注入(Dependency Injection,简称DI)容器,这在Java开发中尤为重要,特别是对于Spring框架的理解和学习。IOC容器是Spring的核心功能之...
实现一个简单的仿Spring IoC容器,我们需要以下几个关键步骤: 1. **定义Bean元数据**:在Spring中,Bean的定义通常通过XML配置文件或Java注解完成。在仿制品中,我们可以创建一个Bean类,用于存储对象的信息,包括...
1. **了解设计模式**:Spring源码中广泛应用了设计模式,如工厂模式、单例模式、装饰者模式等,理解这些模式有助于理解源码。 2. **阅读核心类**:从BeanFactory和ApplicationContext开始,逐步深入到AOP、Web MVC等...
4. **Spring框架的应用**:Spring作为实现IoC和AOP的常用工具,会详细讲解如何配置和使用Spring容器。 5. **重构过程**:分享重构从旧版CurrencyExchange到使用IoC和AOP的新版CurrencyExchange2的具体步骤和考虑因素...
### Spring源码解析知识点 #### 一、Spring IoC 容器详解 ##### 1. BeanFactory —— 最基础的IoC容器 - **概念**:`BeanFactory` 是Spring框架中最基本的IoC容器,它负责管理Bean的生命周期,包括创建、配置和...
3. **IoC容器**:Spring IoC容器是Spring的核心,负责管理对象的生命周期和装配。它可以是BeanFactory或ApplicationContext,前者是基本实现,后者提供更多的企业级功能。 4. **数据访问集成**:Spring支持多种数据...
### Spring源码解析知识点 #### 1. Spring IoC 容器概述 Spring 框架的核心特性之一是它的依赖注入(Dependency Injection, DI)能力,这种能力通过一个称为 Inversion of Control (IoC) 容器来实现。IoC 容器负责...
了解IoC容器的工作原理,包括Bean的定义、加载和实例化,以及依赖注入的实现方式。 2. **AOP(Aspect Oriented Programming)**:Spring的AOP模块提供了面向切面编程的支持,用于实现如日志记录、事务管理等横切...
- 创建`spring.xml`或`application-context.xml`文件,用于定义Spring容器管理的bean。 - 示例代码: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/...
3. **Spring IoC容器**:理解Spring IoC容器如何加载bean定义,如通过XML配置文件或者使用Java配置类来定义bean及其属性。 4. **依赖注入**:深入学习Spring的依赖注入方式,包括构造器注入、setter方法注入、接口...
在Java世界里,Spring框架是最著名的IOC容器实现之一,但除此之外,还有很多小型、轻量级的IOC容器,比如本案例中的"mini-container"。 "mini-container"是一个开源项目,它的目标是提供一个功能简洁但实用的IOC...