繁体   English   中英

Java中的手动依赖注入(没有spring boot)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM