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

当一个资源注解防止在一个字段或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方法提供符合测试所需资源的实现。

时间: 2024-08-03 21:16:41

JavaEE中的依赖性——依赖性注入的相关文章

JavaEE中的依赖性——依赖查找

关于依赖性管理我们要介绍的第一个策略就是依赖查找(dependency lookup).这种策略是JavaEE中传统形式的依赖性管理,这里可以看到JavaEE规范中的JNDI(Java Naming andDirectoryInterface)的身影.从名字就可以看出来这里解决依赖性是通过查找的方式. 就像上篇文章提到的,所要引用的资源是通过一对name与target对应的注解标识的.name用来表明此资源被依赖时候的名字,所以当资源注解放在类定义之上的时候需要为其起个名字.但是如果资源注解放在

JavaEE中的依赖性——声明依赖性

已下小结描述了一些JavaEE和EJB规范定义的资源注解.每条注解有一个可选的name特性以指定依赖性的引用名称.注解的其他特性特定于所需获取的资源类型. 引用持久化上下文 前面的章节演示了如何通过从Persistence类返回一个EntityManagerFactory,为持久化上下文创建一个实体管理器.在JavaEE环境中,@PersistenceContext注解可以用来声明一个持久化上下文上的依赖性,并且可以自动获取那个持久化上下文所需的实体管理器. 下面代码演示了如何使用@Persis

ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET Core应用中基于依赖注入的编程主要涉及到两个方面,它们分别是将服务注册到ServiceCollection中,和采用注入的方式利用ServiceProvider提供我们所需的服务.我们先来讨论ASP.NET Core应用中如何进行服务注册.[本文已经同步到<ASP.NET Core框架揭秘>之中

【Javaweb】修改Eclipse for JavaEE中新建Jsp的默认编码,避免每次新建都要改编码的问题

Eclipse for JavaEE中新建Jsp的默认编码是ISO-8859-1, 这让人非常苦恼,每次新建一个Jsp都要按Ctrl+F,把所有ISO-8859-1替换成utf-8,才可以. 具体如下图: 这都什么年代呢?连2010出版的Dreamweaver CS4的默认编码都是utf-8,已经不是Dreamweaver 8的gbk了.这都什么年代了,Eclipse for Javaee不国际化起来? 幸好这东西可以如下图修改,选择Windows->Perference,在弹出的窗口的输入框中

laravel中的构造函数依赖注入理解

laravel中的自动依赖注入是非常强大的,刚开始会疑惑为什么只要在构造函数中传入一个强制类型的变量(就是参数有类型限制)过去就行了? 通过查看源码即查阅资料发现其实这其中有一个php技术,就是反射技术,如果单纯看这个名词感觉好高大,其实就是有一种这样的类,就是能分析别人类的内部. 如果一个类的构造函数参数中有一个参数是另一个对象实例参数(就是一个强制类型的变量,这个强制类型就是一个类的对象) 所以在实例化对象之前,我用php反射技术类分析一下这个类,然后发现哦有个参数,这个参数是对象类型的,我

IOC容器-Autofac在MVC中实现json方式注入使用

在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使用autofac 首先在app_start中新建一个类包含以下方法 using System.Reflection; using Autofac; using Autofac.Integration.Mvc; using System.Web.Mvc; using Microsoft.Extensi

在spring项目中,普通类注入获取Bean,实现ApplicationContextAware接口

在平时spring项目中,某个不能注入Bean的项目中要获取Bean. @Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; public SpringUtil() { } public void setApplicationContext(ApplicationContext arg0

.net core控制台程序中使用原生依赖注入

原文:.net core控制台程序中使用原生依赖注入 如果要在程序中使用DbContext,则需要先在Nuget中安装Microsoft.EntityFrameworkCore.SqlServer using ConsoleApp1.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; using Console

避免在ASP.NET Core 3.0中为启动类注入服务

本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingEnvironment VS IHostEnvironent - .NET Core 3.0中的废弃类型 Part 3 - 避免在ASP.NET Core 3.0中为启动类注入服务(本篇) Part 4 - 将终端中间件转换为ASP.NET Core 3.0中的端点路由 Part 5 - 将集成测试的