Как Spring отделяет класс от интерфейса?

На официальном сайте Spring Framework есть пример, который показывает, как 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 это зависимость и A зависит. Если B это интерфейс, то A зависит от некоторой реализации B,

Итак, в приведенном выше коде, как MessagePrinter отделен от MessageService реализация?

мы все еще должны реализовать MessageService, Если мы не реализуем это, можем MessagePrinter работает правильно?

С уважением

1 ответ

Решение

Да, вы должны иметь MessageService в вашем контексте. Без этого внедрение зависимостей вызвано @Autowired аннотация не будет выполнена во время инициализации контекста.

Если я правильно понимаю терминологию, MessagePrinter не может быть отделен от MessageService потому что первый использует последний в своем коде напрямую. Но это можно отделить от MessageService Реализации.

Это отделено от MessageService реализации, потому что это зависит только от MessageService интерфейс; он ничего не знает о реализации классов.

Если вам случится MessageServiceImpl1 а затем измените его на MessageServiceImpl2, MessagePrinter не нужно будет менять вообще (если обе реализации ведут себя одинаково по контракту, конечно).

Другие вопросы по тегам