[英]Manual dependency injection in Java(without spring boot)
我创建了一些类和一个如下所示的接口。 这算是DI吗? 或者这不是因为我做了new TalkingClockApplication(new TalkingClock());
? 如果不是,我想知道如何将其设为 DI。(不带弹簧靴)
当我注释掉new TalkingClockApplication(new TalkingClock());
并运行 TalkingClockApplication,它说“com.XXX.TalkingClockApplication.convertTime”为空。
public interface ConvertTime {
String convertTime(int hours, int minutes);
}
和
public class TalkingClock implements ConvertTime {
@Override
public String convertTime(int hours, int minutes) {
// do something
return value;
}
}
和
public class TalkingClockApplication {
public ConvertTime convertTime;
public TalkingClockApplication(ConvertTime convertTime) {
this.convertTime = convertTime;
}
public static void main( String[] args ) throws Exception {
String friendlyText = "";
TalkingClockApplication aa = new TalkingClockApplication(new TalkingClock());
int hours = Integer.parseInt(strings[0]);
int minutes = Integer.parseInt(strings[1]);
friendlyText = aa.convertTime.convertTime(hours, minutes);
System.out.println( friendlyText );
}
}
Spring 不支持对静态字段的依赖注入,因此要么使您的ConvertTime
成为非静态字段,要么将其注入非静态字段,然后将其分配给该静态字段。
当您查看https://en.wikipedia.org/wiki/Dependency_injection并将其与您的解决方案进行比较时,您会发现您实现了大部分部分(服务、客户端和接口),正如那里描述的那样。
但是缺少了一部分:在谈论依赖注入时,通常还有一个注入器负责提供实现。
因此,您可以实现一个注入器,该注入器负责创建实例并注入所需的元素。 (因此,将该部分从 main 方法中移到您的 Injector 中可能就足够了,然后您只需调用 Injector 来获取您的 TalkinClockApplication 实例。)
在您的代码中: TalkingClockApplication aa = new TalkingClockApplication(new TalkingClock());
当您通过constructor
传递依赖项时,您已经在进行DI
。 而且您正在使用polymorphism
来帮助您传递任何实现ConvertTime
类型
当然,您可以在没有spring
情况下进行DI
,但是spring
为您提供的是自动提供所需实现的能力,因为您知道无法实例化interface
,这里是TalkingClock
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.