谈谈你对Spring IoC理解?
3 个回答
改变的秘密,是把所有的精力全放在新的事物上,而不是与过去抗衡。姬无双### 对Spring的IoC的理解 #### 什么是IoC? IoC(Inversion of Control,控制反转)是指将对象的创建和管理的控制权从应用程序代码转移到外部容器(如Spring容器)。IoC的核心思想是将对象的依赖关系从代码中解耦,使得对象与对象之间的依赖关系变得更加灵活和可配置。 #### IoC的核心概念 1. **控制反转**: - **定义**:以前创建对象的主动权和时机由开发者自己把控,而在IoC中,这种权力转移到了Spring容器。容器根据配置文件或注解去创建实例并管理各个实例之间的依赖关系。 - **好处**:对象与对象之间松散耦合,有利于功能的复用和测试。 2. **依赖注入(DI,Dependency Injection)**: - **定义**:依赖注入是IoC的一种具体实现方式,它通过构造器、setter方法或注解将对象所依赖的资源注入到对象中。 - **好处**:使得应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源,进一步解耦组件之间的依赖关系。 #### IoC的实现方式 Spring框架提供了三种常见的依赖注入方式: 1. **构造器注入**: - **定义**:通过构造函数参数注入依赖对象。 - **示例**: ```java public class Service { private final Dependency dependency; public Service(Dependency dependency) { this.dependency = dependency; } } ``` 2. **Setter方法注入**: - **定义**:通过setter方法注入依赖对象。 - **示例**: ```java public class Service { private Dependency dependency; public void setDependency(Dependency dependency) { this.dependency = dependency; } } ``` 3. **基于注解的注入**: - **定义**:通过注解(如@Autowired、@Inject)注入依赖对象。 - **示例**: ```java @Component public class Service { @Autowired private Dependency dependency; } ``` #### IoC的实现原理 - **反射机制**:Spring容器使用Java的反射机制,根据配置文件或注解在运行时动态地创建对象、管理对象及其依赖关系,并调用对象的方法。 - **配置文件**:Spring容器根据XML或Java配置类(或注解)的配置内容,加载Bean定义,创建和管理Bean实例。 ### 例子 #### XML配置示例 **配置文件(applicationContext.xml)**: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dependency" class="com.example.Dependency"/> <bean id="service" class="com.example.Service"> <constructor-arg ref="dependency"/> </bean> </beans> ``` **Service类**: ```java public class Service { private final Dependency dependency; public Service(Dependency dependency) { this.dependency = dependency; } } ``` #### 注解配置示例 **配置文件(Spring配置类)**: ```java @Configuration @ComponentScan(basePackages = "com.example") public class AppConfig { } ``` **Service类**: ```java @Component public class Service { @Autowired private Dependency dependency; } ``` ### 总结 - **IoC(控制反转)**:将对象的创建和管理控制权从应用程序代码转移到Spring容器,使得对象与对象之间的依赖关系变得更加灵活和可配置。 - **DI(依赖注入)**:IoC的一种具体实现方式,通过构造器、setter方法或注解将对象所依赖的资源注入到对象中。 - **注入方式**:Spring提供了构造器注入、setter方法注入和基于注解的注入三种方式。 - **好处**:IoC使相互协作的组件保持松散耦合,利于功能复用和测试;AOP编程允许将通用功能分离出来,形成可重用的功能组件。 通过理解和使用IoC,可以更好地管理应用程序的依赖关系,提高代码的灵活性和可维护性。发布于 2024-05-20 15:53 •IP属地 河南举报评论收藏
自己喜欢的东西,就不要问别人好不好。粑粑OC就是invention of control,就是控制反转,将对象获取外界依赖资源的方式反转了。假设一个对象A依赖于对象B,在没有IOC以前,就是在对象A需要使用对象B时,去用代码显式地创建一个对象B。有了IOC以后,可以由Spring IOC容器来负责对象B的创建和销毁,创建后放在容器中,在对象A需要的时候再来取。 DI(Dependency Injection,依赖注入)其实就是IOC的另外一种说法,就是IOC是通过依赖注入技术实现的。发布于 2022-02-19 13:45 •IP属地 河北举报评论收藏
不要在赚钱的路上把健康丢了,要在健康的路上顺便把钱赚了。美啦美啦美啦### 前言 面试中经常被问到,谈谈你对Spring IoC的理解,初学者可能很难解释清楚,相信看完本篇,将有助于同学们加深理解spring,并且再也不怕面试被问到这个问题了。 ### 1、什么是IoC IoC即Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。 简单理解: 传统开发中,我们在对象内部通过new关键字,创建依赖的对象,我们主动控制依赖的对象;而IoC有专门一个容器来创建依赖对象,对象内部只是被动的接受这些依赖的对象。 上面就解释了“控制反转”:依赖对象的获取给反转了。之前,依赖对象由对象内部主动创建获取,现在,依赖对象由容器创建,对象从容器中获取依赖对象。 ### 2、什么是DI IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。 简单理解: A对象需要一个B对象的依赖,以前,我们需要编写代码手动构建B对象,有了DI(依赖注入),我们不需要构建B对象、何时构建,Spring会在合适的时候注入B对象,完成各个对象之间的控制。 ### 3、Spring容器的设计 对于 IoC 来说,最重要的就是容器,容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。Spring中设计了两个接口来表示容器,分别是BeanFactory、ApplicationContext。 BeanFactory: BeanFactory可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。 ApplicationContext: ApplicationContext比 BeanFactory 多了更多的功能,比如:资源的获取,支持多种消息等,该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的 Bean。 ### 4、IoC的初始化过程 本段落只以文字的形式进行大纲说明,有兴趣的同学可以对照源码进行对照分析,IoC初始化的过程本质上是实例化Bean的过程。 Resource定位;指对BeanDefinition的资源定位过程。通俗地讲,就是找到定义Javabean信息的XML文件,并将其封装成Resource对象。 BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是BeanDefinition。 向IoC容器注册这些BeanDefinition。 #### 5、DI的注入过程 Spring IoC容器的整个启动过程,仅仅是BeanDefinition的载入和注册,Javabean之间的依赖关系,在调用 getBean 的时候,进行真正的依赖注入,有的同学会问,为什么不在载入的时候就注入? 假设,有Bean_A对象依赖Bean_B对象,因为加载的顺序不同,很可能 Bean_A 依赖的 Bean_B 还没有加载好,也就无法从容器中获取,所以如果 Bean 有依赖关系,则使用占位符暂时代替,在调用 getBean 的时候,才将依赖的对象真正的注入。 因此,Spring 将其分为了 2 个步骤: 加载所有的 Bean 配置成 BeanDefinition 到容器中,如果 Bean 有依赖关系,则使用占位符暂时代替。 在调用 getBean 的时候,进行真正的依赖注入,即如果碰到了属性是 ref 的(占位符),那么就从容器里获取这个 Bean,然后注入到实例中 —— 称之为依赖注入。发布于 2022-02-10 15:57 •IP属地 湖南举报评论收藏
公众号进入网站体验更佳

