6.24 Spring(第二天)
Spring DI 解耦
什么是"解耦"
就是解开耦合的意思
既降低程序中的耦合性
什么是耦合性
所谓耦合性,就是两个类型的依赖关系是否可以替换
上次课程中关羽和青龙偃月刀的依赖关系就不能替换,这种情况就是紧耦合\高耦合
也因为不能替换带来了程序的扩展性降低
实现解耦的操作
如果想降低关羽和青龙偃月刀的耦合性,我们的做法是
声明一个接口或抽象类,作为青龙偃月刀的接口\父类
关羽不再依赖青龙偃月刀而依赖它的接口\父类,这个操作过程就能降低关羽和青龙偃月刀的耦合
首先编写一个武器(Weapon)接口
public interface Weapon {public String getName();
}
青龙偃月刀类实现武器接口
@Component
public class DragonBlade implements Weapon {private String name="青龙偃月刀";//get set toString略
}
关羽类
@Component
public class GuanYu {private String name="关云长";//Weapon是一个接口,不能实例化//@Autowired会自动从Spring容器中搜索实现了Weapon接口类型的对象//例如现在得青龙偃月刀就是实现了Weapon接口的对象@Autowiredprivate Weapon weapon;public void fight(){System.out.println(name+"使用"+weapon+"战斗");}//其它代码略
}
别忘了配置类
@ComponentScan("ouhe")
public class OuheConfig {}
最后测试
@Test
public void ouheTest(){GuanYu guanYu=acac.getBean("guanYu",GuanYu.class);guanYu.fight();
}
输出:关云长使用青龙偃月刀战斗
我们看到输出结果是可以运行的
原因是虽然关羽类依赖Weapon接口,但是当前Spring容器中只有一把武器就是青龙偃月刀
下面我们再添加一把武器
方天画戟
@Component
public class SkyLancer implements Weapon{private String name="方天画戟";//set get toString 略
}
添加方天画戟之后,刚刚运行成功的测试类再运行,就会发生异常
原因是当前Spring容器有两个Weapon对象,id又没有匹配的,所以依赖注入失败
解决方案有两个
1.将关羽类中Weapon接口类型的属性名修改为其中一个对象的id
但是这个解决方案修改了属性名称,可能会引发一系列代码维护,比较不推荐
2.在@Autowired注解下添加一个注解
@Autowired
@Qualifier("skyLancer")
private Weapon weapon;
@Qualifier(“skyLancer”)表示下面的属性取值的Spring容器对象id为skyLancer
依赖注入解耦小结
1.耦合性是依赖关系产生的
2.依赖的类型如果是能够实例化对象的,就是高耦合
反之,依赖的类型如果不能实例化(接口或抽象类),这个依赖关系就是低耦合
我们追求低耦合的程序
3.今后我们在使用依赖注入时,类中的依赖类型尽量编写为接口或抽象类
保证程序良好的扩展性
@Bean和组件扫描混用
我们学习的@Bean注解将对象保存到Spring容器中和使用组件扫描保存到Spring容器中的对象都是互相可以使用的,并不隔离的
例如,我们再编写一个丈八蛇矛类(不适用@Component标记)
public class SnakeLancer implements Weapon {private String name="丈八蛇矛";
}
在配置类中使用@Bean保存
@ComponentScan("ouhe")
public class OuheConfig {@Beanpublic Weapon snake(){return new SnakeLancer();}
}
实际上关羽类也是可以使用snake来获得丈八蛇矛来战斗的!
@Autowired
//使用@Bean保存到Spring容器中的武器snake
@Qualifier("snake")
private Weapon weapon;
测试类运行
输出:关云长使用丈八蛇矛战斗
6.24 Spring(第二天)相关推荐
- Spring第二弹—–搭建与测试Spring的开发环境
PS:Spring既可以使用在javaSE中,也可以使用在javaWeb中. 使用Spring需要的jar 下载spring(我下载的是2.5.6版本),然后进行解压缩,在解压目录中找到下面jar文件 ...
- 2.24. Spring boot with Apache Kafka
Spring boot 1.5.1 2.24.1. 安装 kafka 一下安装仅仅适合开发环境,生产环境请使用这个脚本安装 https://github.com/oscm/shell/tree/mas ...
- Spring第二讲--利用组件注解符精简Spring配置文件
一.上次学习的内容 上次的学习是第一次接触Spring,上次我们对pom文件相关添加了依赖,主要是对采用Spring配置文件管理Bean进行了学习 二.今天要学习的内容 (1)利用组件注解符精简Spr ...
- 【Spring】Spring第二天 - AOP 详解、动态代理设计模式(JDK和cglib)
一.AOP AOP 和 Filter 能够实现的 功能相似. AOP 和 Filter 的区别: AOP拦截的是类中方法(切点),只要方法能够被Spring管理,那么这个方法就能够被拦截. Filte ...
- 初学Java ssh之Spring 第二篇
上一篇我们成功搭建好了spring开发的环境,接下来一起看看spring有什么神奇的地方吧(本人也是新手,有不太对的地方希望大神给指出便于修改呢,谢谢大家). 之前听说spring是在对xml文件的应 ...
- 聊聊、Spring 第二篇
之前写了一篇<Spring环境搭建一>,感觉写的很烂,也许是时间有限,写的很急.今天我想再写写 Spring 的环境搭建,因为 Spring 的模块是可以单独拿出来用的,所以有很多的模块不 ...
- 【Spring第二篇】IOC:控制反转
IOC:控制反转 什么是IOC? 举个例子,我们有一个UserDao接口类,并且有三个UserDao实现类,分别是MysqlUserDaoImpl.OracleUserDaoImpl.UserDa ...
- 小白学习spring第二天
第8节:Spring配置文件模块化 1.配置文件模块化的业务背景,为什么要进行配置文件模块化2.配置文件模块化的具体实现方式一: 创建多个并列的配置文件方式二: 创建一个主配置,多个从配置,主配置当中 ...
- SSH框架之Spring第二篇
1.1 基于注解的IOC配置既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样.1.2 环境搭建1.2.1 第一步:拷贝必备的jar包需要多拷贝一个spring ...
最新文章
- 每日一皮:学会说话很重要...
- 手脱UPX v0.89.6 - v1.02
- 口袋操作系统_可以装进口袋的主机要有多小?驰为LarBox迷你主机入手体验
- python判断操作系统类型
- Redis-Bitmap介绍及使用
- java 阿里线程池_为什么阿里不允许使用 Executors 创建线程池?
- 【学习笔记】OSG 基本几何图元
- 厄瓜多尔最大银行遭攻击,服务被迫中断
- android 动画之漂移,Android之自定义Drawable实现灵动的红鲤鱼动画(上篇)
- matlab在有限差分法中的应用,MATLAB在有限差分法中的应用
- kali linux2.0输入法,kali2.0 设置输入法 找了好久,亲测有效
- 系统聚类算法并绘制谱系图
- PHP算法-快速排序
- EasyExcel 筛选导出
- 【洛谷】P2006 赵神牛的游戏 c++
- 响应式扩展_响应式和无限扩展的JS动画
- C# 重写(override)
- 夜天之书 #49 开源软件的技术写作
- Tomcat部署到idea
- Allegro自动对齐工具
热门文章
- 什么时候用redis什么时候用mysql_Redis和MySql数据同步以及Redis使用场景
- VMware Esxi卸载NVIDIA GPU显卡驱动
- 二手3C市场观察|平台掌握“赛点”后,头部综合垂直回收平台出路在哪?
- JAVA编写程序,打印九九乘法表(涵盖三种表达形式)
- 了解CSS in JS(JSS)以及在React项目中配置并使用JSS
- php条件 效率高,php高效率写法40例
- 非负矩阵分解NMF(1): 非调包python实现
- WangEditor实现富文本编辑和图片上传
- ECMAScript 2016 (ES7)
- 智能未来趋势,中电丽声Celisen光传感器:让行动装置由被动变主动