DI

JSR-330Java 的依赖注入标准。定义了如下的术语描述依赖注入:

  • A 类型依赖 B类型(或者说 B 被 A 依赖),则 A类型 称为”依赖(物) dependency
  • 运行时查找依赖的过程,称为”解析 resolving“依赖
  • 如果找不到依赖的实例,称该依赖是”不能满足的 unsatisfied
  • 在”依赖注入 dependency injection”机制中,提供依赖的工具称为”依赖注入器 dependency injector”

在标准中, 依赖是类型而不是实例/对象; 在程序中(运行时), 需要的是依赖的实例.

标准对依赖注入的使用进行了定义, 但是对实现和配置未定义。Java EEjavax.inject对应该标准。其中也仅定义了依赖注入的使用(即通过注解),同样也未定义依赖注入的配置方式和实现方式。实际上,依赖配置方式和实现方式由”依赖注入器“定义和实现。注入器的配置方式常见有XML注解DSLJava 代码; 实现方式有反射和代码生成。依赖注入器在构建时,会验证所有依赖是否满足(通过识别注解来得知其依赖),在运行时为类注入其需要的依赖的实例。(因为依赖注入器对依赖的识别过程就是对注解的处理,所以依赖注入器也是注解处理器)。

javax.injects

该包提供了如下5个注解(Inject、Qualifier、Named、Scope、Singleton)和1个接口(Provider)。

@Inject

标识某个类中,需要由注入器注入的类成员(被标识的成员称为”可注入的”)。

使用规则

  1. 可用于注解构造器、字段、方法这些类成员(对成员是静态与否、最好是public的)
  2. 每个类只能有一个构造器可以被标记可注入;空构造器可以不用@Inject注解。
  3. 可注入的字段不能为 final 的
  4. 可注入的方法不能为 abstract 的

注入器的依赖注入顺序

  1. 构造器 > 字段 > 方法
  2. 父类 > 子类
  3. 一个类的两个可注入字段或其他成员无注入顺序

另外的四个注解对依赖注入进一步进行配置。

@Qualifier 和 @Named

其中,@Qualifiery用于创建限定器。限定器是一个自定义的注解,可注解字段或方法的参数,用于限制可注入的依赖的类型。限定器注解必须被 @Qualifier 和 @Retention(RetentionPolicy.RUNTIME) 注解。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页