什么是依赖注入呢?谁依赖谁,谁注入谁呢,怎么依赖,怎么注入,通常我们写代码,A类可以回依赖B类,这就是依赖,那怎么实现呢,两种方式一种是直接在A类中实例化B类,这种我起个名字叫依赖写死,另一种呢,是B类实例化后,通过构造函数传入到A类中,这样A类实现了与B类的解耦。
Notification 类负责消息推送,依赖 MessageSender 类实现推送商品促销、验证码等消息给用户。我们分别用依赖注入和非依赖注入两种方式来实现一下。具体的实现代码如下所示:
代码语言:java复制// 非依赖注入实现方式
public class Notification {
private MessageSender messageSender;
public Notification() {
this.messageSender = new MessageSender(); //此处有点像hardcode
}
public void sendMessage(String cellphone, String message) {
//...省略校验逻辑等...
this.messageSender.send(cellphone, message);
}
}
public class MessageSender {
public void send(String cellphone, String message) {
//....
}
}
// 使用Notification
Notification notification = new Notification();
再看下用依赖注入方式来实现下:
代码语言:java复制// 依赖注入的实现方式
public class Notification {
private MessageSender messageSender;
// 通过构造函数将messageSender传递进来
public Notification(MessageSender messageSender) {
this.messageSender = messageSender;
}
public void sendMessage(String cellphone, String message) {
//...省略校验逻辑等...
this.messageSender.send(cellphone, message);
}
}
//使用Notification
MessageSender messageSender = new MessageSender();
Notification notification = new Notification(messageSender);
通过依赖注入的方式来将依赖的类对象传递进来,这样就提高了代码的扩展性,我们可以灵活地替换依赖的类。这就是依赖注入。
我们用一句话来概括就是:不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。
上面代码还有继续优化的空间,我们还可以把 MessageSender 定义成接口,基于接口而非实现编程。改造后的代码如下所示:
代码语言:ts复制public class Notification {
private MessageSender messageSender;
public Notification(MessageSender messageSender) {
this.messageSender = messageSender;
}
public void sendMessage(String cellphone, String message) {
this.messageSender.send(cellphone, message);
}
}
public interface MessageSender {
void send(String cellphone, String message);
}
// 短信发送类
public class SmsSender implements MessageSender {
@Override
public void send(String cellphone, String message) {
//....
}
}
// 站内信发送类
public class InboxSender implements MessageSender {
@Override
public void send(String cellphone, String message) {
//....
}
}
//使用Notification
MessageSender messageSender = new SmsSender();
Notification notification = new Notification(messageSender);
nestjs很好的实现了依赖注入的思路,但是我们通常在使用nestjs时,使用依赖注入时并没有特意的去实例化相应的类,而是直接通过构造函数,将参数类型传递到构造函数,这是因为nestjs框架替我们做了这一步操作,我忘了在哪里看到的了,nestjs会扫描构造函数的参数,并根据其参数类型将其实例化。
以上便是关于依赖注入的一些想法,希望对你有所帮助。