标准化的依赖注入注解
依赖注入是开发企业Java应用程序的一种流行技术,在依赖注入中,也叫做反转控制,一个组件指定它依赖的资源,一个注入器通常是一个容器,它为组件提供资源,虽然依赖注入有多种实现方式,但许多开发人员习惯使用注解来实现它。依赖注入在Java开发框架中得到了广泛使用,如Spring和Guice。遗憾的是,之前还没有基于注解构建依赖注入的标准方法,特别需要注意的是,Sping框架采用的基于注解的依赖注入方法与Guice采用的方法不一样。
随着Java EE 6的发布,这个问题得到了解决,随Java EE 6发布的JSR 330:Java依赖注入改变了这种境况,这个规范的目标是为依赖注入提供一个标准的,可扩展的API。
API由一套用在可注入类上的注解组成,这些注解包括:
@Inject:标识可注入的构造器,方法和字段;
@Qualifier:标识合法的注解,合法的是强类型键,它可以帮助区分相同类型的对象不同使用方法。例如,@Red Car和@Blue Car可以理解为相同类型的不同实例,在这个例子中,@Red和@Blue是合法的;
@Scope:标识注解范围;
@Singleton:标识注入器只实例化一次的类型。
例如,下面的类Stopwatch使用@Inject注解在TimeSource类上注入一个依赖;
final TimeSource timeSource;
this.TimeSource = TimeSource;
}
void start() { ... }
long stop() { ... }
}
依赖注入可以通过其它注入进行扩展,例如,假设你想创建一个StopwatchWidget类,它在Stopwatch类上有一个依赖,那么你可以象下面这样定义这个类:
@Inject StopwatchWidget(Stopwatch sw) { ... }
...
}
在响应中,注入器发现一个TimeSource对象,使用TimeSource对象构造一个Stopwatch对象,然后再使用Stopwatch对象构造一个StopwatchWidget对象。
JSR 330制定的标准化注解使可注入类可以跨框架迁移,你不用再为特定厂商的注解忙碌了。
注意在JSR 330上构建的CDI和向依赖注入增加的新功能,包括自动发现,可注入类的配置,在运行时定义新的可注入类的API,帮助与第三方框架集成。