Как 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
не нужно будет менять вообще (если обе реализации ведут себя одинаково по контракту, конечно).