有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java理解javax。注入示例代码?

我非常感谢有人帮助我理解这个javax示例代码以及@inject注释的实际用途。以下代码来自: Code From this Source

class Stopwatch {
 final TimeSource timeSource;
 @Inject Stopwatch(TimeSource TimeSource) {
   this.TimeSource = TimeSource;
 }
 void start() { ... }
 long stop() { ... }
}

首先,我认为(我希望)有一个输入错误,“TimeSource”参数应该是“TimeSource”,因为Stopwatch类中的字段是CamelCase

但我真正不明白的是@inject注释实际上在做什么!?它是否等效于此构造函数

class Stopwatch {
 final TimeSource timeSource;
 Stopwatch(TimeSource timeSource) {
 this.timeSource = timeSource;
 }
}

上面是我如何处理添加依赖项的,所以我希望我是正确的,@inject关键字就是这样做的。。。还是我太离谱了


共 (2) 个答案

  1. # 1 楼答案

    如果您已经理解了Spring的@Autowired注释,那么上面的代码也一样@Autowired是一个特定于Spring的注释,@Inject来自Java依赖注入规范

    class Stopwatch {
     final TimeSource timeSource;
     @Inject Stopwatch(TimeSource TimeSource) {
       this.TimeSource = TimeSource;
     }
     void start() { ... }
     long stop() { ... }
    }
    

    这里,@Inject表示当创建Stopwatch的实例时,应该通过该构造函数实例化它,并传入一个可分配给TimeSource的实例

    Instead of the programmer calling a constructor or factory, a tool called a dependency injector passes dependencies to objects

    因此,如本文所述,依赖项注入器将确保在创建Stopwatch的实例时注入TimeSource的实例

  2. # 2 楼答案

    迟回答,但可能有助于其他人。 @Inject注释本身不做任何事情

    您需要一个作用于注释的框架

    例如Guice

    Injector injector = Guice.createInjector();
    YourObject yo = injector.getInstance(YourObject.class);
    

    注释是在javax中提供标准名称的,因此理论上我可以用Guice交换其他东西