科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用EJB 3.0简化Java开发(一)3

使用EJB 3.0简化Java开发(一)3

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  在接下来的两篇文章中,你将会学到使用EJB3.0中的POJO编程模型来开发更简单,更强壮的企业级Java应用。本文将阐述如何使用EJB 3.0 注释来开发藕合松散的POJO应用及容器服务器如何管理POJO

来源:IT专家网 2008年5月13日

关键字: 开发 简化 EJB 3.0 java

  • 评论
  • 分享微博
  • 分享邮件
 EJB 3.0,对任何POJO,提供了一个简单的和优雅的方法来解藕服务对象和资源。使用@EJB注释,你可以将EJB存根对象注入到任何EJB 3.0容器管理的POJO中。如果注释用在一个属性变量上,容器将会在它被第一次访问之前赋值给它正确的值。下面的例了演示了怎样把CalculatorBean无状态session bean的存根注入到CalculatorMDB MDB类中。

public class CalculatorMDB implements MessageListener {

  @EJB Calculator cal;
 
  // Use the cal variable
  // ... ...
}

  注释如果被用在JavaBean风格的setter方法上时,容器会在属性第一次使用之前,自动地用正确的参数调用bean的setter方法。下面的片断演示了这是如何做的:

public class CalculatorMDB implements MessageListener {

  Calculator cal;
 
  @EJB
  public void setCal (Calculator cal) {
    this.cal = cal;
  }
 
  // Use the cal variable
// 使用cal变量
  // ... ...
}

  除@EJB注释之外,EJB 3.0也支持@Resource注释来注入来自JNDI的任何资源。下面的例子中,我演示了如何注入服务器端默入的TimerService和SessionContext对象,也演示了如何注入来自JNDI的命名数据库和JMS资源。

@Resource
TimerService tms;

@Resource
SessionContext ctx;

@Resource (name="DefaultDS")
DataSource myDb;

@Resource (name="ConnectionFactory")
QueueConnectionFactory factory;

@Resource (name="queue/A")
Queue queue;

  此外,你也可以把一个容器管理的持久化管理器(也就是,EntityManager-类似于Hibernate session对象)注入到EJB 3.0 POJO中。

  把容器服务交给POJO

  除了管理生命周期和访问藕合松散的服务对象外,EJB 3.0通过简单的注释也为POJO提供了运行时刻服务。

  事务

  最有用的容器服务可能就是事务管理服务,当应用出现失败或异常时,它保证了数据库的完整性。你可以简单地将为一个POJO方法申明它的事务属性。这样容器就可以在合适的上下文中运行这个方法。举例来说,下面的代码申明了容器在运行updateExchangeRate()时必须创建一个新的事务。当这个方法退出时提交事务。实际上,所有在updateExchangeRate()中被调用的方法都在此事务中运行,除非有特别申明。在updateExchangeRate()中的数据库操作要么全部成功,要么全部失败。

@Stateless
public class CalculatorBean implements Calculator {

  // ... ...

  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void updateExchangeRate (double newrate) throws Exception {
    // Update the database in a loop.
// 在循环中更新数据库
    // ... ...
    // The operations in the loop must all be successful or
    // the database is not updated at all.
// 循环中的操作必须全部成功或者根本不更新。
  }
}

安全

  容器也提供了安全服务来进行用户认证和根据用户规则来限制对POJO的访问。对每一个POJO来说,你可以通过使用@SecurityDomain注释为它指定一个安全域, 安全域告诉容器到哪里去找密码和用户角色列表。JBoss中的other域表明文件是classpath中的users.propertes和roles.properties。这样,对每一个方法来说,我们可以使用一个安全限制注释来指定谁可以运行这个方法。比如,下面的例子,容器对所有试图调用addFund()的用户进行认证,只允许拥有AdminUser角色的用户实际运行它。如果你没有登录或者没有以管理员的身份登录,一个安全意外将会抛出。

@Stateless
@SecurityDomain("other")
public class CalculatorBean implements Calculator {

  @RolesAllowed({"AdminUser"})
  public void addFund (String name, double growthrate) {
    // ... ...
  }

  @RolesAllowed({"AdminUser"})
  public void addInvestor (String name, int start, int end) {
    // ... ...
  }

  @PermitAll
  public Collection <Fund> getFunds () {
    // ... ...
  }
 
  // ... ...

  @RolesAllowed({"RegularUser"})
  public double calculate (int fundId, int investorId,
                                       double saving) {
    // ... ...
  }
}

  通用拦截器

  事务和安全服务都可以被看作是容器管理的运行时刻拦截器。容器拦截了对EJB存根的调用,并在其上应用事务上下文或进行安全限制。

  在EJB 3.0中,你可以自己写拦截器来扩展容器服务。使用@AroundInvoke注释,你可以将任意bean方法作为拦截器方法在任意bean方法之前和之后运行。下面的例子中,log()方法是一个拦截器,它计算和记录了其它bean方法的执行时间:

@Stateful
public class CalculatorBean implements Calculator {

  // Bean methods that are to be intercepted by "log()"
  // bean方法将被log()方法拦截
//
  // ... ...
 
  @AroundInvoke
  public Object log (InvocationContext ctx)
                            throws Exception {

    String className = ctx.getBean().getClass().getName();
    String methodName = ctx.getMethod().getName();
    String target = className + "." + methodName + "()";

    long start = System.currentTimeMillis();
    System.out.println ("Invoking " + target);
    try {
      return ctx.proceed();
    } catch(Exception e) {
      throw e;
    } finally {
      System.out.println("Exiting " + target);

      cal.setTrace(cal.getTrace() + "
" +
                   "Exiting " + target);
      long time = System.currentTimeMillis() - start;
      System.out.println("This method takes " +
                          time + "ms to execute");
    }
  }
}

 下一步?

  在第一部分中,我大致地讨论了EJB 3.0基于POJO的编程模型和如何在EJB 3.0中开发藕合松散的服务组件。在第二部分中,我会讨论EJB 3.0的另一个主要的概念:可管理的POJO持久性。


 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章