Spring什么是控制反转IOC和依赖注入DI的关系?什么是IOC容器?IOC容器管理组件的例子

控制反转IOC的概念

控制反转IOC

是Spring的一个思想,我们具象化到它是一个容器,包含并管理组件对象的生命周期,容器主动的将资源注入给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可。IOC 就是一种反转控制的思想,而DI(依赖注入) 是对IOC 的一种具体实现。

Spring 的IOC 容器就是IOC 思想的一个落地产品的实现。IOC 容器中管理的组件也叫做bean(bean不单指实体类,还包括dao层的对象,服务层的对象等)。

在使用到容器中的资源时,需要在创建bean 之前,首先需要创建IOC 容器。Spring 提供了IOC 容器的两种实现方式:

BeanFactory

这是IOC 容器的基本实现,是Spring 内部使用的接口。面向Spring 本身,不提供给开发人员使用。

②ApplicationContext

BeanFactory 的子接口,提供了更多高级特性。面向Spring 的使用者,几乎所有场合都使用

ApplicationContext接口而不是底层的BeanFactory接口。

一个简单的测试

首先导入我们spring需要的依赖

   <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.1</version>
    </dependency>
    <!-- junit测试 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

编写一个实体学生类,和Spring的配置为文件,并且将实体类交给配置文件进行管理,但是可以看到,我们运行的结果报错了,异常显示我们找不到这个方法,这个方法指的是空参构造器,由于Spring 底层默认通过反射技术调用组件类的无参构造器来创建组件对象,这一点需要注意。如果在需要无参构造器时,没有无参构造器,则会抛出下面的异常:

当我们加上空参构造器的时候,就不报错了,所以当我们生成了无参构造器的时候,我们要手动生成空参构造器,否则空参构造器不生效。

上面这个过程的思路如下:

获取bean的方法

①方式一:根据id获取

②方式二:根据类型获取

③方式三:根据id和类型

在典型的IOC容器中,当对象被取出使用时,通常情况下是同一个资源是同一个对象。这是因为IOC容器负责对象的创建和管理,它会负责维护对象的生命周期,并确保在需要的时候返回同一个实例。

在大多数情况下,IOC容器会使用单例模式来管理对象的生命周期。这意味着当我们从IOC容器中获取一个对象时,通常情况下会得到同一个对象实例,而不是每次都创建一个新的实例。这样可以确保在应用程序中使用的是同一个资源,避免了对象的重复创建和资源的浪费。

然而,有些IOC容器也支持非单例模式,允许每次获取对象时都创建一个新的实例。这种情况下,每次获取对象时都会得到一个新的实例,而不是同一个对象。这种方式适用于一些特殊情况,例如需要在每次获取对象时都进行初始化的情况。

④扩展

如果组件类实现了接口,根据接口类型可以获取bean 吗?

可以,前提是bean唯一

如果一个接口有多个实现类,这些实现类都配置了bean,根据接口类型可以获取bean 吗?

不行,因为bean不唯一

⑤结论

根据类型来获取bean时,在满足bean唯一性的前提下,其实只是看:『对象instanceof 指定的类型』的返回结果,只要返回的是true就可以认定为和类型匹配,能够获取到。

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

媪姝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值