Spring--初始IOC容器

本文涉及的产品
容器镜像服务 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目录下类路径”)



相关文章
|
1月前
|
Java 测试技术 开发工具
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
|
1天前
|
XML Java 数据格式
【spring】01 Spring容器研究
【spring】01 Spring容器研究
6 0
|
22天前
|
XML Java 数据格式
Spring(一)IOC小案例
Spring(一)IOC小案例
|
1月前
|
存储 前端开发 Java
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
|
1月前
|
Java 容器 Spring
【spring(一)】核心容器总结
【spring(一)】核心容器总结
|
1月前
|
Java 开发者 容器
【Java】深入了解Spring容器的两个关键组件
【Java】深入了解Spring容器的两个关键组件
10 0
|
1月前
|
XML Java 数据格式
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (下)
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界
|
1月前
|
XML Java 数据格式
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (上)
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (上)
|
1天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
1天前
|
存储 Ubuntu 安全
Docker容器常用命令
Docker容器常用命令