在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
的部分实现。
那么,在上面的代码中,B
与MessagePrinter
实现的解耦方式是什么?
我们仍然必须实施MessageService
,如果我们不实施它,MessageService
能否正常运作?
此致
答案 0 :(得分:0)
是的,您的上下文中必须有MessageService
。如果没有它,由@Autowired
注释引起的依赖注入将在上下文初始化期间失败。
如果我正确理解术语,MessagePrinter
无法与MessageService
分离,因为前者在其代码中直接使用后者。但它可以与MessageService
实现分离。
它与MessageService
实现分离,因为它仅依赖于MessageService
接口;它对实现类没有任何了解。
如果您碰巧拥有MessageServiceImpl1
,然后将其更改为MessageServiceImpl2
,则根本不需要更改MessagePrinter
(如果两种实施方式在合同方面的行为相同,当然)。