`
suhuanzheng7784877
  • 浏览: 702482 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47708
社区版块
存档分类
最新评论

JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----6

阅读更多

BMT就是Bean自己管理事务,这种方式就是以硬编码的方式在Bean中自己通过JTA接口自己维护事务代码,开始事务、提交事务、回滚事务都需要自己以硬编码的方式来维护,这种方式就是一个优点,灵活,不过EJB规范不建议使用此策略来管理事务,而是采用CMT

代码如下:

package ejb.sessionBean.impl;

  

/**

 * bean代码自管理事务

 *

 * @author liuyan

 *

 */

@Stateless

@TransactionManagement(TransactionManagementType.BEAN)

public class BMTServerEAOImpl implements BMTServer {

 

    private DataSource dataSource;

 

    @Resource

    private UserTransaction userTransaction;

 

    public BMTServerEAOImpl() throws NamingException {

       Context context = new InitialContext();

       dataSource = (DataSource) context.lookup("java:/jbossdemo");

    }

 

    @Override

    public void insert() throws Exception {

 

       Connection connection = null;

 

       Statement statement = null;

 

       try {

 

           // 开始事务

           userTransaction.begin();

 

           connection = dataSource.getConnection();

 

           statement = connection.createStatement();

 

           String insert1 = "insert into person values(17,'一线生')";

 

           String insert2 = "insert into person values(16,'冷剑白狐')";

 

           statement.executeUpdate(insert1);

 

           statement.executeUpdate(insert2);

           // 事务手工提交

           userTransaction.commit();

           statement.close();

           connection.close();

       } catch (Exception e) {

           System.out.println("事务回滚~~");

           userTransaction.rollback();

           e.printStackTrace();

       }

    }

}

测试代码不再赘述,执行后JBoss控制台如下,数据库也没添加任何数据。

15:18:47,568 INFO  [STDOUT] 事务回滚~~

15:18:47,638 ERROR [STDERR] com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '16' for key 'PRIMARY'

把代码稍微修改一下,将重复的主键修改一下

String insert2 = "insert into person values(18,'冷剑白狐')";

执行后数据库成功插入新的纪录,如下

 

1.      EJB拦截器

EJB也支持简单的自定义AOP类和横切方法,还是直接看例子吧。

AOP类——MyInterceptor

 

package aop;

import java.lang.reflect.Method;

import javax.interceptor.AroundInvoke;

import javax.interceptor.InvocationContext;

 

/**

 * 自定义的拦截器

 *

 * @author liuyan

 *

 */

public class MyInterceptor {

    @AroundInvoke

    public Object log(InvocationContext ctx) throws Exception {

       System.out.println("日志开启");

       Object object = ctx.getTarget();

       System.out.println("拦截的SessionBean实例:" + object);

       Method method = ctx.getMethod();

       System.out.println("拦截的SessionBean方法:" + method.getName());

       Object objectReturn = ctx.proceed();

       System.out.println("日志记录结束");

       return objectReturn;

    }

}

所谓横切方法,实际上就是代理执行,那么在此AOP类中就需要调用被拦截的方法。Object objectReturn = ctx.proceed();就是执行被拦截目标类的方法。如果没有此行代码,那么目标方法将不会执行。

下面看一下被横切,拦截的目标类——HelloAopServerEAOImpl

 

package aop.server.impl;

import javax.ejb.Stateless;

import javax.interceptor.ExcludeClassInterceptors;

import javax.interceptor.Interceptors;

import aop.MyInterceptor;

import aop.server.HelloAopServer;

 

@Stateless

@Interceptors(MyInterceptor.class)

public class HelloAopServerEAOImpl implements HelloAopServer {

 

    @Override

    @ExcludeClassInterceptors

    public void noAop() {

       System.out.println("noAop()");

 

    }

 

    @Override

    public String sayHello() {

       return "hello AOP";

    }

 

    @Override

    public void sayWelcome() {

       System.out.println("sayWelcome()");

    }

}

在目标类中使用@Interceptors(MyInterceptor.class)注解代表使用此类被作为AOP的目标所拦截。而此类的方法上加上@ExcludeClassInterceptors注解则代表该方法不会被拦截。

客户端测试代码如下:

 

    public void test01() throws Exception {

       Context context = init();

       HelloAopServer helloAopServer = (HelloAopServer) context

              .lookup("HelloAopServerEAOImpl/remote");

       helloAopServer.sayHello();

       helloAopServer.sayWelcome();

       helloAopServer.noAop();

    }

执行后,服务器控制台信息如下

 

15:40:16,812 INFO  [STDOUT] 日志开启

15:40:16,812 INFO  [STDOUT] 拦截的SessionBean实例:aop.server.impl.HelloAopServerEAOImpl@1dc88c7

15:40:16,812 INFO  [STDOUT] 拦截的SessionBean方法:sayHello

15:40:16,812 INFO  [STDOUT] 日志记录结束

15:40:16,822 INFO  [STDOUT] 日志开启

15:40:16,822 INFO  [STDOUT] 拦截的SessionBean实例:aop.server.impl.HelloAopServerEAOImpl@1dc88c7

15:40:16,822 INFO  [STDOUT] 拦截的SessionBean方法:sayWelcome

15:40:16,822 INFO  [STDOUT] sayWelcome()

15:40:16,822 INFO  [STDOUT] 日志记录结束

15:40:16,831 INFO  [STDOUT] noAop()

可以证明:预期该拦截的sayHello()sayWelcome()都被拦截了,而noAop()并没有被拦截到。

  • 大小: 49.9 KB
分享到:
评论

相关推荐

    JavaEE5学习笔记07-Web层与EJB集成总结

    ### JavaEE5学习笔记07-Web层与EJB集成总结 #### 一、JavaEE5框架中的Web层与EJB集成概述 在JavaEE5(即Java Platform, Enterprise Edition 5)中,Web层与EJB(Enterprise JavaBeans)的集成是构建企业级应用的...

    JavaEE5学习笔记02-JNDI与RMI

    在JavaEE环境中,RMI经常与EJB结合使用,尤其是无状态SessionBean,因为它们不需要维持客户端的会话状态,适合RMI的轻量级通信模式。 当一个EJB被标记为远程接口时,它可以通过RMI在不同 JVM(Java Virtual ...

    javaee思维导图版笔记-吉林大学

    "javaee思维导图版笔记-吉林大学" 本笔记主要涵盖了Java EE的基础知识,包括Servlet、JSP、JNDI、JPA等方面的内容。 一、Servlet概述 Servlet是Java EE中的一种服务器端组件,用于处理HTTP请求并返回响应。...

    javaee学习笔记

    - **会话Bean**:在整个用户会话期间保持,用于跟踪用户状态。 - **应用Bean**:在整个应用程序范围内共享,用于全局数据。 **自定义标签(Custom Tags)**提供了一种扩展JSP语法的方式,通过定义标记库描述符(TLD...

    JavaEE2017最新版基础班学习笔记

    包括会话Bean(Session Beans)负责业务逻辑,实体Bean(Entity Beans)作为持久化对象,以及消息驱动Bean(Message-Driven Beans)处理JMS消息。 6. **JMS (Java Message Service)**:JMS允许应用程序之间异步通信...

    Java/JavaEE 学习笔记

    Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、...

    JavaEE基础笔记.zip

    分为会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-driven Beans),分别处理业务逻辑、持久化数据和消息通信。 5. **JMS(Java Message Service)**:JMS是JavaEE的消息中间件接口...

    JavaEE学习笔记

    EJB是JavaEE的核心,提供了三种类型的Bean:会话Bean(Session Beans)处理业务逻辑,实体Bean(Entity Beans)代表持久化数据,消息驱动Bean(Message-Driven Beans)处理消息队列。Spring框架则以其依赖注入和面向...

    J2EE学习笔记(J2ee初学者必备手册)

    第四章 Session Bean(会话Bean).....322 第五章 消息驱动Bean(MDB).........327 EJB3.0.....329 第一章 EJB3.0 Foundation...............329 第二章 Session Bean........................330 第三章 消息驱动Bean...

    达内培训笔记

    - **EJB(Enterprise JavaBeans)**:分为会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-driven Beans),用于实现业务逻辑和持久化数据。 - **JPA(Java Persistence API)与ORM*...

    javaWeb学习笔记+狂神说

    EJB是Java企业级应用的组件模型,分为会话bean、实体bean和消息驱动bean。它们提供了一种在分布式环境中构建可复用的、事务处理的服务器端组件的方法。虽然现代JavaEE应用更多采用轻量级框架如Spring,但了解EJB的...

    JAVA-EE-master (4).zip

    EJB分为三种类型:会话bean(Session Beans)处理客户端请求,实体bean(Entity Beans)代表持久化的业务对象,消息驱动bean(Message-Driven Beans)用于处理JMS消息。 4. **JMS**:Java Message Service允许在...

Global site tag (gtag.js) - Google Analytics