JSR-330
是 Java
的依赖注入标准。定义了如下的术语描述依赖注入:
- A 类型依赖 B类型(或者说 B 被 A 依赖),则 A类型 称为”依赖(物) dependency”
- 运行时查找依赖的过程,称为”解析 resolving“依赖
- 如果找不到依赖的实例,称该依赖是”不能满足的 unsatisfied”
- 在”依赖注入 dependency injection”机制中,提供依赖的工具称为”依赖注入器 dependency injector”
在标准中, 依赖是类型而不是实例/对象; 在程序中(运行时), 需要的是依赖的实例.
标准对依赖注入的使用进行了定义, 但是对实现和配置未定义。Java EE
包javax.inject
对应该标准。其中也仅定义了依赖注入的使用(即通过注解),同样也未定义依赖注入的配置方式和实现方式。实际上,依赖配置方式和实现方式由”依赖注入器“定义和实现。注入器的配置方式常见有XML
、注解
、DSL
、Java 代码
; 实现方式有反射和代码生成。依赖注入器在构建时,会验证所有依赖是否满足(通过识别注解来得知其依赖),在运行时为类注入其需要的依赖的实例。(因为依赖注入器对依赖的识别过程就是对注解的处理,所以依赖注入器也是注解处理器)。
javax.injects
包
该包提供了如下5个注解(Inject、Qualifier、Named、Scope、Singleton)和1个接口(Provider)。
@Inject
标识某个类中,需要由注入器注入的类成员(被标识的成员称为”可注入的”)。
使用规则
- 可用于注解构造器、字段、方法这些类成员(对成员是静态与否、最好是public的)
- 每个类只能有一个构造器可以被标记可注入;空构造器可以不用@Inject注解。
- 可注入的字段不能为 final 的
- 可注入的方法不能为 abstract 的
注入器的依赖注入顺序
- 构造器 > 字段 > 方法
- 父类 > 子类
- 一个类的两个可注入字段或其他成员无注入顺序
另外的四个注解对依赖注入进一步进行配置。
@Qualifier 和 @Named
其中,@Qualifiery用于创建限定器。限定器是一个自定义的注解,可注解字段或方法的参数,用于限制可注入的依赖的类型。限定器注解必须被 @Qualifier 和 @Retention(RetentionPolicy.RUNTIME) 注解。