计算机系统应用教程网站

网站首页 > 技术文章 正文

Spring Java中的依赖注入,它是如何工作的?- 知识铺

btikc 2024-10-18 04:39:50 技术文章 16 ℃ 0 评论

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停地来唤醒记忆深处的知识点。

一、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现在没有绑定到任何特定的实现,因为它只知道在运行时可以通过特定实现轻松交换的接口。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表