Spring中IOC的理解(通俗易懂版)


文章目录

    • 1.IOC提出背景
    • 2:IOC的核心概念
    • 3:IOC的实现方式
    • 4:IOC的入门案例
      • (1):思路分析
      • (2):代码解析
    • 5:DI入门案例
      • (1):思路分析
      • (2):代码解析
    • 6:DI依赖注入的方式
      • (1):前言
      • (2):Set方式注入
      • (3):构造器注入
      • (4):依赖的自动装配
    • 7:注解开发模式的依赖注入
      • (1):前言介绍
      • (2):注解模式的依赖注入(单指自动装配)


1.IOC提出背景

  • 代码书写现状:耦合度太高,我们修改一处代码,往往要修改很多出相关联的代码。

举例如下:当我们在数据层中不满足BookDaoImpl2中提供的方法了,我们写了新的实现类BookImpl,那么当业务层想要调用数据层中的实现方法的时候,我们就要修改 new 的对象。那么引发问题 我们该一处代码,就要修改与其相关联的代码。
。

  • 解决方法:我们在创建对象的时候,不自己创建而是由外部提供对象

  • 引出IOC(控制反转)
    对象的创建权由程序转移到外部,这种思想叫做控制反转。

2:IOC的核心概念

  • 使用对象时候由主动new对象转换成由外部提供对象,此过程中对象的创建权由程序转移到外部,这种思想叫做控制反转
  • Spring技术对此提供的实现
    • Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的外部
    • IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean

3:IOC的实现方式

  • DI-依赖注入
    在容器中建立bean与bean之间的依赖关系的整个过程叫做依赖注入

下方当中的业务层中代码想要正常运行还需要Book bookDao的实现,那么的话IOC把这种依赖关系也提供给业务层,这个过程叫依赖注入。那么这个注入指的就是属性的注入
在这里插入图片描述

4:IOC的入门案例

(1):思路分析

  • IOC管理什么(bean对象)
  • 如何告知IOC去管理bean对象 —通过配置文件
  • 被管理的对象交给IOC容器,如何获取IOC容器?(接口)
  • IOC容器得到后,如何获取bean?

(2):代码解析

  • IOC管理的对象
    这里的话我们还未完成依赖注入,所以还是new了一个mapper的对象
public class bookServiceImp implements bookService {bookMapper mapper = new bookMapperImp();@Overridepublic void add2() {mapper.add();}
}
  • 告知IOC去管理bean(通过配置文件)
 	<!-- id:相当于类别名--><!-- class:引入的类--><bean id = "bookMapperImp" class="com.wyi.mapper.Imp.bookMapperImp"/><bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp"/>
  • 获取IOC容器

ApplicationContext是个接口,所以需要用其实现类CPX

 ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  • 获取bean
    getBean的参数就是我们在配置文件当中的id;
 bookServiceImp imp = (bookServiceImp) context.getBean("bookServiceImp");

5:DI入门案例

(1):思路分析

  • 基于IOC管理bean。
  • 上方的service中new 的mapper对象是否保留(否)。
  • Service需要的mapper对象如何进入Service中 (通过提供方法)。
  • Service和mapper之间该如何联系。

(2):代码解析

  • Service需要的mapper对象如何进入Service中 (通过提供方法)

public class bookServiceImp implements bookService {bookMapper mapper;@Overridepublic void add2() {mapper.add();}//提供set方法public void setMapper(bookMapper mapper) {this.mapper = mapper;}
}
  • Service和mapper之间的联系
   <!-- id:相当于类别名--><!-- class:引入的类--><bean id = "bookMapperImp" class="com.wyi.mapper.Imp.bookMapperImp"/><bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp"><!--        property:表示的是配置当前bean的属性-->
<!--        name:表示当前bean的属性名称-->
<!--        ref:参照哪一个beanref:bean对象的属性是引用类型,value:bean对象的属性是基本类型		--><property name="mapper" ref="bookMapperImp"/></bean>
  • 那么ioc如何调用set方法呢?
    这个时候它就会通过反射来创建对象
    调用的是无参构造方法,就算构造器私有也可以调用
    然后读取到property标签中对应的属性值
    比如说,读取到标签的name属性值为mapper,参照bookMapperImp类 (如果属性是不是对象的话 那么就是 value)
    这个时候,IOC就会调用对应的set方法为这个属性赋值(将上方读取到的 属性值 set(bookMapperImp) 进去,为 BookServiceImp提供mapper对象)
    如果我们写的实体类中没有提供对应的set方法,那么就会报错。

6:DI依赖注入的方式

(1):前言

所谓注入也就是属性的注入,我们根据bean.xml中bean对象中属性的添加方式 对应不同依赖注入方式,在某个bean中其可能需要用到其他实体类作为属性,那么此时也不用自己new,IOC容器给你提供,那么如何提供呢?那就是这个bean你得给IOC容器一个入口 即 set方法 或者构造器方法

(2):Set方式注入

  • bean当中属性的添加
    这里属性的添加方式是 property
 <bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp"><property name="mapper" ref="bookMapperImp"/></bean>
  • IoC如何注入这个属性呢
    我们先通过获取到的IOC容器,然后再通过IOC容器获取到Bean,然后底层是通过反射创建这个bean对象,然后这个bean当中可能存在一些依赖关系,那么的话这个时候IOC容器会调用set方法对这些属性进行注入。
 public void setMapper(bookMapper mapper) {this.mapper = mapper;}

(3):构造器注入

  • bean.xml配置文件
    属性的添加方式是 constructor
    <bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp">//这里的name是我们构造方法中的参数名<constructor-arg name = "mapper" ref="bookMapperImp"/></bean>
  • IOC如何注入这个属性呢?
    通过构造器注入这个属性,我们配置文件中将mapper这个属性的添加方式提供了,那么接下来就是IOC容器调用构造方法将bean.xml文件中的属性注入到bookServiceImp
public class bookServiceImp implements bookService {private bookMapper mapper;public bookServiceImp(bookMapper mapper) {this.mapper = mapper;}}

(4):依赖的自动装配

  • 概念:IOC容器根据bean所依赖的资源在容器中自动查找 并注入到bean的过程叫做 自动装配

  • bean.xml 那么这个里头的话 我们就不要再写 property 因为我们是自动查找依赖 一般使用的是按类型

    <bean id = "bookMapperImp" class="com.wyi.mapper.Imp.bookMapperImp"/><bean id = "bookServiceImp" class="com.wyi.service.Imp.bookServiceImp" autowire="byType"/>
  • bean中
    也是需要为IOC中提供一个接口来将 这个属性注入进去 这个接口是set方法
  private bookMapper mapper;@Overridepublic void add2() {mapper.add();}public void setMapper(bookMapper mapper) {this.mapper = mapper;}
  • 自动装配注意事项
    自动装配用于引用类型依赖注入,不能对简单类型进行操作
    使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
    使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
    自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

7:注解开发模式的依赖注入

(1):前言介绍

我们以前是需要用bean.xml,在其中我们需要写配置bean,那么现在我们改用注解了,想要添加那个bean对象,就在那个类上加上注解。

  • @Component
    @Component的衍生注解(衍生的注解跟@Component注解作用相同)
  • @Service
  • @Controller
  • @Repository

(2):注解模式的依赖注入(单指自动装配)

这里我们只需要在相关联的bean上添加注解@Autowired 那么IOC容器就会扫描容器中的bean,(被扫描的bean就是用@component注解或者衍生注解修饰的bean)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

首个使用Blazor 技术实现的社区软件 BlazorCommunity 发布

BlazorCommunity 是首个使用Blazor 实现的开源社区软件&#xff0c; 其组件基于Element-Blazor &#xff0c; Element-Blazor 是一个 API 模仿 Element&#xff0c;CSS 直接使用 Element 样式&#xff0c;HTML 结构直接使用 Element HTML 结构 的 Web开发库。由于基于了…

leetcode112. 路径总和

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

全球顶级开源大神们现身 COSCon'20

点击上方“开源社”关注我们| 作者&#xff1a;Will Wang| 编辑&#xff1a;沈于蓝| 责编&#xff1a;王皓月业界最具影响力的开源年度盛会2020中国开源年会 (COSCon20) 将于 10月24-25日由开源社举办。COSCon 以其独特定位及日益增加的影响力&#xff0c;吸引越来越多的顶级企…

做.NET开发多年,公司要我转Java...

10月13日&#xff0c;.NET5发布了(Release Candidate)RC2版本&#xff0c;包含语言新版本C#9和F#5等&#xff0c;这是正式版前的最后更新&#xff01;终于&#xff0c;万众期待的.NET5真的要来了&#xff01;公司让我转Java&#xff0c;我成功说服老板&#xff01;机会永远留给…

ASP.NET Core Blazor WebAssembly 之 .NET JavaScript互调

Blazor WebAssembly可以在浏览器上跑C#代码&#xff0c;但是很多时候显然还是需要跟JavaScript打交道。比如操作dom&#xff0c;当然跟angular、vue一样不提倡直接操作dom&#xff1b;比如浏览器的后退导航。反之JavaScript也有可能需要调用C#代码来实现一些功能&#xff0c;毕…

leetcode654. 最大二叉树

一:上码 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

浅议C#客户端和服务端通信的几种方法:Rest和GRPC和其他

本文来自&#xff1a;https://michaelscodingspot.com/rest-vs-grpc-for-asp-net/浅议C#客户端和服务端通信的几种方法&#xff1a;Rest和GRPC在C&#xff03;客户端和C&#xff03;服务器之间进行通信的方法有很多。一些功能强大&#xff0c;而其他功能则不是很多。有些非常快…

leetcode106. 从中序与后序遍历序列构造二叉树(java详解版)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

COSCon’20开源教育论坛介绍

点击上方“开源社”关注我们| 作者&#xff1a;周添一| 编辑&#xff1a;沈于蓝| 设计&#xff1a;冯艺怡| 责编&#xff1a;王皓月论坛简介在当今数据驱动的智能社会&#xff0c;软件作为数字智能社会的数据基础设施&#xff0c;承载了社会的高效运转。在这个软件定义世界的潮…

leetcode105. 从前序与中序遍历序列构造二叉树

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

想进BAT等大厂,到底要怎么做?

职场&认知洞察 丨 作者 / findyi这是findyi公众号的第82篇原创文章最近我的公众号多了很多学生读者&#xff0c;很多人问我&#xff1a;如果要进BAT等大厂&#xff0c;我是应该直接工作还是考研&#xff1f;对于未来要从事程序员行业的朋友来说&#xff0c;要不要考研&…

.NET 5.0 RC 2 发布,正式版将在 11 月 .NET Conf 大会上发布

原文&#xff1a;http://dwz.win/ThX作者&#xff1a;Richard翻译&#xff1a;精致码农-王亮说明&#xff1a;1. 本译文舍弃了少许我实在不知道如何翻译但又不是很重要的语句。2. 本文有不少超链接&#xff0c;由于微信公众号和头条平台外链会被剔除 URL 地址&#xff0c;所以原…

leetcode216. 组合总和 III

一:题目 二:上码 class Solution {/**递归深度根据k值确定,宽度的话那就[1,9]因为递归不允许重复&#xff0c;那么的话我们需要每次在横向遍历的起始位置1*/private List<List<Integer>> ans new ArrayList<>();private List<Integer> path new Arr…

BeetleX之Websocket协议分析详解

Websocket应用协议已经普及多年了&#xff0c;它是HTTP1.1的内部升级协议&#xff0c;主要作用是补充HTTP1.1无法灵活地主动推送消息给客户端的缺陷问题。在这里主要介绍一下使用组件如何扩展一个完整的Websocket协议。协议介绍Websocket并不复杂&#xff0c;但协议文档内容还是…

甲骨文是否可以要求 Java API 享有版权?这场10年官司怎么结

美国最高法院10月7日就 Oracle 甲骨文诉 Google 谷歌一案进行口头辩论。案件一直以来争议的核心是&#xff0c;甲骨文是否可以要求 Java API 享有版权&#xff0c;如果可以&#xff0c;那么谷歌是否侵犯了这些版权&#xff1f;Java API 是否可以享有版权&#xff1f;Sun 公司在…

C#知多少 | 每个版本都更新了什么?

总所周知&#xff0c;.NET5.0马上就要来了&#xff0c;最后一个预览版RC2也已经发布了&#xff0c;在11月的时候&#xff0c;我们就正式的发布了&#xff0c;然后我们就可以迁移使用了&#xff0c;当然今天说的重点不是.NET&#xff0c;今天说的是伴随着.NET5一起到来的C#9.0&a…

leetcode40. 组合总和 II(树层去重)

一:题目 二:上码 class Solution {/**注意这里的去重:1.我们分为树层去重比如[1,1 2,5] target 8,那么如果我们用树枝去重的话,那么就会出现[1,2,5],[1,2,5]那么的话我们就需要树层去重 就是横向遇见相同的元素跳过。2.树枝去重的 树枝去重就是 我们数组前面使用过的元素不…

WPF开源控件扩展库 - MaterialDesignExtensions

WPF开源控件扩展库 - MaterialDesignExtensionsMaterialDesignExtensions仓库截图logoMaterial Design Extensions 在WPF开源控件库 ????Material Design in XAML Toolkit(本站介绍&#xff1a;????链接)的基础上进行了控件扩展和特性新增。本开源项目中的控件或许不在…

leetcode131. 分割回文串

一:题目 二:上码 class Solution {/**思路:1.纵向递归的话 我们递归深度是 我们的 切割线切到了最后 2.横向for 我们的宽度就是字符串宽度3.在哪截取的话 那就是在哪个坐标的后面*/List<List<String>> ans new ArrayList<>();List<String> path n…

WordPress 已过时?创始人与新架构拥护者开战

喜欢就关注我们吧&#xff01;近日&#xff0c;WordPress 创始人 Matt Mullenweg 与 Netlify 首席执行官 Matt Biilmann 展开了一场口水战&#xff0c;双方就 WordPress 与新兴 WEB 应用架构 JAMStack 孰优孰劣进行了激烈的辩论。何为 JAMStack?JAMStack 是一种将 Web 应用部署…