SpringIOC精讲

简介: SpringIOC精讲

何为IOC

所谓的IOC(inversion of control),就是控制反转的意思。何为控制反转?

在传统的程序设计中,应用程序代码通常控制着对象的创建和管理。例如,一个对象需要依赖其他对象,那么它会直接new出来对象。这样的设计通常被称为 "控制流程"。

而在IOC 中,控制关系发生了反转。控制权被转移到Spring容器中,容器负责创建和管理对象,并在需要的时候将它们注入到应用程序中。

所以,原来这个对象的控制权在我们的代码中,我们自己new的对象,在Spring中,应用程序不再控制对象的创建,而是被动地接受由容器注入的对象。

我们拿代码来举个例子:

下面是一个没有IOC的例子

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

当有了IOC之后

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

也就是说,没有Spring的话,我们要使用的对象,需要我们自己创建,而有了Spring的IOC之后,对象由IOC容器创建并管理,我们只需要在想要使用的时候从容器中获取就行了。

值得说明的是,IOC只是一种思想和理念,可以有不同的实现方式。

IOC的优点

使用IOC,有最少三个好处:

1.使用者不用关心引用bean的实现细节。

譬如对于B b = new A(c,d,e,f);来说,如果B要使用A,那还要把c,d,e,f多个类全都感知一遍,这显然是非常麻烦且不合理的

2.不用创建多个相同的bean导致浪费。

A a1 = new A();
A a2= new A();

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

3.Bean的修改使用方无需感知。

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

Spring的IOC

对于Spring的IOC来说,它是IOC思想的一种实现方式。在容器启动的时候,它会根据每个bean的要求,将bean注入到SpringContainer中。如果有其他bean需要使用,就直接从容器中获取即可,如下图所示:

补充

IOC是如何实现的?

使用Spring的IOC容器能力,非常简单,如下代码所示:

ApplicationContext context= new AnnotationConfigApplicationContext("cn.wxxlamp.spring.ioc");
Bean bean = context.getBean(Bean.class);
bean.use();

从上面的代码中,我们也能看出来Spring的IOC是如何实现的:

  1. 从配置元数据中获取要DI的业务POJO(这里的配置元数据包括xml,注解,configuration类等)
  2. 将业务POJO形成BeanDefinition注入到Spring Container中
  3. 使用方通过ApplicationContext从Spring Container直接获取即可。如下图所示:

目录
相关文章
|
运维 分布式计算 DataWorks
阿里云大数据ACP(一)大数据开发平台 DataWorks 1
阿里云大数据ACP(一)大数据开发平台 DataWorks 1
1736 0
阿里云大数据ACP(一)大数据开发平台 DataWorks 1
|
IDE 开发工具
adobe2023全家桶和谐版本全部更新下载教程
盆友们~盆友们~激动的心,颤抖的手Adobe一年一度的重大更新Adobe2023版全新上线重磅更新,强势来袭激不激动!adobe2023系列软件已经正式更新,为您整理了所有adobe2023系列软件合集,包含ps2023、pr2023、ae2023等一系列软件,所有软件都是已经了的,安装完成打开即可免费使用,需要的朋友可以来下载!
1949 0
|
存储 运维 负载均衡
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
2417 0
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
|
消息中间件 Java 数据库
突破Java面试(44)-分布式事务解决方案
0 Github 1 面试题 分布式事务了解吗?你们如何解决分布式事务问题的? 2 考点分析 只要聊到做了分布式系统,必问分布式事务,若你对分布式事务一无所知的话,确实很坑,起码得知道有哪些方案,一般怎么来做,每个方案的优缺点是什么。
4322 0
|
JSON 移动开发 JavaScript
uniapp 条件编译的使用
uniapp 条件编译的使用
uniapp 条件编译的使用
|
关系型数据库 MySQL 应用服务中间件
Halo Blog 折腾记录
通过 Halo 开源建站工具部署一个属于自己的博客! 本文记录了 Halo 2.0 版本的建站过程,方便大家在使用 Docker Compose 部署 Halo 时进行参考。如有版本更新会看心情进行内容修改。
387 0
|
存储 缓存 边缘计算
阿里云李忠仁:CDN业务升级与创新
2021年6月9日,亚太内容分发大会暨CDN峰会在北京举行,阿里云智能边缘云高级技术专家李忠仁受邀参加边缘加速论坛,分享了阿里云基于边缘云节点打造新一代CDN产品能力、技术架构及创新实践,助力企业提升效率、优化经营,推动更多新兴行业场景的创新发展。
1159 0
阿里云李忠仁:CDN业务升级与创新
|
机器学习/深度学习
基于lightgbm的销售预测
基于lightgbm的销售预测
630 0
|
弹性计算 容灾
阿里云服务器可用区怎么选?可用区可以切换更改吗?
阿里云服务器可用区同地域下电力和网络相互独立的区域,可用区之间可以做到故障隔离,云服务器创建后可用区不可以切换或更改
2626 0
阿里云服务器可用区怎么选?可用区可以切换更改吗?
|
SQL 存储 弹性计算
互联网、游戏等行业实时数仓构建最佳实践
互联网、游戏等行业客户基于Flink构建实时数仓,通过Logtail采集日志,使用Flink实现对日志的拆分、处理。
876 0
互联网、游戏等行业实时数仓构建最佳实践

热门文章

最新文章