首页 > 解决方案 > Java 接口在 Spring Boot 中的工作方式是否不同?-- 这是 Spring Wizardry 还是我只是不懂接口?

问题描述

我正在开发一个使用 Spring Boot 的应用程序。在其中,以我不理解的方式使用了接口。我已将代码精简到我认为与问题相关的唯一部分。

  1. 创建一个控制器对象。

  2. 它被告知要处理一些东西。

  3. 控制器告诉接口处理器完成这项工作。

  4. 有一个实现接口处理器的处理器。

我的理解是,在使用接口时,您会执行以下操作: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;
}

我认为这是有道理的,因为我们已经将接口与其实现联系起来。但事实并非如此。那么这里发生了什么?

标签: javaspringspring-boot

解决方案


你的理解是正确的

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;
}

推荐阅读