JavaEE中的依赖性——依赖性注入

来源:互联网 发布:钢结构工程量计算软件 编辑:程序博客网 时间:2024/05/01 14:43

当一个资源注解防止在一个字段或setter方法之上时,将会发生两件事。首先,就像放置在bean类之上一样声明资源引用(类似于上文中的代码示例),而且当创建组件时将把资源名称绑定到环境命名上下文。第二,该服务器将为您自动进行依赖性查找,并把结果设置到实例化的类中。

自动超找一个资源并将它设置到类中的过程称之为依赖性注入(dependency injection)因为据说服务器将把解析的依赖性注入类中。这种技术,其中一项通常称作控制反转(inversion of control),消除了手动从JNDI环境上下文中查找资源的负担。依赖性注入被认为是应用程序开发的最佳实践,不仅是因为它减少JNDI查找的需要(和相关的服务定位器模式),而且还因为它简化了测试。类中没有任何的JNDI API代码依赖于应用服务器运行时环境,因此,bean类可以在一个单元测试中直接实例化。开发人员可以手动提供所需的依赖性并测试试待检查类的功能,而不用担心如何围绕JNDI API进行工作。

字段注入

第一种形式的依赖性注入称之为字段注入(field injection)。注入依赖性到字段意味着,服务器在环境命名上下文查找依赖之后,它直接把结果分配给类的注解字段。下面代码重新审视了来自上面文章的代码示例,并演示了@EJB注解,这次把结果注入audit字段。我们之前演示的所有目录接口代码中,bean的业务方法可以假设audit字段中保留了AuditService bean的引用。

(代码)

字段注入当然最容易实现,本书的例子中使用这种形式完全是为了节省空间。字段注入唯一需要考虑的是:如果您正在计划单元测试,那么您需要添加一个setter方法或使得这个字段是您的单元测试可访问的,以手动满足依赖性。尽管自由字段是合法的,但是如果没有可访问的方法,那么将需要令人不快的黑客手段来设置它们的值。如果您希望单元测试不必添加一个setter方法,那么请考虑字段注入的包(package)的范围。

在上一节曾提到,当把一条资源注解放在一个字段或setter方法之上时,将引用自动生成的一个名称,为了完整起见,这里将描述此名称的格式,但是您不太可能有很多机会来使用它。生成的名称完全限定为类名,后跟一条正斜杠,然后是字段或属性的名称。这意味着如果AuditService bean位于persistence.session包中,那么上面程序中引用的注入EJB在“persistence.session.AuditService/audit”名称之下的环境命名上下文中将是可访问的。对资源注解指定name元素将覆盖此默认值。

setter注入

第二种形式的依赖性注入,称为setter注入(setterinjection),它涉及注解一个setter方法而不是类的字段。当服务器解析引用时,它将利用查询的结果调用带注解的setter方法。下面代码最后一次审视了上面的代码以演示setter注入的使用。

(代码)

这种样式的注入允许使用私有字段,但同样也适用于单元测试。每个测试可以简单地实例化bean类,并通过调用setter方法以手动执行该依赖性注入,通常会为该setter方法提供符合测试所需资源的实现。

1 0