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(第二天)相关推荐

  1. Spring第二弹—–搭建与测试Spring的开发环境

    PS:Spring既可以使用在javaSE中,也可以使用在javaWeb中. 使用Spring需要的jar 下载spring(我下载的是2.5.6版本),然后进行解压缩,在解压目录中找到下面jar文件 ...

  2. 2.24. Spring boot with Apache Kafka

    Spring boot 1.5.1 2.24.1. 安装 kafka 一下安装仅仅适合开发环境,生产环境请使用这个脚本安装 https://github.com/oscm/shell/tree/mas ...

  3. Spring第二讲--利用组件注解符精简Spring配置文件

    一.上次学习的内容 上次的学习是第一次接触Spring,上次我们对pom文件相关添加了依赖,主要是对采用Spring配置文件管理Bean进行了学习 二.今天要学习的内容 (1)利用组件注解符精简Spr ...

  4. 【Spring】Spring第二天 - AOP 详解、动态代理设计模式(JDK和cglib)

    一.AOP AOP 和 Filter 能够实现的 功能相似. AOP 和 Filter 的区别: AOP拦截的是类中方法(切点),只要方法能够被Spring管理,那么这个方法就能够被拦截. Filte ...

  5. 初学Java ssh之Spring 第二篇

    上一篇我们成功搭建好了spring开发的环境,接下来一起看看spring有什么神奇的地方吧(本人也是新手,有不太对的地方希望大神给指出便于修改呢,谢谢大家). 之前听说spring是在对xml文件的应 ...

  6. 聊聊、Spring 第二篇

    之前写了一篇<Spring环境搭建一>,感觉写的很烂,也许是时间有限,写的很急.今天我想再写写 Spring 的环境搭建,因为 Spring 的模块是可以单独拿出来用的,所以有很多的模块不 ...

  7. 【Spring第二篇】IOC:控制反转

    IOC:控制反转 什么是IOC? ​ 举个例子,我们有一个UserDao接口类,并且有三个UserDao实现类,分别是MysqlUserDaoImpl.OracleUserDaoImpl.UserDa ...

  8. 小白学习spring第二天

    第8节:Spring配置文件模块化 1.配置文件模块化的业务背景,为什么要进行配置文件模块化2.配置文件模块化的具体实现方式一: 创建多个并列的配置文件方式二: 创建一个主配置,多个从配置,主配置当中 ...

  9. SSH框架之Spring第二篇

    1.1 基于注解的IOC配置既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样.1.2 环境搭建1.2.1 第一步:拷贝必备的jar包需要多拷贝一个spring ...

最新文章

  1. 每日一皮:学会说话很重要...
  2. 手脱UPX v0.89.6 - v1.02
  3. 口袋操作系统_可以装进口袋的主机要有多小?驰为LarBox迷你主机入手体验
  4. python判断操作系统类型
  5. Redis-Bitmap介绍及使用
  6. java 阿里线程池_为什么阿里不允许使用 Executors 创建线程池?
  7. 【学习笔记】OSG 基本几何图元
  8. 厄瓜多尔最大银行遭攻击,服务被迫中断
  9. android 动画之漂移,Android之自定义Drawable实现灵动的红鲤鱼动画(上篇)
  10. matlab在有限差分法中的应用,MATLAB在有限差分法中的应用
  11. kali linux2.0输入法,kali2.0 设置输入法 找了好久,亲测有效
  12. 系统聚类算法并绘制谱系图
  13. PHP算法-快速排序
  14. EasyExcel 筛选导出
  15. 【洛谷】P2006 赵神牛的游戏 c++
  16. 响应式扩展_响应式和无限扩展的JS动画
  17. C# 重写(override)
  18. 夜天之书 #49 开源软件的技术写作
  19. Tomcat部署到idea
  20. Allegro自动对齐工具

热门文章

  1. 什么时候用redis什么时候用mysql_Redis和MySql数据同步以及Redis使用场景
  2. VMware Esxi卸载NVIDIA GPU显卡驱动
  3. 二手3C市场观察|平台掌握“赛点”后,头部综合垂直回收平台出路在哪?
  4. JAVA编写程序,打印九九乘法表(涵盖三种表达形式)
  5. 了解CSS in JS(JSS)以及在React项目中配置并使用JSS
  6. php条件 效率高,php高效率写法40例
  7. 非负矩阵分解NMF(1): 非调包python实现
  8. WangEditor实现富文本编辑和图片上传
  9. ECMAScript 2016 (ES7)
  10. 智能未来趋势,中电丽声Celisen光传感器:让行动装置由被动变主动