关于依赖性管理我们要介绍的第一个策略就是依赖查找(dependency lookup)。这种策略是JavaEE中传统形式的依赖性管理,这里可以看到JavaEE规范中的JNDI(Java Naming andDirectoryInterface)的身影。从名字就可以看出来这里解决依赖性是通过查找的方式。

就像上篇文章提到的,所要引用的资源是通过一对name与target对应的注解标识的。name用来表明此资源被依赖时候的名字,所以当资源注解放在类定义之上的时候需要为其起个名字。但是如果资源注解放在一个字段或者一个setter方法之上那么将不需要为其起名字。一般情况下当使用依赖查找时,注解是放在类上的,并且显式的指定名称。将注解放置在一个字段或者setter方法上的使用方式下一篇博客再讨论。

指定name的作用是为调用者动态的解析引用提供便利。因为JNDI是JavaEE的规范所以所有的JavaEE应用服务器都会支持JNDI,而且对于每个组件来说都有其自己局部范围的JNDI命名上下文,称为环境命名上下文。当通过JNDI查找某个资源的时候就是在其环境命名上下文中根据预先定义好的名称进行查找。下面代码就掩饰了如何运用依赖查找为一个EJB组件进行服务的。

@Stateless
@EJB(name="audit", beanInterface=AuditService.class)
public class DepartmentServiceBean implements DepartmentService {private AuditService audit;@PostConstructpublic void init() {try {Context ctx = new InitialContext();audit = (AuditService) ctx.lookup("java:comp/env/audit");} catch (NamingException e) {throw new EJBException(e);}}public void performAudit() {audit.audit();}// ...
}

可以看到DeptServiceBean是一个会话bean。它使用@EJB注解声明了一个会话bean的依赖性,并把其命名为“audit”。@EJB注解的beanInterface元素引用了这个会话bean中需要的业务接口(AuditService)。在init方法中查找并得到了相应的资源,其中Context和IitialContext接口都是JNDI所定义的。Context接口的lookup()方法是用于从JNDI上下文检索对象的主要方法。为了找到命名为“audit”的引用,应用程序将查找名称“java:comp/env/audit”,并把结果转换到AuditService业务接口。添加到引用名称的前缀“java:comp/env”指示服务器应该使用环境命名上下问来搜索和发现引用。如果制定了错误的名称,那么当查询失败时将会抛出一个异常。

JNDI这种方式解决依赖性问题是通用的,只要符合JavaEE标准那么就可以使用这种查找的方式找到自己关心的接口(其实最终干活的是实现)但是这种查找资源的方法有些繁琐,类似于家里着火了再去买消防器材(为什么不提前买好呢?这是我们下一篇博客要说的)。

除了上面代码中使用Context接口的lookup方法,EJB还可以使用EJBContext接口(以及它的子接口)的lookup方法。这样就可以在程序运行时访问其中的服务(计时服务?)下面的代码就演示了这种方式的lookup方法。

@Stateless
@EJB(name="audit310", beanInterface=AuditService310.class)
public class DepartmentServiceBean310 implements DepartmentService310 {// use of resource dependency injection is covered later in the chapter@Resource SessionContext context;AuditService310 audit;public void setSessionContext(SessionContext context) {this.context = context;}@PostConstructpublic void init() {audit = (AuditService310) context.lookup("audit310");}public void performAudit() {audit.audit();}// ...
}

尽管网上很多人说相比JNDIAPI,EJBContext lookup()方法有优势。首先方法的参数恰好是在资源引用中指定的名称,不用再写第一部分代码中奇怪的字符串了。其次是关于异常的处理,显而易见第二种方式中异常已经不用我们手动处理了,因为第二种方法直接抛出运行时异常。其实在容器内部还是会像第一种方法那样去调用JNDI API去查找,但是容易已经为我们处理了异常,这就导致第二种方式看上去好像不用处理以上了似的。在笔者看来这两种方式都不是最适合我们的方式,就如同上面的举得例子,着火了才想着去买消防器材,为什么不提前买好呢?这就是我们下一篇博客要介绍的另一种解决依赖性的策略——依赖性注入。

JavaEE中的依赖性——依赖查找相关推荐

  1. java依赖什么意思,JavaEE中的依赖性——依赖查找

    关于依赖性管理我们要介绍的第一个策略就是依赖查找(dependency lookup).这种策略是JavaEE中传统形式的依赖性管理,这里可以看到JavaEE规范中的JNDI(Java Naming ...

  2. Spring依赖查找中的常见异常

    文章目录 BeansException的子接口 NoSuchBeanDefinitionException不存在要查找的Bean NoUniqueBeanDefinitionException 容器中 ...

  3. Java J2EE中的依赖查找

    个人看法:设计依赖查找的设计模式,是为了解耦. 单一类型依赖查找 JNDI javax.naming.Context#lookup JavaBeans java.beans.beancontext.B ...

  4. java中怎么判断依赖关系,在Maven 2中,我如何知道依赖性来自哪个依赖?

    问题 我想知道我的pom.xml中描述的哪个依赖项在我的目标目录中带来了传递依赖. 更确切地说,我的WEB-INF / lib目录中有库"poi-2.5.1-final-20040804.j ...

  5. 如何在SQL Server中创建SQL依赖关系图

    Deleting or changing objects may affect other database objects like views or procedures that depends ...

  6. spring自动装配依赖包_解决Spring自动装配中的循环依赖

    spring自动装配依赖包 我认为这篇文章是在企业应用程序开发中使用Spring的最佳实践. 使用Spring编写企业Web应用程序时,服务层中的服务量可能会增加. 服务层中的每个服务可能会消耗其他服 ...

  7. 解决Spring自动装配中的循环依赖

    我认为这篇文章是在企业应用程序开发中使用Spring的最佳实践. 使用Spring编写企业Web应用程序时,服务层中的服务量可能会增加. 服务层中的每个服务可能会消耗其他服务,这些服务将通过@Auto ...

  8. 参数依赖查找(ADL,Argument-dependent lookup)

    参数依赖查找(Argument-dependent lookup),又称 ADL 或 Koenig 查找,是一组于函数调用表达式查找非限定函数名的规则,包含对重载运算符的隐式函数调用.在通常非限定名称 ...

  9. idea如何打开pom引用依赖_IDEA使用Maven管理项目包,缺少pom文件中引入的依赖包...

    1. 说在前面 最近和其他项目团队合作过程中,由于使用 idea 进行开发,之前也没有接触过太多,本着记录分享的心态,虽有此文.主要说两点:第一,使用 maven 构建项目的过程中,在 pom 文件引 ...

  10. Spring 延迟依赖查找Bean

    Bean 延迟依赖查找接口 // 一个对象工厂 public interface ObjectFactory<T> {// 返回一个对象T getObject() throws Beans ...

最新文章

  1. 福利 | 50张第四届UBDC全域大数据峰会赠票大放送!
  2. python中的一些算法
  3. ssh源码编译安装mysql_总结源码编译安装mysql
  4. 【script】python自定义时间格式的几种情况
  5. GaussDB(DWS)应用实践丨负载管理与作业排队处理方法
  6. 硬件电路基础(2)RF 一些概念
  7. 小米C++开发笔试真题
  8. 京东评价系统海量数据存储设计
  9. 自定义ListVIew添加上下更多项
  10. 计算机突然无法连接网络,win7电脑突然不能上网的四种解决方案
  11. hist seg, find peaks, tps, pava单调拟合, isotonic-regression,REGULARIZED DISCRETE OPTIMAL TRANSPORT
  12. MouseJack:利用15美元的工具和15行代码控制无线鼠标和键盘
  13. 月份和星期的英语(请不要再弄错了)
  14. MMKV的简单实用一
  15. 正版求生之路联机服务器已满,求生之路2正版怎么联机 正版的联机方法
  16. 眼动数据分析(基于EyeLink眼动仪数据)
  17. 大富网络、拓尔思、恒信东方、金马游乐……上市公司如何布局元宇宙?丨2022元宇宙云峰会...
  18. android 自动 轮播图,Android-自定义View实现轮播图
  19. Java编程判断一个数是否是回文数
  20. L5W1作业3 用LSTM网络创作一首爵士小歌

热门文章

  1. google注册账号使用手机号提示注册此号码无法用于验证
  2. supp(),支持集理解
  3. Package zip is not available, but is referred to by another package.
  4. 移动硬盘提示数据错误循环冗余检查要怎么办啊
  5. php怎么联网,家庭宽带上网连接方式
  6. U盘被写保护?我来教你高级格式化
  7. 太励志!考研哈工大高数39分,但逆袭成为院士,做出诺奖级发现
  8. 如何在PC上显示Hololens的视野
  9. shell 脚本定时监控Linux内存清除缓存
  10. Component xxx does not have a method xxx to handle event xxx