Spring--初始IOC容器

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Spring--初始IOC容器

前言


路遥说,在一个平凡的世界里,人要承受一定的痛苦和不安。但只要相信个体奋斗的力量,坚定地与生存搏斗,就能过上想要的生活。

很喜欢《平凡的世界》的一句话,一直不断的鼓励我努力向前,也送个各位看到这个写的很烂的文章的人,共勉~


二、IOC容器


2.1 什么是IOC


IOC就是控制反转啊!

what你说啥?


2.1.1 控制反转是什么意思?


假如有a和b两个对象,在没有引入IOC概念之前,a依赖于b那么a在需要用到b的时候,就必须自己主动去创建对象b或者使用已经创建的对象b,这个过程控制权都在对象a上。

而引入IOC概念之后,对象a与对象b之间失去了直接联系,当对象a需要用到对象b的时候,IOC容器会主动创建一个对象注入到对象a需要的地方。这好像是一个中介一样,你原来想在某个地方找个房子住,你需要自己找房东,但是现在有了中介(IOC),它能帮你完成你想找的房子

对比两个过程,第一个过程对象a获得依赖对象b的过程由自己创建调用,第二个过程变成了IOC给你创建调用。控制权由主动变成了被动

Fine,这就是控制反转,由主动变被动了~


2.1.2 什么是DI


DI就是是依赖注入(Dependency Injection)英语单词的首字母的缩写

所谓依赖注入,即在运行期由容器将依赖关系注入到组件之中

讲的通俗点,就是在运行期,由Spring根据配置文件,将其他对象的引用通过组件提供的setter方法进行设定

它通过动态调用的方式避免了硬编码方式的约束

动态调用什么意思,我在编译阶段没有确定要创建那个对象(编译阶段就是你写完java源代码之后经过编译期编译为.class字节码文件的阶段)然后呢,我想到运行阶段根据我的配置文件创建对象(运行阶段就是将字节码文件加载到内存的阶段)这叫动态

然后能注入的数据类型有三类

基本类型和String 其他bean类型(在配置文件中或者注解配置过的bean) 复杂类型/集合类型


2.1.3 动态性


回顾下反射的概念(主要体会动态性!)

比如有很多个球员的实例:乔丹、詹姆斯、科比,现在需要一个方法根据一个参数获得其中一个球员

不使用反射的写法:


public Person getPerson(String name) {
if(name.equals("乔丹") {
return new 乔丹();
}
if(name.equals("詹姆斯") {
return new 詹姆斯();
}
.....
如果要获得的球员很多的话要加很多的if判断,代码属实是很垃圾
使用反射的写法:
arduino
复制代码
public Person getPerson(String name) {
Constructor cos = clazz.getConstructor(Class.forName(name));//根据类名获得对应构造方法
Object obj = cos.newInstance();
return (Person) obj;
}

这样就很明显了~

球员的实例有多少,这个方法都不用变代码量就这么多

反射能动态生成实例的意思是,在程序运行的时候,可以根据需要和条件创建新的实例

先理解到这,后面理解的在深刻的话在写!


2.1.4 IOC能带给我们什么?


IOC 的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理。

   第一,资源集中管理,实现资源的可配置和易管理

   第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。IoC很好的体现了面向对象设计法则之一好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找


2.2 IOC底层原理


xml解析、工厂模式,反射

原始方式,在UserService类的execute方法中想调用UserDao类中的add方法,那么我们就需要先生成UserDao的对象,之后在调用UserDao中的方法

image.png

用工厂模式呢?

在它们中间再搞个类(工厂类)生成UserDao类

工厂类来实现创建对象,在UserService类中通过创建工厂类来调用add方法

相当于搞了个代理...降低了耦合度多个了个中奸商

image.png

image.png

先通过 XML 解析来加载 spring.xml 配置文件,然后使用反射机制调用无参构造函数动态创建对象,并调用 setter 方法完成对象属性的赋值,最后将创建好的对象放在一个类似于 HashMap 的容器里,调用 getBean 方法获取对象时,相当于 map.get(id) 返回一个对象。

image.png


2.3 IOC接口(BeanFactory)


ioc思想基于IOC容器完成,ioc容器底层就是对象工厂。

Spring提供了IOC容器实现的两种方式:两个接口

  • BeanFactory:IOC容器基本实现,是spring内部使用接口,不提供开发人员使用。加载配置文件时不会创建对象,使用对象时才会创建对象(懒汉式加载对象)。
  • ApplicationContext:BeanFatory的子接口,提供更多更强大的功能,一般供开发人员进行使用。加载配置文件时就创建对象(饥汉式加载对象)。

ApplicationContext接口实现类

  • FileSystemXmlApplicationContext(“盘符路径(绝对路径)“)
  • ClassPathXmlApplicationContext(“src目录下类路径”)



相关文章
|
21天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
12天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
25 0
|
2月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
127 9
|
1月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
30 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
2月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
40 4
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
65 0
|
1月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
45 0
|
6月前
|
XML Java 数据格式
Spring IoC容器初始化过程(xml形式)
Spring IoC容器初始化过程(xml形式)
80 0