spring框架学习之路(一)-入门基础(1)-IOC(控制反转)&DI(依赖注入)

2023-11-12

前言

  我就是一小白程序猴,不懂什么高新技术,只是在学习过程中把自己遇到问题或者学到的新知识记录下来,第一给自己复习用,第二小白更懂小白的苦,自己是新手所以应该更了解在刚开始学习时哪些学起来有困难,也就避开了所谓的专家盲点,给后面入坑的人一点点启示也是有用的吧.......应该...如果有同样正在学spring的同学,可以一起交流一哈(想写就写一点,边学一边更)

  如果这些文字有幸被某位大牛看到,欢迎指正不足,真的欢迎!!!

 

  spring的工作环境搭建,,,网上都是教程,自己找吧!

  开始spring,必须了解以下三个概念,我尽量写的白话点儿,哈哈。

  IOC:控制反转

  DI:依赖注入

  AOP:面向方面编程

 

  今儿就先写一写我对IOC和DI 的理解吧:

  IOC(控制反转):不是什么技术,而是一种设计思想。他是spring的内核和基础,要理解这个东西,你得知道啥叫“工厂设计模式”和“反射”,不了解的话先自学吧,,(坑以后填T_T)。

  所谓“控制反转”,将控制权从程序自身转移到第三方(在spring中就是指applicationContext.xml文档)。

  通俗讲,就是程序知道自己要创建一个属于某种类型的类(即实现了某个接口),但不了解要创建的这个类是该接口的哪一个具体实现类。在程序具体执行时,才向第三方请示要创建的是哪一个实体类(具体表现就是程序解析applicationContext.xml文件)。至于程序具体是怎么创建的实体类,其实就是用了java中反射(这个坑之后有时间填.....)。

  这样用户不需要修改程序内容,只需要配置xml文件,就可以实现对程序的控制。

具体可以看下面的例子:

//接口  代表一个墨盒
public interface Ink {
	void outInk();//喷墨
}
//实现类1,黑白墨盒
public class BlackInk implements Ink{
	@Override
	public void outInk() {
		System.out.println("黑白墨盒!");
	}	
}
//实现类1,彩色墨盒
public class ColorInk implements Ink {
	@Override
	public void outInk() {
		System.out.println("彩色墨盒!");
	}
}



  首先配置xml文件内容:

<bean id="ink" class="code.bean.BlackInk"></bean>

  然后就可以在main方法中调用了:

	public static void main(String[] args) {
		ClassPathResource resource=new ClassPathResource("applicationContext.xml");	
		XmlBeanFactory factory=new XmlBeanFactory(resource);		
		Ink ink=factory.getBean("ink",Ink.class);		
		ink.outInk();		
	}


  输出结果:


  黑白墨盒!


  然后,在我们不修改任何java代码的情况,只修改xml文件

<bean id="ink" class="code.bean.ColorInk"></bean>

  再次运行main方法,结果为:


  彩色墨盒!


  这就是 IOC(Inversion of Control):控制反转 的设计思想。

 ---------------------------------------我是分割线ε≡٩(๑>₃<)۶ 一心向学------------------------------------

  然后,接着上面的内容介绍DI

  DI(Dependency Injection):依赖注入,其实是IOC的另一种解释。事实上,是发现IOC这个概念不能对我们所提到spring的设计思想进行准确的描述,所以提出了DI的概念。

  也有人认为IOC是个更宽泛的概念,DI是更具体的

  在我们之前传统的程序设计中,我们是通过类与类之间的调用来实现某项功能。但是用DI的设计思想,就是我们可以先创建被调用类的对象,然后把它注入到需要它的类中。

  这样的设计可以让我们方便的把不同的被调用类注入同一个调用类,而不用更改代码。

  说白话一点,就是我们利用DI可以在上面IOC内容的基础上创建拥有字段(属性)的类,并且对这些属性进行初始化。

  接着我们上面的代码继续举栗子昂~~

  在我们有了Ink接口、BlackInk以及Corlor类之后,我们再建一个Printer类:

public class Printer {
	private Ink ink;	
	
	public void out(){
		ink.outInk();
	}
	
	public Printer() {	}
	public Printer(Ink ink) {
		this.ink = ink;
	}
	public void setInk(Ink ink) {
		this.ink = ink;
	}
}


在以前,我们要调用Printer类的out方法,是这个样子的:

Printer print=new Printer(new BlackInk());
print.out();

如果我们要更改墨盒,就要再次更改程序代码;

而利用DI设计思想,

我们在applicationContext.xml文件中配置:

<bean id="black" class="code.bean.ColorInk"></bean>
<bean id="color" class="code.bean.ColorInk"></bean>
<bean id="printer" class="code.bean.Printer">
<property name="ink" ref="black"></property>
</bean>

main方法只需要这么写:

	public static void main(String[] args) {
		ClassPathResource resource=new ClassPathResource("applicationContext.xml");	
		XmlBeanFactory factory=new XmlBeanFactory(resource);		
		
		Printer printer=factory.getBean("printer",Printer.class);
		printer.out();		
	}

这样的执行结果就是:


彩色墨盒!


而如果我们需要更改墨盒时,只需要更改xml:

<property name="ink" ref="color"></property>

不需要再次更改java代码。

核心就是怎么注入这些依赖关系。可以分为两类(以Printer为栗):

A)利用set方法,就是我们上面的这种做法。

<property name="ink" ref="black"></property>

B)利用带参构造方法

<bean id="printer" class="code.bean.Printer">
<constructor-arg>
<ref local="black"/>
</constructor-arg>
</bean>

 另外还可以利用<bean>的autowire属性,autowire="byType",但是不建议使用,因为如果在上下文中如果有多个符合的bean时会报错。

 

另外还要特别注意的是 <bean>scope属性,默认值是singleton即单例模式,只会创建一个对象。

          <-IOC/DI完结->



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring框架学习之路(一)-入门基础(1)-IOC(控制反转)&DI(依赖注入) 的相关文章

随机推荐

  • QT学习三之多界面跳转与对话框

    以下内容均是个人理解 不保证都是正确的 如有错欢迎指正 欢迎学习交流 815030927 qq com 一 多界面跳转 1 介绍 MVC框架 MVC是模型 model 视图 view controller 控制器 的缩写 模型视图控制器是一
  • Java面试常见问题:Mybatis的工作原理

    ORM框架是几乎所有Java应用都会用到的技术 大多数ORM框架都是将Java对象与数据表进行关联 Mybatis则是将Java方法和SQL语句进行了映射 Mapping 这样不仅简化了ORM操作 同时也支持数据表关联查询 视图查询 存储过
  • MySQL-case语句

    btype 1 奖金是薪水的0 1倍 btype 2 奖金是薪水的0 2倍 其他情况奖金是薪水的0 3倍 case btype when 1 then salary 0 1 when 2 then salary 0 2 else salar
  • 机器学习——数据清洗与特征选择

    一 数据清洗 数据清洗 data cleaning 是在机器学习过程中一个不可缺少的环节 其数据的清洗结果直接关系到模型效果以及最终的结论 在实际的工作中 数据清洗通常占开发过程的50 80 左右的时间
  • python 运用 flask框架分页

    k Model query filter by id 0 paginage 1 2 items k Model query filter id gt 0 paginate 1 2 items for i in k print i
  • 维度建模之缓慢渐变维

    维度建模之缓慢渐变维 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中 特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题 业务数据库中的一些数据发生了更改 到底要不要将这些变化也反映到数据仓库中 在数据仓库中 哪些数据应
  • STM32 串口接收中断 代码

    1 代码介绍 今天做项目 要用到串口中断接收 在网上一搜 大量代码 copy过来编译没问题 但是运行起来才发现不能产生中断 于是决定自己搞搞 用了半天的功夫 终于有结果了 2 共同讨论 代码属个人编写 自有不足之处 望大家指出 3 单片机型
  • 代码走查1

    线上问 和研发一起简单的从代码层面去解决问题 略low 代码走查 1 存在的问题 SQL查询 1 对于业务上没有用的字段没必要添加 比如 IsDel 在具体的业务上 删除数据是直接硬删除 直接删除了物理数据 所以 在SQL查询的时候 SQL
  • 数据分析之航空公司客户价值分析

    航空公司客户价值分析 1 挖掘背景与目标 开启了第一个数据分析的项目 针对于航空公司价值的分析 客户关系管理的关键问题是客户分类 通过客户分类 区别无价值客户 高价值客户 企业针对不同价值的客户制定优化的个性化服务方案 采取不同的营销策略
  • c语言嵌入arm指令如何编译,ARM汇编语言与嵌入式C语言混合编程————内嵌汇编.pdf...

    ARM汇编语言与嵌入式C语言混合编程 内嵌汇编 ARM C 汇编语言与嵌入式 语言混合编程 内嵌汇编 在嵌入式程序设计中 有些场合 如对具体的硬件资源进行访问 必须用汇编语言来实 C C 现 可以采用在嵌入式 语言程序中嵌入汇编语言或嵌入式
  • 可以学学Golang、(Go的优势及适合做什么

    1 关键字少 运维简单 2 原生支持高并发 GOROUTINE 协程 进程是资源分配的最小单位 线程是CPU调度的最小单位 一个线程可以有上千个协程 不是在CPU层面去调度的 是在用户空间用Golang的一个调度器去调度不同的协程 由于协程
  • 计算机基础一:IP地址与域名解析

    一 Free IP Scanner 1 是免费的局域网IP地址扫描软件 它简单地Ping每个IP地址以检查它是否还活着 2 可以扫描出某一个局域网中所有的ip地址 正在用的IP地址和没有使用的ip地址 3 可以扫描对应的网卡MAC地址 计算
  • python日常实用技能:如何用Python将图片批量从png格式转换至WebP格式

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 最近因为工作需要去研究了下png的压缩 发现转换成webp格式可以小很多 下面给大家分享利用Python将图片批量从png格式转换至WebP格式的方法 下面来一起看看 实现
  • 远程部署java web项目_JavaWeb项目的部署以及远程调试

    Linux环境下软件的安装 Linux环境下的程序的安装 更新 卸载和查看 rpm 命令 相当于windows程序的添加 卸载程序 进程程序的安装 查看 卸载 本地程序安装 rpm ivh 程序名 本地程序查看 rpm qa 本地程序卸载
  • 4分钟插入1000万条数据到mysql数据库表

    准备工作 我用到的数据库为 mysql数据库8 0版本的 使用的InnoDB存储引 创建测试表 CREATE TABLE product id int NOT NULL AUTO INCREMENT name varchar 100 DEF
  • C++读取HDF5文件

    我将博客迁到 GitHub pages 了 本文有些纰漏 请前往 pages 查看 概述 HDF5是一种跨平台存储 高维 数组的数据格式 HDF5有多种语言的绑定 其中包括C 在这里我记录了各种踩坑后如何将数据读入C 读标量 注意头文件不是
  • vscode远程连接Linux失败,提示过程试图写入的管道不存在(三种解决办法)

    vscode报错如下 一 第一种情况 原因是本地的known hosts文件记录服务器信息与现服务器的信息冲突了 导致连接失败 解决方案就是把本地的known hosts的原服务器信息全部删掉 然后重新连接 二 第二种情况 在编写配置文件c
  • SFuzz: Slice-based Fuzzing for Real-Time Operating Systems

    原文地址 SFuzz Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security 源码地址 NSSL SJTU SFuzz gi
  • Python面向过程编程主要知识

    摘自尚学堂的python 人工智能课程 用于复习 python是一种解释型的 面向对象的语言 python的特点 1 可读性强 易修改 2 简介 关注业务本身 生产效率高 3 面向对象 4 免费和开源 5 可移植性和跨平台 python被编
  • spring框架学习之路(一)-入门基础(1)-IOC(控制反转)&DI(依赖注入)

    前言 我就是一小白程序猴 不懂什么高新技术 只是在学习过程中把自己遇到问题或者学到的新知识记录下来 第一给自己复习用 第二小白更懂小白的苦 自己是新手所以应该更了解在刚开始学习时哪些学起来有困难 也就避开了所谓的专家盲点 给后面入坑的人一点