当前位置: 首页 > news >正文

SpringIOC推导IOC初步

了解准备

什么是Spring?

Spring是一款轻量级的控制反转(IOC)和面向切面编程(AOP)的非入侵式开源框架

  • 2002年Spring的前身interface21发布,随后在2004年3月24日正式更名发布Spring1.0版本
  • Spring Frameword缔造者 Rod Johnson,悉尼大学音乐学博士生

Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
Spring三大核心:IOC控制反转、DI依赖注入、AOP面向切面编程

Spring整合了现有的技术框架,使这些技术更加易于使用

Spring官网:https://spring.io/
下载地址:https://repo.spring.io/ui/native/release/org/springframework/spring
GitHub地址:https://github.com/spring-projects/spring-framework
maven依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version>
</dependency>

整合MyBatis时导入

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.23</version>
</dependency>

IOC思想

引入IOC

准备Dao层接口和一堆实现类

public interface UserDao {void getUser();
}
public class UserDaoImpl implements UserDao{public void getUser() {System.out.println("UserDao获取User成功!");}
}
public class UserDaoMySqlImpl implements UserDao{public void getUser() {System.out.println("UserDaoMySqlImpl获取User成功!");}
}
public class UserDaoOracleImpl implements UserDao{public void getUser() {System.out.println("UserDaoOracleImpl获取User成功!");}
}

准备业务层

public interface UserService {void getUser();
}
public class UserServiceImpl implements UserService{private UserDao userDao = new UserDaoImpl;public void getUser() {userDao.getUser();}
}

测试不同UserDao实现类的getUser方法

public class MyTest {@Testpublic void testGetUser(){UserServiceImpl service = new UserServiceImpl();service.getUser();}
}

可以发现,当需要调用不同UserDao实现类时,每次都需要区service中修改UserDao实例的指向

private UserDao userDao = new UserDaoImpl;
private UserDao userDao = new UserDaoOracleImpl;
private UserDao userDao = new UserDaoMySqlImpl;

这样设计的耦合性极高,对程序执行的控制权始终在开发人员手中,当用户提出不同需求就需要我们不断去修改UserDao实例的指向。如果代码数量大,那么需要修改的就不止一处,下面在service中注入set方法来动态的获取不同的UserDao实例指向

service:

public class UserServiceImpl implements UserService{private UserDao userDao;// 注入set方法  解耦public void setUserDao(UserDao userDao){this.userDao = userDao;}public void getUser() {userDao.getUser();}
}

Test:

public class MyTest {@Testpublic void testGetUser(){UserServiceImpl service = new UserServiceImpl();service.setUserDao(new UserDaoOracleImpl());service.getUser();}
}

上述示例,就可以动态的去选择执行用户指定的方法。此处的Test可以看作是一个servlet,它获取到用户的请求之后解析出对应执行的方法,再通过service去调用执行,耦合性就降低许多即用户需求和程序之间的耦合性降低,程序执行的控制权交给用户。以此完成控制反转IOC

IOC本质

IOC的本质就是一种控制反转的设计思想,它不完全等同于DI,DI(依赖注入)可以理解为实现IOC的一种方式。

那我的理解其实是,不能说控制权交给了用户,只是我们通过程序编写可以实现对用户需求的解析。解析出用户的需求对应程序中所要执行的方法即可。不能理解为控制权,只能说用户具有了主动权,并且在代码层面我们提高了程序的动态特性。

所谓控制反转,就是说获取对象的不再由程序的硬编码决定,而是反转到了用户手中。首先程序会解析出用户需求,再动态的获取相应对象

XML配置Spring

以上述UserDao示例配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans                         https://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 将每一个UserDao的实现类映射到Spring容器中的bean --><bean id="mysqlImpl" class="com.mountain.dao.MySqlImpl"/><bean id="oracleImpl" class="com.mountain.dao.OracleImpl"/><bean id="userService" class="com.mountain.service.UserServiceImpl"><property name="userDao" ref="mysqlImpl"/></bean>
</beans>

测试;

@Test
public void testGetUser(){// 获取spring上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");UserServiceImpl service = (UserServiceImpl) context.getBean("userService");System.out.println(service.getUser());
}

可以看到,创建对象不需要再利用new关键字硬编码,而是完全交给Spring容器进行创建,我们在xml配置中将每一个UserDao的实现类映射到Bean,最后测试利用Spring上下文对象来获取映射好的bean实例

配置细节:

  1. property标签name对应类中的字段,value是可以自定义的具体值,ref则是将该字段映射到具体某一个类上比如引用数据类型就会用到ref配置
  2. bean中的id要与最终用Spring上下文对象getBean获取实例时的参数一致

IOC体现:

  1. 对象的创建、管理全部交给Spring容器。主动权交给Spring
  2. 程序不在主动的创建对象,而是被动的接收对象
  3. 利用set方法注入

IOC创建对象方式

默认创建对象方式:

// 无参构造
public User() {System.out.println("默认使用无参构造");
}
// 测试
ApplicationContext context = new ClassPathXmlApplicationContext("application-Context.xml");
User user = (User) context.getBean("User");

最终打印:默认使用无参构造,所以在不进行任何其他配置的情况下,Spring默认创建bean依然走无参构造器

public User(String name) {}
<bean id="User" class="com.yuqu.pojo.User"><property name="name" value="情人节"/>
</bean>

如果我们只显式了有参构造,那么无参构造被覆盖之后将会导致application-Context.xml文件配置的bean编译直接报错

使用含参构造时
方式一:

<!--  方式一:index代表构造器参数索引  -->
<bean id="User" class="com.yuqu.pojo.User"><constructor-arg index="0" value="情人节"/>
</bean>

方式二:

<!--  方式二:type代表参数类型  基本数据类型用  弊端较大  -->
<bean id="User" class="com.yuqu.pojo.User"><constructor-arg type="java.lang.String" value="圣诞节"/>
</bean>

但是假设多个参数都是java.lang.String那么方式二就是不可取的

方式三:

<!--  方式三:直接通过参数名设置  -->
<bean id="User" class="com.yuqu.pojo.User"><constructor-arg name="name" value="国庆节"/>
</bean>

相关文章:

SpringIOC推导IOC初步

了解准备 什么是Spring&#xff1f; Spring是一款轻量级的控制反转&#xff08;IOC&#xff09;和面向切面编程&#xff08;AOP&#xff09;的非入侵式开源框架 2002年Spring的前身interface21发布&#xff0c;随后在2004年3月24日正式更名发布Spring1.0版本Spring Frameword缔…...

Linux(centOS7)虚拟机中配置 vim

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…...

消息中间件-RocketMQ入门 消息发送的三种方式

消息中间件-RocketMQ入门 消息发送的三种方式消息中间件简介应用场景常用消息中间件RocketMQ核心概念入门案例-生产者和消费者代码逻辑消息发送的三种方式同步发送异步发送一次性消息消息中间件简介 应用场景 假设现在有订单微服务和积分微服务,正常请求流程之后是不是一个订…...

【FLASH存储器系列十九】固态硬盘掉电后如何恢复掉电前状态?

掉电分两种&#xff0c;一种是正常掉电&#xff0c;另一种是异常掉电。不管是哪种原因导致的掉电&#xff0c;我们都希望&#xff0c;重新上电后&#xff0c;SSD都需要能从掉电中恢复过来&#xff0c;继续正常工作。正常掉电恢复&#xff0c;这个好理解&#xff0c;主机通知SSD…...

Java知识点细节简易汇总——(7)面向对象编程(高级部分)

一、类变量、静态变量static static访问方式&#xff1a; public class VisitStatic {public static void main(String[] args) {//方法一://类名.类变量名//说明&#xff1a;类变量是随着类的加载而创建&#xff0c;所以即使没有创建对象实例也可以访问System.out.println(A.…...

阻塞式队列-生产者消费者模型

1.阻塞队列是什么 阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则. 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队…...

引导滤波code

文章目录1. 原理概述2. 实验环节2.1 验证与opencv 库函数的结果一致2.2 与 双边滤波比较2.3 引导滤波应用&#xff0c;fathering2.3 引导滤波应用&#xff0c;图像增强2.4 灰度图引导&#xff0c;和各自通道引导的效果差异2.5 不同参数设置影响3. 参考引导滤波1. 原理概述 引导…...

Leetcode.2353 设计食物评分系统

题目链接 Leetcode.2353 设计食物评分系统 Rating &#xff1a; 1782 题目描述 设计一个支持下述操作的食物评分系统&#xff1a; 修改 系统中列出的某种食物的评分。 返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings类&#xff1a; FoodRatings(String[] foo…...

C语言学习_DAY_2_变量的定义_输入与输出

高质量博主&#xff0c;点个关注不迷路&#x1f338;&#x1f338;&#x1f338;&#xff01; 目录 I. 变量的定义 II. 变量的赋值 III. 输出 IV. 输入 I. 变量的定义 首先&#xff0c;我们新建一个.c文件在Dev C中&#xff0c;并把之前定义好的程序框架放进去。 此时我…...

mac 安装navicat

由于各种原因发布不了链接&#xff0c;这里记录下&#xff0c;保存在了阿里云里...

RocketMQ快速入门

2.1 消息生产和消费介绍使用RocketMQ可以发送普通消息、顺序消息、事务消息&#xff0c;顺序消息能实现有序消费&#xff0c;事务消息可以解决分布式事务实现数据最终一致。RocketMQ有2种常见的消费模式,分别是DefaultMQPushConsumer和DefaultMQPullConsumer模式&#xff0c;这…...

【虚拟仿真】Unity3D实现从浏览器拉起本地exe程序并传参数

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 最近有项目需求&#xff0c;从浏览器调起来本地的exe程序&…...

Intel中断体系(1)中断与异常处理

文章目录概述中断与异常中断可屏蔽中断与不可屏蔽中断&#xff08;NMI&#xff09;异常异常分类中断与异常向量中断描述符表中断描述符中断与异常处理中断与异常处理过程堆栈切换错误码64位模式下的中断异常处理64位中断描述符64位处理器下的堆栈切换相关参考概述 中断是现代计…...

财报解读:四季度营收超预期,优步却越来越“不务正业”了

“公司第四季度的业绩表现将是强劲的”。 公布2022年第三季度财报时&#xff0c;优步的高管给出了这样的预告&#xff0c;给资本市场打了一针“强心剂”。然而有人对此表示质疑&#xff0c;后疫情时代&#xff0c;带着新模式、新车型的全新网约车公司层出不穷&#xff0c;车企…...

C语言-程序环境和预处理(14.2)

目录 预处理详解 1.预定义符号 2. #define 2.1 #define定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 注意事项&#xff1a; 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 3. #undef 4. 条件编译 4.1 单分支条件编译 4.2 多分支条件编译 4.3 判断是…...

VHDL语言基础-时序逻辑电路-计数器

目录 计数器的设计&#xff1a; 计数器的作用&#xff1a; 计数器的实现&#xff1a; 1、用“”函数描述&#xff1a; 用T触发器级联构成的串行进位的二进制加法计数器的仿真波形&#xff1a; 计数器的仿真&#xff1a; 计数器的设计&#xff1a; 计数是一种最简单基本的…...

MySQL数据库07——高级条件查询

前面一章介绍了基础的一个条件的查询&#xff0c;如果多条件&#xff0c;涉及到逻辑运算&#xff0c;and or 之类的。就是高级一点的条件查询。本章来介绍复杂的条件搜索表达式。 AND运算符 AND运算符只有当两边操作数均为True时&#xff0c;最后结果才为True。人们使用AND描述…...

《Terraform 101 从入门到实践》 第四章 States状态管理

《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新&#xff0c;书中的示例代码也是放在GitHub上&#xff0c;方便大家参考查看。 军书十二卷&#xff0c;卷卷有爷名。 为什么需要状态管理 Terraform的主要作用是管理云平台上的资源&#xff…...

数据结构之二叉树

&#x1f388;一.二叉树相关概念 1.树 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合&#xff0c;树结构通常用来存储逻辑关系为 "一对多" 的数据。例如&#xff1a; 关于树的几个重要概念&…...

上海亚商投顾:三大指数集体调整 消费板块逆市活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日集体调整&#xff0c;沪指全天弱势震荡&#xff0c;创业板指盘中跌超1%。旅游、食品、乳业等大消费板块…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...