Spring的IOC(控制反转)是一种设计模式,它允许开发者将对象的创建和管理交给Spring框架来完成。在Spring中,IOC允许开发者将对象依赖关系从代码中分离出来,从而使代码更加灵活、可重用和易于管理。

IoC 全称Inverse of Control(反向控制或控制反转)。

在类和类之间存在控制权,控制权指的是对象的创建和使用,比如有类A和类B,我们之前的做法是在A中调用B,那么控制权就在A中,这样做的耦合度较高,如果修改了 B,A也要做相应修改。

class A {

} 

class B {
// B需要将A的实例new出来,也就是我们说的控制 private A a = new A();
public void use() {
System.out.print(a);
}
}

引入Spring框架后,控制权由 spring 容器来负责。当A想使用B时,需要由 Spirng容器通过配置文件进行注入。这种思想就是IoC(为了更好的理解,我们可以这样认为,对象创建和使用的控制权转移到了Spring容器,由Spring容器来控制)。

// 说明A自己控制自己,把自己初始化出来,注入给了容器
@Component
class A { } class B {
// B不需要控制a,直接使用。如果A没有把自己注入给容器,B就不能使用
@Resource private A a; public void use() {
System.out.print(a);
}
}

实现Spring的IOC(控制反转)有以下几种方式

  • 使用@Autowired注解:这是Spring中最常用的实现IOC的方式。通过在需要依赖注入的类上使用@Autowired注解,Spring会自动将依赖对象注入到该类中。

  • 使用配置文件:通过在Spring配置文件中定义bean,可以手动创建和管理对象。这种方式适合于需要灵活控制对象创建和生命周期的情况。

  • 使用Java配置:通过使用Java配置类,可以更灵活地定义bean和配置对象之间的关系。这种方式适合于需要更细粒度控制的情况。

如何实现一个简易的IOC功能?

上述是Spring容器简单的使用IOC功能,如果我们自己想实现一个简单版的,可以按照以下步骤:

  • 定义一个容器类,用于管理对象的创建和注入。

  • 实现对象的创建方法,可以使用常见的工厂模式或依赖查找等方式来创建对象。

  • 在容器类中定义一个注入方法,用于将对象注入到需要依赖的对象中。

下面是一个简单的代码示例,展示了如何实现一个简易的IOC功能:

// 定义容器类
public class ObjectContainer {
// 创建对象的方法
public static Object createObject(String className) throws Exception {
// 使用反射创建对象
return Class.forName(className).newInstance();
} // 注入对象的方法
public static void injectObject(Object target, String className) throws Exception {
// 将对象注入到目标对象中
Field field = target.getClass().getField(className);
field.set(target, ObjectContainer.createObject(className));
}
} // 使用示例
public class ExampleClass {
private Object obj; // 需要注入的对象 public ExampleClass(String className) {
try {
// 注入对象
ObjectContainer.injectObject(this, className);
} catch (Exception e) {
e.printStackTrace();
}
} public void doSomething() {
// 使用对象进行操作
obj.method();
}
}

在上面的示例中,我们定义了一个ObjectContainer类,它包含了创建对象和注入对象的方法。在ExampleClass中,我们使用了ObjectContainer的注入方法将对象注入到目标对象中。使用时只需要传入对象的类名即可。

请注意,上述示例只是一个简单的实现,没有考虑一些复杂的场景,例如循环依赖、类型转换等问题。在实际开发中,需要根据具体的需求和场景进行适当的调整和优化。

使用IOC有哪些好处?

①、使用者不用关心引用Bean的实现细节,譬如对于B b = new A(c,d,e,f);来说,如果B要使用A,那还要 把c,d,e,f侈个类全都感知一遍,这显然是非常麻烦且不合理的。

②、不用创建多个相同的bean导致浪费,仍然是:

A b = new A();
A c = new A();

如果B和C都引用了A,那么B和C就可能new两个A实例,实际上,我们只需要一个就好了。

③、Bean的修改使用方无需感知。同样是上面的例子,假如说Bean A需要修改,如果没有IOC的话,所有引用到A的其他Bean都需要感知这个逻辑,并且做对应的修改。但是如果使用了IOC,其他Bean就完全不用感知到。

Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?的更多相关文章

  1. Java 反射和内省实现spring的IOC和DI

    1.构造两个JavaBean package com.spring.model; public class People { private Car car; public Car getCar() ...

  2. Java面试题 Web+EJB & Spring+数据结构& 算法&计算机基础

    六.Web 部分:(共题:基础40 道,基础37 道,中等难度3 道) 122.说出Servlet 的生命周期,并说出Servlet 和CGI 的区别? [基础] 答:Web 容器加载Servlet ...

  3. JAVA面试题:69道Spring面试题和答案

    目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spri ...

  4. (转)java之Spring(IOC)注解装配Bean详解

    java之Spring(IOC)注解装配Bean详解   在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...

  5. Java面试题集(七)--Spring常见面试问题【重要】

    以下为spring常见面试问题: 1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台. Spring ...

  6. Java面试题大全(javaSe,HTML,CSS,js,Spring框架等)

    目录 1. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说&和& ...

  7. 互联网大厂Java面试题集—Spring boot面试题(一)

    Spring Boot 需要独立的容器运行吗? 可以不需要,内置了 Tomcat/ Jetty 等容器.通过pom.xml中导入依赖: <!--spring-boot-starter-web:代 ...

  8. JAVA模拟Spring实现IoC过程(附源码)

    前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...

  9. Java工厂模式解耦 —— 理解Spring IOC

    Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...

  10. Java面试题(设计模式篇+Spring/Spring MVC篇)

    设计模式 88.说一下你熟悉的设计模式? 自行熟悉. 89.简单工厂和抽象工厂有什么区别? 简单理解简单工厂:对 一个对象的创建进行封装.抽象工厂:对 一组对象的创建进行封装. 比如生产 陶瓷马 和  ...

随机推荐

  1. HDFS Short-Circuit Local Reads

    目录 1.背景 2.配置 2.1 检测是否启用libhadoop.so 2.2 设置套接字路径 2.3 配置示例 2.4.1 /var/lib/hadoop-hdfs目录未创建 2.4.2 创建 /v ...

  2. go两种遍历chan

    go中对通道chan遍历有两种方式一种是用range另一种为for select. package main import ( "fmt" "strings" ...

  3. 【Nginx】如何使用自签CA配置HTTPS加密反向代理访问?看了这篇我会了!!

    写在前面 随着互联网的发展,很多公司和个人越来越重视网络的安全性,越来越多的公司采用HTTPS协议来代替了HTTP协议.为何说HTTPS协议比HTTP协议安全呢?小伙伴们自行百度吧!我就不说了.今天, ...

  4. FPGA 原语之一位全加器

    FPGA原语之一位全加器 1.实验原理 一位全加器,三个输入,两个输出.进位输出Cout=AB+BC+CA,本位输出S=A异或B异或C.实验中采用三个与门.一个三输入或门(另外一个是两个或门,功能一致 ...

  5. KingbaseES角色和权限介绍

    KingbaseES 使用角色的概念管理数据库访问权限.为了方便权限管理,用户可以建立多个角色,对角色进行授权和权限回收,并把角色授予其他用户. 数据库初始化时,会创建一个超级用户的角色:system ...

  6. 【已解决】git reset命令误删本地文件怎么恢复

    执行 git  reflog 命令可以看到曾经执行过的操作,还有版本序号. 执行 git reset --hard HEAD@{[填那个序号]} 就可以恢复本地删除的文件了!

  7. 【Java】abstract class 和 interface 有什么区别?

    含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象.含有 abstract 方法的类必须定义为 abstract class,abstract class ...

  8. Go 语言 Printf 函数和格式化动词详解

    Printf() 函数可以使用多种格式化动词对输出进行格式化.下面是可以与所有数据类型一起使用的一些通用格式化动词: 以下动词适用于所有数据类型: 动词 描述 %v 以默认格式打印值 %#v 以 Go ...

  9. HarmonyOS卡片刷新服务,信息实时更新一目了然

    如今衣食住行娱乐影音等App占据了大多数人的手机,一部手机可以满足日常大多需求,但对需要经常查看或进行简单操作的场景来说,总需要用户点开App操作未免过于繁琐. 针对该问题, HarmonyOS SD ...

  10. C++调用Python-5:调用Python函数,传参数字+字符串

    # mytest.py def myjoin(a, b): print("num a + str b") return f"{a}=={b}" #include ...