什么是Spring IOC?有什么作用?

news/2024/11/16 13:00:59/

1、什么是IOC?

IOC的全英文名是:Inversion Of Control ,直译过来就是控制反转,控制反转是把传统上由程序代码直接操控对象(new对象)的调用权交给ioc容器,由容器来实现对象的创建,依赖,销毁,初始化等等。

2、什么是 Spring IOC 容器?

Spring 框架是一个 IOC 容器的实现,DI 依赖注入是它的实现的一个原则,提供依赖查找和依赖注入两种依赖处理,管理着 Bean 的生命周期。Spring 还提供了 AOP 抽象、事件抽象、事件监听机制、SPI 机制、强大的第三方整合、易测试性等其他特性。

3、IOC 容器的作用?

  • 依赖处理,通过依赖查找或者依赖注入
  • 管理托管的资源(Java Bean 或其他资源)的生命周期
  • 管理配置(容器配置、外部化配置、托管的资源的配置)

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI)装配对象、配置对象)并且管理这些对象的整个生命周期。

简单的来说就是:

我们自己new一个对象,可能会导致程序耦合度过高,后期可能维护不便。引入IOC,将创建对象的控制权交给Spring的IOC容器;如果要去使用对象,通过DI(依赖注入)@Autowired注解 自动注入,就可以使用对象了!

4、IOC 和 DI 的区别?

DI 依赖注入不完全等同于IOC ,更应该说 DI 依赖注入是 IOC 的一种实现方式或策略。

依赖查找和依赖注入都是 IOC 的实现策略。

  • 依赖查找就是在应用程序里面主动调用 IOC 容器提供的接口去获取对应的 Bean 对象,而依赖注入是在 IOC 容器启动或者初始化的时候,通过构造器、字段、setter 方法或者接口等方式注入依赖。
  • 依赖查找相比于依赖注入对于开发者而言更加繁琐,具有一定的代码入侵性,需要借助 IOC 容器提供的接口,所以我们总是强调后者。
  • 依赖注入在 IOC 容器中的实现也是调用相关的接口获取 Bean 对象,只不过这些工作都是在 IOC 容器启动时由容器帮你实现了,在应用程序中我们通常很少主动去调用接口获取 Bean 对象。

5、IOC的优点有哪些?

  • 集中管理对象、方便维护 、降低耦合度

  • 最小的代价和最小的侵入性使松散耦合得以实现

  • IOC容器支持加载服务时的饿汉式,初始化的懒加载

6、Spring IoC 的实现机制是什么?

Spring 中的 IoC 的实现原理就是工厂模式加反射机制。

工厂相对应的就是beanfactory的getBean()方法,反射就是Spring底层实例化对象所采用的机制

实现代码示例:

interface fruit{void eat();
}class Apple implements fruit {@Overridepublic void eat() {System.out.println("Apple");}
}class Orange implements fruit {@Overridepublic void eat() {System.out.println("Orange");}
}class Factory {public static fruit getInstance(String ClassName) {fruit f = null;//通过反射创建对象 try {// 相当于Spring中new了一个ClassPathXmlApplicationContextf = (fruit)Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}
}class Test {public static void main(String[] args) {//getInstance时静态的,直接调用即可Factory.getInstance()fruit f = Factory.getInstance("Apple");if(f != null)f.eat();}
}//输出 Apple

注意点:

  • Class.forName(“”)返回的是类
  • Class.forName(“”).newInstance()返回的是object

源码下载:https://gitee.com/charlinchenlin/koo-erp


http://www.ppmy.cn/news/60690.html

相关文章

深入了解Java内存模型

前言 Java内存模型(Java Memory Model,简称JMM)是一种重要的规范,它定义了Java虚拟机(JVM)如何在多线程环境下进行内存管理。Java程序员必须理解JMM,才能正确并发编程。本文将详细介绍JMM的概念…

关于tomcat版本不同导致的get请求携带中文参数乱码的问题产生的过程

URL编码网址链接:https://tool.ip138.com/urlencode/ String arg "中文"; //模拟浏览器get请求输入中文参数byte[] bytes1 arg.getBytes(StandardCharsets.UTF_8);String res1 URLEncoder.encode(arg, "UTF-8"); //浏览器地址栏URL编码Stri…

【面试】面试官:说一下线程池7个参数的含义?

文章目录 前言一、参数1:corePoolSize二、参数2:maximumPoolSize三、参数3:keepAliveTime四、参数4:TimeUnit五、参数5:BlockingQueue六、参数6:ThreadFactory七、参数7:RejectedExecutionHandl…

api数据接口文档_接口文档示例(以1688平台API接口文档实例演示)

api数据接口文档_接口文档示例 本文主要是提供了一个接口文档的范文,内容修订历史、目录、时序图、接口要素描述、接口说明、使用示例、字典、FAQ。 使用MD格式文档(makedown),选择原因,容易格式转换,开发…

中间件漏洞(一)CVE-2013-4547(文件名逻辑漏洞)

目录 1. 了解nginx的工作原理 2. 漏洞原理及举例分析 3. 前端php源码分析 4. 注入思路 5. 漏洞复现 5.1 上传文件并抓包分析 5.2 通过访问文件执行php 注意一点 6. 漏洞修复 1. 了解nginx的工作原理 nginx是以PHP语言为主。像Apache一样,Nginx自身是不支持解…

Android 9.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

1.前言 在android9.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右…

在选择数据库时需要考虑的因素

在文章的第一部分中,我们奠定了理解各种数据库类型及其用例的基础。随着我们继续探索数据库选择的艺术,我们现在将更深入地探讨影响这个决策过程的关键因素。通过更详细地检查每个因素,我们可以更好地装备自己做出符合项目要求的知情选择&…

PostgreSQL数据库中的角色(Role)、用户(User)、模式(Schema)

文章目录 PostgreSQL数据库中的角色(Role)、用户(User)、模式(Schema)角色(Role)和用户(User)角色操作CREATE ROLE 创建角色ALTER ROLE修改角色属性DROP ROLE删除属性GRANT赋予权限REVOKE移除权限CREATE US…