Hello World 🍺...|

bourbonbote

园龄:2年7个月粉丝:1关注:0

Spring IoC基础

出现问题

例如:现有一个针对 User 的操作,利用 Service 和 Dao 两层结构进行开发

在没有使用 IoC 思想的情况下,Service 层想要使用 Dao 层的具体实现的话,需要通过 new 关键字在UserServiceImpl 中手动 new 出 IUserDao 的具体实现类 UserDaoImpl(不能直接 new 接口类)。

image-20220810175451876

很完美,这种方式也是可以实现的,但是我们想象一下如下场景:

开发过程中突然接到一个新的需求,针对对IUserDao 接口开发出另一个具体实现类。因为 Server 层依赖了IUserDao的具体实现,所以我们需要修改UserServiceImpl中 new 的对象。如果只有一个类引用了IUserDao的具体实现,可能觉得还好,修改起来也不是很费力气,但是如果有许许多多的地方都引用了IUserDao的具体实现的话,一旦需要更换IUserDao 的实现方式,那修改起来将会非常的头疼。

640-16583728259151

解决问题

使用 IoC 的思想,我们将对象的控制权(创建、管理)交有 IoC 容器去管理,我们在使用的时候直接向 IoC 容器 “要” 就可以了

这样的好处是,如果DAO层的实现类需要修改的话,直接注解@Resource写上具体实现类,这时候只需要修改注解一行即可完成改变,而如果是new的方式的话,Service层中则有很多需要修改

image-20220721111254599

什么是IoC

IoC概念

IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。

为什么叫控制反转?

  • 控制 :指的是对象创建(实例化、管理)的权力
  • 反转 :控制权交给外部环境(Spring 框架、IoC 容器)

IoC作用

根据上面出现的问题,以及我们是如何解决问题的,我们可以知道,IoC 的思想就是两方之间不互相依赖,由第三方容器来管理相关资源。这样有什么好处呢?

  1. 对象之间的耦合度或者说依赖程度降低;
  2. 资源变的容易管理;比如你用 Spring 容器提供的话很容易就可以实现一个单例。

相关概念

什么是 Spring Bean?

简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。

比如被@Component、@Service、@Controller、@Repository标注的类

或者被@Bean标注的类等等

我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。

什么是DI(依赖注入)?

image-20220810182507127

也就是说,UserService实例依赖了UserDao实例,而UserService实例和UserDao实例都在Spring容器中,那么我们就可以通过在xml/java类/注解中,配置好UserService和UserDao这两个实例之间的依赖关系,让Spring容器在创建UserService实例的时候,顺便帮我们把UserDao实例填充到UserService实例中,这个过程就叫做依赖注入——DI(Dependency Injection)

看到这里,应该不会把IoC和DI的关系混淆了吧。。。

IoC在Spring 中的体现

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。

IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

理解方式一

image-20220810181055424

image-20220706165905518

代码解释:

1、先实例化出来一个spring客户端,并指定去applicationContext.xml中读取Bean的注入信息

2、从spring客户端中获取到一个名为"userDao"的bean对象

3、调用userDao的save方法

理解方式二

Spring 启动时读取应用程序提供的 Bean 配置信息(xml,注解,java类),并在 Spring 容器中生成一份相应的 Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系(依赖注入DI),为上层应用提供准备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现

image-20220810181847979-16601267308058

参考

https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486938&idx=1&sn=c99ef0233f39a5ffc1b98c81e02dfcd4&chksm=cea24211f9d5cb07fa901183ba4d96187820713a72387788408040822ffb2ed575d28e953ce7&token=1736772241&lang=zh_CN#rd

本文作者:bourbonbote

本文链接:https://www.cnblogs.com/bourbonbote/p/16573552.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   bourbonbote  阅读(40)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开