java - Java 接口在 Spring Boot 中的工作方式是否不同?-- 这是 Spring Wizardry 还是我只是不懂接口?
问题描述
我正在开发一个使用 Spring Boot 的应用程序。在其中,以我不理解的方式使用了接口。我已将代码精简到我认为与问题相关的唯一部分。
创建一个控制器对象。
它被告知要处理一些东西。
控制器告诉接口处理器完成这项工作。
有一个实现接口处理器的处理器。
我的理解是,在使用接口时,您会执行以下操作:IProcessor iProcessor = new Processor();
换句话说,为接口分配一个实现。但是在这个示例程序中,处理器实现似乎是隐式分配的,据我所知,不在代码中。我试图弄清楚这是否是一些 Spring 魔法,或者我只是理解错误的接口。我按照应用程序流程的顺序排列了四个文件。
@Component
public class DoStuff {
private ProcessorController PROCESSOR_CONTROLLER;
private OtherLayer OTHER_LAYER;
@Autowired
public DoStuff(ProcessorController processorController, OtherLayer otherLayer) {
this.PROCESSOR_CONTROLLER = processorController;
this.OTHER_LAYER = otherLayer;
}
public void execute() {
List<String> stuffToProcess = OTHER_LAYER.getStuffToProcess();
PsROCESSOR_CONTROLLER.process(stuffToProcess);
}
}
@Component
public class ProcessorController {
private final IProcessor IPROCESSOR;
@Autowired
public ProcessorController(IProcessor iProcessor) {
this.IPROCESSOR = iProcessor;
}
public void process(List<String> stuffToProcess) {
stuffToProcess.forEach(t -> IPROCESSOR.process(t))
}
}
public interface IProcessor {
void process(String stuff);
}
@Component
public class Processor implements IProcessor {
@Override
public void process(String stuff) {
System.out.println(stuff);
}
}
如果 ProcessorController 类包含如下内容:那么 ProcessorController 类的一部分将如下所示:
private final IProcessor IPROCESSOR;
@Autowired
public ProcessorController(Processor Processor) {
this.IPROCESSOR = processor;
}
我认为这是有道理的,因为我们已经将接口与其实现联系起来。但事实并非如此。那么这里发生了什么?
解决方案
你的理解是正确的
IProcessor iProcessor = new Processor();
上面的方法是正确的将实现分配给接口引用变量的方法。这种现象称为松耦合。因为如果方法参数类型是接口,那么它可以根据需要与多个实现绑定。
例如我们有
接口Test和Test1和Test2是它的实现类然后void方法(Test test)
所以现在这个方法可以绑定 Test1 和 Test2 像方法(Test1 obj)和方法(Test2 obj)
但是您的控制器在这里是紧密耦合而不是松散耦合。因为您的构造函数调用与实现类引用而不是接口绑定。如果您的项目需要紧密耦合,那么创建接口类型的类引用没有用,而是您可以创建private final Processor PROCESSOR;
而不是下面代码
private final IProcessor IPROCESSOR;
@Autowired
public ProcessorController(Processor Processor) {
this.IPROCESSOR = processor;
}
它应该像
@Autowired
private final IProcessor IPROCESSOR;
或者
private final IProcessor IPROCESSOR;
@Autowired
public ProcessorController(IProcessor Processor) {
this.IPROCESSOR = processor;
}
推荐阅读
- sybase - How to use isql COLUMN Format option
- python - 如果存在基于另一个列值的行,Pandas 会删除一个列值
- matlab - unexpected behavior textscan matlab when skipping characters
- python-3.x - Gmail API How to retrieve body of an email
- c# - Web Api 如何处理这个查询字符串?
- python - 如何在熊猫数据框中找到标准匹配上方和下方的x行,然后将它们保存为新的df?
- arrays - scala中数组元素的组合
- windows - 如何在没有 UAC 提示的管理员提升模式下打开或执行 Powershell 脚本?
- amazon-ecs - 即使有足够的容量,ECS 也无法启动任务
- javascript - 错误:找不到模块“./api/routers”