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

关于依赖性管理我们要介绍的第一个策略就是依赖查找(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;

    @PostConstruct
    public 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;
    }

    @PostConstruct
    public void init() {
        audit = (AuditService310) context.lookup("audit310");
    }

    public void performAudit() {
        audit.audit();
    }

    // ...
}

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

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

JavaEE中的依赖性——依赖查找的相关文章

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

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

JavaEE中的依赖性管理

无论你多么伟大你都不可能独立完成一项伟大的任务,JavaEE组件也是一样的,没有那个组件可以独立完成所有的任务.一个组件在工作的时候往往需要其他资源的帮助,那么在寻求帮助的过程中就涉及到这次我们要说的"依赖性管理"的问题.比如一个简单的会话bean它需要借用JDBC的数据源持久化数据,再比如一个消息驱动Bean需要往JMS消息队列中传递消息.这里都涉及到如何在组件中获取服务器中的资源的问题. 和现实生活中一样你需要火警.匪警疑惑120帮忙那么只需要拨打电话号码就可以了,但是前提是你首先

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

当一个资源注解防止在一个字段或setter方法之上时,将会发生两件事.首先,就像放置在bean类之上一样声明资源引用(类似于上文中的代码示例),而且当创建组件时将把资源名称绑定到环境命名上下文.第二,该服务器将为您自动进行依赖性查找,并把结果设置到实例化的类中. 自动超找一个资源并将它设置到类中的过程称之为依赖性注入(dependency injection)因为据说服务器将把解析的依赖性注入类中.这种技术,其中一项通常称作控制反转(inversion of control),消除了手动从JND

【SSH系列】深入浅出spring IOC中三种依赖注入方式

spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控制什么?依赖注入和控制反转是一样的概念吗?接触新的知识,小编的脑袋中全是大大的问号,不过没有关系,今天这篇博文,小编主要来简单的介绍一下在spring IOC中依赖注入的方法. 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性.我们可以从以下几个方面理解: a.参与者都

OSGI中的service依赖关系管理

众所周知,对于高动态高可扩展的应用,OSGI是一个非常好的平台.但是,也因此增加了复杂性,开发中对service的依赖变得复杂.这也是service的关系管理成为OSGI中一个非常重要的部分,我们来看看OSGI中service依赖关系管理的方式.篇幅原因,只关注发展历程,不具体介绍每个方式的详细实现细节. 概括的说,目前在OSGI中主要有以下几种service依赖关系管理的方法: 1. Service listener 2. Service binder 3. Dependency Manage

解决vs code中golang插件依赖安装失败问题

解决vs code中golang插件依赖安装失败问题 Installing github.com/nsf/gocode SUCCEEDED Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED Installing github.com/ramya-rao-a/go-outline FAILED Installing github.com/acroca/go-symbols FAILED Installing golang.org/x

浅析Spring IOC、依赖注入(DI)和依赖查找(DL)

为什么要用IOC? 第一:对象的实例化不是一件简单的事情,比如对象的关系比较复杂,依赖关系往往需要程序员去维护,这是一件非常头疼的事. 第二:解耦,由容器去维护具体的对象 第三:托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分过程交给容器,应用程序则无需去关心类是如何完成代理的 控制反转(Inverse of Control) 控制反转即IoC(Incersion of Control),从字面上理解就是控制反转,将对在自身对象中的一个

Spring(05)IoC 依赖查找

目录 Spring(05)IoC 依赖查找 1. 依赖查找的今世前生 2. 单一类型依赖查找 3. 集合类型依赖查找 4. 层次性依赖查找 5. 延迟依赖查找 6. 安全依赖查找 7. 内建可查找的依赖 8. 依赖查找中的经典异常 9. 面试题精选 Spring(05)IoC 依赖查找 Spring 核心编程思想目录:https://www.cnblogs.com/binarylei/p/12290153.html 1. 依赖查找的今世前生 单一类型依赖查找 JNDI:javax.naming.

javascript中通过className灵活查找元素 例如我们要把根据class来进行修改样式

原文:javascript中通过className灵活查找元素 例如我们要把根据class来进行修改样式 一.背景:一个表单中,要修改一些li中有class=box的样式,将它的background设置为red红色.一般的做法是我们可以先找到父级元素 ,然后由父级元素找到所有相关tagName,最后,来一个if判断,如果class属性为box,则修改之 var oUl = document.getElementById("ul1");