Spring如何将一个类与接口分离?

时间:2018-02-11 17:56:18

标签: java spring spring-mvc dependency-injection decoupling

在Spring框架的官方网站上,有一个例子展示了Spring如何从一个接口中解耦出一个类,或者更好地说,如果一个接口是一个实现。

以下是代码:

接口:

package hello;

public interface MessageService {
    String getMessage();
}

组件类:

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessagePrinter {

    final private MessageService service;

    @Autowired
    public MessagePrinter(MessageService service) {
        this.service = service;
    }

    public void printMessage() {
        System.out.println(this.service.getMessage());
    }
}

应用:

package hello;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class Application {

    @Bean
    MessageService mockMessageService() {
        return new MessageService() {
            public String getMessage() {
              return "Hello World!";
            }
        };
    }

  public static void main(String[] args) {
      ApplicationContext context = 
          new AnnotationConfigApplicationContext(Application.class);
      MessagePrinter printer = context.getBean(MessagePrinter.class);
      printer.printMessage();
  }
}

我目前对依赖注入的理解是,当一个名为A的类需要另一个名为B的类来处理它必须做的事情时,B是一个依赖项{{1}是依赖的。如果A是一个界面,那么B依赖于A部分实现。

那么,在上面的代码中,BMessagePrinter实现的解耦方式是什么?

我们仍然必须实施MessageService,如果我们不实施它,MessageService能否正常运作?

此致

1 个答案:

答案 0 :(得分:0)

是的,您的上下文中必须有MessageService。如果没有它,由@Autowired注释引起的依赖注入将在上下文初始化期间失败。

如果我正确理解术语,MessagePrinter无法与MessageService分离,因为前者在其代码中直接使用后者。但它可以与MessageService实现分离。

它与MessageService实现分离,因为它仅依赖于MessageService接口;它对实现类没有任何了解。

如果您碰巧拥有MessageServiceImpl1,然后将其更改为MessageServiceImpl2,则根本不需要更改MessagePrinter(如果两种实施方式在合同方面的行为相同,当然)。