6. 以下耦合度中最松散的耦合是_Spring Java中的依赖注入,它是如何工作的?- 知识铺...
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停地来唤醒记忆深处的知识点。
一、Spring 框架 POJO
Spring Framework是一个开源的应用程序框架和控件容器的反转。简单的理解,它是一个集成了各种Java技术或API的框架,这使得它可以用简单的POJO来实现它。“什么是POJO?”,POJO是一个普通的Java对象,可能有setter和getter字段,可能会覆盖Object或interface中的某些方法,但是没有自己的行为。
例:
class PojoExample {
private String name;
private int age;
public String getName() { return this.name; }
public int getAge() { return this.age; }
public void setName(string name) { this.name = name; }
public void setAge(int age) { this.age = age; }
public boolean equals(Object other) {...}
}
二、依赖注入工作方式
依赖注入是Spring框架最受欢迎的特性之一,它是一种设计模式,允许构建解耦的系统。假设两个类继承自单个公共父类,显然一个类中的更改也会影响另一个类。简单地说,解耦是一种允许对从公共父类继承而不影响任何其他类的任何一个类进行更改的方法。实现依赖注入以实现应用程序中的松散耦合和可扩展性。这种模式的主要目标是使类尽可能独立于另一个类,这增加了重用这些类的可能性,并能够独立于其他类测试它们。
如果使用“B”作为其变量,则类“A”被认为与类“B”具有依赖性。如果们使用注入类“A”的依赖注入类“B”,这可以通过两种主要方式完成:
1)参数注入
它是DI最简单但最受欢迎的方式之一,它将通过setter方法注入依赖项。例:
public class Information
{
PersonalInformation personalInfo;
public void setPersonalInfo(PersonalInformation personalInfo){
this.personalInfo = personalInfo;
}
}
在上面的示例中,通过setter方法将类名称PersonalInformation注入到类Information中。
2)构造函数注入
在这种方法中,DI方法将通过构造函数注入依赖项。
例:
public class Information
{
PersonalInformation personalInfo;
Information(PersonalInformation personalInfo){
this.personalInfo = personalInfo;
}
}
在上面的示例中,通过构造函数将类名称PersonalInformation注入到类Information中。
三、依赖注入的好处
举一个消息传递服务的例子,可以从中执行不同类型的消息传递方法,如电子邮件,短信,语音消息等。现在创建一个每个消息方法类应该实现的接口 -
public interface Message {
void messagingMethod();
}
现在创建一个消息传递方法,并实现上述接口 -
public class EmailMessaging implements Message{
public void messagingMethod() {
System.out.println("Send Message through email!");
}
}
现在创建一个MessageService接口,它有一个抽象方法来发送消息。
public interface MessageService {
void sendMessage();
}
最后,将为其实现创建一个类,
public class MessageServiceImpl implements MessageService {
private EmailMessaging emailMessage;
MessageServiceImpl(){
this.emailMessage = new EmailMessaging();
}
public void sendMessage() {
emailMessage.messagingMethod();
}
}
分析一下这个MessageServiceImpl类中的问题:
1)由于它正在创建自己的EmailMessaging参考,它与EmailMessaging功能紧密耦合,对于SMS,Voice等其他所有方法,也必须以类似的方式引用它们。
2)由于MessageServiceImpl与EmailMessaging类紧密耦合,无法模拟其单元测试的依赖性。
3)这种强依赖,在为单独的行为和使用接口创建单独的类之后做很多工作,但是在MessageServiceImpl中引入了EmailMessaging本身,导致消息服务类强依赖Email服务。
解决:为了解决这些问题,可以引入一个外部类,它将负责注入这些依赖项,以便对象本身不负责创建它们的依赖项,但依赖项将被注入到对象中。
重写MessageServiceImpl的代码,依赖注入的实现方式。
public class MessageServiceImpl implements MessageService {
private Message message;
MessageServiceImpl(Message message){
this.message = message;
}
public void sendMessage() {
message.messagingMethod();
}
}
看看tabove代码,现在应该已经清楚了解依赖注入概念。现在只需将它与MessageServiceImpl类的早期实现进行比较,就没有EmailMessaging类的依赖,因此类MessageServiceImpl与任何特定实现都没有紧密耦合。
现在在这个类MessageServiceImpl中,依赖是通过类的构造函数注入的:
MessageService messageService = new MessageServiceImpl(new EmailMessaging());
messageService.sendMessage();
对于SMS实现,们可以这样做:
MessageService messageService = new MessageServiceImpl(new SmsMessaging());
messageService.sendMessage();
这将调用SmsMessaging特定的实现。
代码松散耦合,因为类MessageServiceImpl现在没有绑定到任何特定的实现,因为它只知道在运行时可以通过特定实现轻松交换的接口。
6. 以下耦合度中最松散的耦合是_Spring Java中的依赖注入,它是如何工作的?- 知识铺...相关推荐
- java中随机数怎么定义类_浅析Java中的随机数类
Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...
- java中的深度克隆浅克隆_了解Java中的可克隆接口
java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...
- c语言中大写英文字母所占字节,Java中字符编码和字符串所占字节数 .
首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...
- spring三: 装配bean( 在xml中进行显式配置, 在java中进行显式配置)
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class); SpringCon ...
- java中接口适配器实现,12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式)...
12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式) 从以上的学习我们已经了解到,基于接口的适配器模式是采用抽象化接口的方式,来达到节省接口函数的目的,这一特性特别适合于Java A ...
- java中char类型_【考点】JAVA中的char类型
写在前面: 本周,在我们同学的刷题群里,一位同学上传了一道关于char的题,引起的不少同学的热议.热议的同时,我们也发现近乎一半的同学对char的基础知识一知半解,今天我们给大家一个浅显易懂的解释,赶 ...
- java中定义类头的修饰符,JAVA中定义类头时能使用的修饰符是什么
满意答案 壹壹8623000 2013.06.16 采纳率:47% 等级:12 已帮助:9954人 1.public 使用对象:类.接口.成员 介绍:无论它所处在的包定义在哪,该类(接口.成员) ...
- java中的解码和编码_关于java中编码和解码(一)
关于java中编码和解码(一) 关于java中编码和解码(一) 计算机中所能表示的字符仅仅为0-255个,平时我们用到的语言太多,计算机本身根本无法表示.必须将我们的不同的语言转换为计算机所能理解的语 ...
- java中什么是类型_什么是Java中基本数据类型?
Java中除了二进制文件和使用文本文件外还有基于Data的数据操作,这里的Data指的是Java的基本数据类型和String.基本数据类型包括byte.int.char.long.float.doub ...
最新文章
- Android: BaseAdapter 实现分页
- Linux下mysql新建账号及权限设置
- 2022跨年代码(HTML·资源都是网上的可以直接使用)
- 在Vista以上版本运行WTL程序,有时候会提示“这个程序可能安装补正确...”的错误...
- 2015/Province_C_C++_C/6/奇妙的数字
- Linux下使Shell命令脱离终端运行
- java 正则表达式-忽略大小写与多行匹配
- html5模板 制作,优秀的H5作品是如何炼成的?模板制作详解!
- java httpclient 进度条_java – 如何使用Apache HttpClient 4获取文件上传的进度条?
- mysql监控工具:zabbix+MPM(Performance Monitor for MySQL)
- 【企业】马化腾致信合作伙伴:灰度法则的七个维度
- c语言vc怎么改变背景板颜色,VC设置视图背景颜色方法
- 英伟达首席科学家:深度学习硬件的过去、现在和未来
- 计算机音乐谱一壶老酒,一壶老酒简谱(歌词)-陆树铭演唱-沈公宝曲谱
- 进销存设计与分析_库存汇总表(13)
- 将指定的计数添加到该信号量中会导致其超过最大计数
- 腾讯安全【数实融合 安全共赢】圆桌栏目,精彩来袭
- 信息资源物理服务器包括什么,信息资源数据库
- 使用数据流引擎进行大型矩阵操作
- laravel-admin扩展wang-Editor上传图片设置