当前位置: 首页 > news >正文

【javaEE进阶1】spring简介IoC

目录

  • 为什么要学框架?
  • Spring是什么?
  • 什么是容器
  • 什么是IoC
    • 实例分析
    • 总结
  • Spring IoC
  • DI

为什么要学框架?

  1. 框架相当于从小作坊,到工厂的升级,servlet什么都要自己做,而这里的框架是组件式装配,高效。
  2. 框架更加易用、简单且高效。

Spring是什么?

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因。Spring 支持广泛的应用场景,它可以让 Java 企业级的应用程序开发起来更简单。
一句话概括 Spring:Spring 是包含了众多工具方法的 IoC 容器

什么是容器

容器是用来容纳某种物品的(基本)装置。

  • List / Map :数据存储容器
  • Tomcat:包含众多web项目的web容器
  • 线程池

什么是IoC

Spring 也是一个容器,是一个 IoC 容器。
IoC( Inversion of Control):控制反转(控制权的反转)
Spring 是一个控制反转(IoC)的容器。

实例分析

在上述代码中,展示了一个简单的类依赖关系结构,其中Car类依赖于Framework类,Framework类依赖于Bottom类,Bottom类依赖于Tire类。

当运行Car类的main方法时,程序的执行顺序如下:

  1. Car对象被创建,构造函数Car(int size)被调用。
  2. 在Car的构造函数中,Framework对象被创建,并传入参数size。同时,Car构造函数中调用Framework的构造函数。
  3. 在Framework的构造函数中,Bottom对象被创建,并传入参数size。同时,Framework构造函数中调用Bottom的构造函数。
  4. 在Bottom的构造函数中,Tire对象被创建,并传入参数size。同时,Bottom构造函数中调用Tire的构造函数。
  5. 当所有对象都被正确创建后,Car对象调用其init()方法。
  6. 在Car的init()方法中,首先打印"do car",然后调用Framework的init()方法。
  7. 在Framework的init()方法中,首先打印"do framework",然后调用Bottom的init()方法。
  8. 在Bottom的init()方法中,首先打印"do bottom",然后调用Tire的init()方法。
  9. 在Tire的init()方法中,打印"do tire size : " + size。
public class Car {private Framework framework;public Car(int size) {//依赖车身framework = new Framework(size);}public void init() {System.out.println("do car");framework.init();}public static void main(String[] args) {Car car = new Car(20);car.init();}
}
public class Framework {private Bottom bottom;public Framework(int size) {//依赖底座bottom = new Bottom(size);}public void init() {System.out.println("do framework");bottom.init();}
}
public class Bottom {private Tire tire;public Bottom(int size) {//依赖轮胎tire = new Tire(size);}public void init() {System.out.println("do bottom");tire.init();}
}
public class Tire {private int size = 17;public Tire(int size) {this.size = size;}public void init() {System.out.println("do tire size : " + size);}
}

以上程序的问题是:当最底层代码改动之后,整个调⽤链上的所有代码都需要修改。

如何修改:
将原来创建的下级类,改为传递的方式(注入),不需要再在当前类中创建下级类,所以即使下级类发生变化,当前类也无需修改任何代码,这样就完成了程序的解耦。

public class Car {private Framework framework;public Car(Framework framework) {this.framework = framework;
//        framework = new Framework();//不 new ,不创建,我不再控制 framework}public void init() {System.out.println("do car...");framework.init();}
}
public class Framework {private Bottom bottom;public Framework(Bottom bottom) {this.bottom = bottom;}public void init() {System.out.println("do framework..");bottom.init();}
}
public class Bottom {private Tire tire;public Bottom(Tire tire) {this.tire = tire;}public void init() {System.out.println("do bottom..");tire.init();}
}
public class Tire {private int size = 17;public Tire(int size) {this.size = size;}public void init() {System.out.println("do tire size = " + size);}
}
public class Test {public static void main(String[] args) {Tire tire = new Tire(20);Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);Car car = new Car(framework);car.init();}
}

IoC不是一个具体的技术,是一个思想,将控制权交给别人的都可以称为IoC
传统new对象的方式创建顺序:
Car -> Farmework -> Bottom -> Tire

IoC类的创建顺序:
Tire -> Bottom -> Farmework -> Car
控制权的反转
在这里插入图片描述

总结

Spring 是一个 包含了众多方法的IoC 容器。
IoC( Inversion of Control):控制反转(控制权的反转)
控制权的反转可以理解为:A对象本来需要new 一个B对象,管理B对象的生命周期(也就是A对象掌握了B对象的控制权),现在A部管理B对象,交由其他人管理,对于A来说就是控制权的反转(IoC)。

结合具体实例来说,传统代码是 Car 控制并创建了 Framework,Framework 控制并创建了 Bottom,依次往下。
改进之后的控制权的反转,不再是上级对象创建并控制下级对象了,而是下级把对象注入将当前对象中,下级的控制权不再由上级类控制,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。
总的来说,Ioc意味着将设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

Spring IoC

Spring 是包含了多个工具方法的 IoC 容器

Spring IoC 核心(基础)操作

  • 将对象存入容器
  • 从容器中取出对象
    对象:bean
    容器:Spring

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能用的所有工具制作好都放到仓库中,需要的时候直接取就行了,用完再把它放回到仓库。
而 new 对象的方式相当于,每次需要工具了,才现做,用完就扔掉了也不会保存,下次再用的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。
拥有权 – > 使用权

Spring IoC的优点:

  1. 解耦
  2. 使用更加方便(不再需要手动创建,和关注这个对象背后的依赖关系)
  3. 更加高效

Spring 是⼀个 IoC 容器,对象的创建和销毁的权利都交给 Spring 来管理了,它本身又具备了存储对象和获取对象的能力。

在传统的面向对象编程中,对象的创建通常是通过new关键字手动完成的,程序员需要自行管理对象的生命周期(如创建、初始化、销毁等)。而在Spring中,IoC容器负责这些任务。Spring根据配置文件或注解,自动创建对象并管理其生命周期。在适当的时候,Spring还会自动销毁对象。

对象的创建:当Spring容器启动时,它会根据配置文件或注解来加载定义的Bean,并创建这些对象。对象的创建过程可能包括实例化对象、注入依赖项、调用初始化方法等。
对象的销毁:Spring也会在适当的时机销毁对象,例如在容器关闭时。Spring容器可以调用销毁方法来清理资源或执行其他必要的操作。

DI

DI (Dependency Injection):依赖注入
所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。【将依赖的某个对象,注入(拿)到当前的类当中的行为,就叫做依赖注入。】

依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同⼀件事情,就是指通过引入IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。
IoC 是 “目标” ,也是⼀种思想,目标和思想只是⼀种指导原则,最终还是要有可行的落地方案,而 DI就属于具体的实现技术

IoC :思想
Spring IoC :框架
DI:技术

上面car2例子的对象:被动传递
DI(依赖注入):主动获取对象,DI会动态的从spring中获取想要的对象

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 都2024年了,还在问网络安全怎么入门,气得我当场脑血栓发作
  • Java面试八股之如何保证消息队列中消息不重复消费
  • 如何处理前端项目中的SEO优化:从SPA到SSR与SSG
  • 车辆类型检测算法、车辆类型源码及其样本与模型解析
  • 测绘程序设计|VisualStudio2017的安装与配置|修改字体|插件推荐
  • 高性能web服务器详解
  • Flink程序部署与提交
  • redis入门
  • python通讯和文件打包解包之struct
  • easyexcel--导入导出实现自定义格式转换
  • 基于树莓派的智能AI网关接入豆包流程:HTTP/HTTPS、MQTT、Flask、Web可视化(代码示例)
  • 【Linux修行路】文件系统之缓冲区
  • 深度解析敏捷架构在数字时代的应用:创新理论与实践的融合
  • 石油采集行业应用解决方案
  • CSP 2023 普及组第一轮 - CSP/S 2023初试题 完善程序第二题解析
  • “大数据应用场景”之隔壁老王(连载四)
  • 【Amaple教程】5. 插件
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • crontab执行失败的多种原因
  • ES6 ...操作符
  • java中具有继承关系的类及其对象初始化顺序
  • Nodejs和JavaWeb协助开发
  • Solarized Scheme
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • XForms - 更强大的Form
  • 从零开始的无人驾驶 1
  • 服务器从安装到部署全过程(二)
  • 面试遇到的一些题
  • 深度学习入门:10门免费线上课程推荐
  • 深入浅出webpack学习(1)--核心概念
  • 思维导图—你不知道的JavaScript中卷
  • 学习HTTP相关知识笔记
  • 一些css基础学习笔记
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • MPAndroidChart 教程:Y轴 YAxis
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • (+4)2.2UML建模图
  • (1)Android开发优化---------UI优化
  • (3)nginx 配置(nginx.conf)
  • (7)svelte 教程: Props(属性)
  • (分布式缓存)Redis分片集群
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (一)、python程序--模拟电脑鼠走迷宫
  • (转)Sublime Text3配置Lua运行环境
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET Core Web APi类库如何内嵌运行?
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .Net中的集合
  • /3GB和/USERVA开关