`
学会做人
  • 浏览: 118527 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring中的事务管理器(Aspectj)

阅读更多

Spring 的AOP确实强大!

但是AOP在实际的工作运用中,无外乎就是权限的验证(当然动态代理模式也可以轻松实现)!日志的处理!

但用的最多的还是事务的管理!

而在Spring中的事务管理又分为:A、编程式事物处理

                                               优点:可以精确的控制事物的边界

                                               缺点是:实现不是很优雅!因为在每一个需事务管理的业务逻辑中都需要调用

TransactionTemplate  的execute()方 法,导致了业务逻辑和系统业务的交叉!

                                              B、声明式事物:采用了AOP优雅的解决了编程式事物的缺点


(在中小型项目中用A比较好,事物处理比较单一;大型项目,事物处理比较多的话,用B比较好)



而我们其实在工作中利用注解的方式还要简单些!所以我利用Aspectj加AOP也解决了编程式事物处理的缺点!

以下是我的测试案例


步骤: 1、配置Spring 的Datasource ,TransactionManager,TransactionTemplate

           2、定义标注@interface 

           3、定义Aspect(@Aspect,@around),定义切入点

           4、在Spring中配置Aspect就是配置一个简单ben





****************************************************************



package com.lovo.annotation;

public class AService {
  public void createBook(){
   System.out.println("@@@@@@@@@@@");
  }
  public static void main(String[] args) {
AService a = (AService)SpringUtil.getContext().getBean("a");
a.createBook();
}
}




*****************************************************************************


package com.lovo.annotation;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
/**
* 增加书的业务操作方法
* @author Administrator
*
*/
public class BookService {
//事物模板
private TransactionTemplate trans;
//数据源
private DataSource dataSource;

public TransactionTemplate getTrans() {
  return trans;
}

public void setTrans(TransactionTemplate trans) {
  this.trans = trans;
}

public DataSource getDataSource() {
  return dataSource;
}

public void setDataSource(DataSource dataSource) {
  this.dataSource = dataSource;
}
//添加事物属性值
@Trans(TransactionTemplate.PROPAGATION_REQUIRED)

/**
  * 业务方法
  */
    public void createBook(){
  //创建jdbc模板
     JdbcTemplate jdbc = new JdbcTemplate(dataSource);
     //执行插入数据库操作
     jdbc.update("insert into T_BOOK values(5522,'Spring3 in Action',3)");
    
    }
}




*******************************************************************************


package com.lovo.annotation;
/**
* 测试类
* @author Administrator
*
*/
public class Client {
  public static void main(String[] args) {
BookService bookServ = (BookService)SpringUtil.getContext().getBean("bookService");
bookServ.createBook();
  }
}
*************************************************************************

package com.lovo.annotation;


/**
* 定义一个注释类
*/
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.ElementType;

@Target({ElementType.METHOD})
@Retention(RUNTIME)
public @interface Trans {
int value();
}

**********************************************************************

package com.lovo.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 定义一个加载配置文件的单例工具类。
*
* @author Administrator
*
*/
public class SpringUtil {

private SpringUtil(){
 
}
  private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

  public static ApplicationContext getContext(){
   return context;
  }
}

**************************************************************

package com.lovo.annotation;

import java.lang.reflect.Method;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

@Aspect
public class TransactionAspect {
   // 拦截对目标对象方法调用 
@Around("execution(@com.lovo.annotation.Trans * *.*(..))")

public Object inTransaction(final ProceedingJoinPoint pjp) {
  //获得事物模板
        TransactionTemplate trans = (TransactionTemplate)SpringUtil.getContext().getBean("transactionTemplate");
        // 获取连接点的方法签名对象
        MethodSignature sig = (MethodSignature) pjp.getSignature();
        // 连接点对象的方法  
  Method method = sig.getMethod();
        // 返回@trans的注释对象 
  Trans antrans = (Trans) method.getAnnotation(Trans.class);
  //设定事物的属性值
  trans.setPropagationBehavior(antrans.value());
 
  //执行事务的方法
        return trans.execute(new TransactionCallback(){
   public Object doInTransaction(TransactionStatus ts) {
    Object result = null;
    try {
     result=pjp.proceed();
    } catch (Throwable e) {
     ts.setRollbackOnly();
     e.printStackTrace();
    }
    return result;
   }
        
        });
 

}
}


***************************************************************************

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"      
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:aop="http://www.springframework.org/schema/aop"
               xsi:schemaLocation=       
                   "http://www.springframework.org/schema/beans        
                   http://www.springframework.org/schema/beans/spring-beans.xsd        
                   http://www.springframework.org/schema/aop        
                   http://www.springframework.org/schema/aop/spring-aop.xsd">
 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
 <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
   <property name="transactionManager">
    <ref bean="transactionManager"/>
   </property>
 </bean>
 <bean id="transactionManager"
       class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource">
         <ref local="dataSource"/>
       </property>
       </bean>
 <bean id="dataSource"
       class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName">
         <value>oracle.jdbc.driver.OracleDriver</value>
       </property>
       <property name="url">
         <value>jdbc:oracle:thin:@localhost:1521:ORCL</value>
       </property>
       <property name="username"><value>scott</value></property>
       <property name="password"><value>wl</value></property>
 </bean>
 <bean id="bookService" class="com.lovo.annotation.BookService">
   <property name="dataSource">
     <ref bean="dataSource"/>
   </property>
   <property name="trans">
     <ref bean="transactionTemplate"/>
   </property>
   </bean>
   <bean id="transAspect" class="com.lovo.annotation.TransactionAspect"></bean>
 </beans>

分享到:
评论

相关推荐

    spring基于AspectJ实现事务控制

    spring通过aspectj来实现事务控制

    Spring2.X以AspectJ 式AOP 配置事务

    博文链接:https://log-cd.iteye.com/blog/213445

    spring事务管理几种方式代码实例

    spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...

    spring_tx_aspectj方式源码

    Spring框架的事务管理之基于AspectJ的XML方式.Spring框架的事务管理之基于AspectJ的注解方式

    Spring+Hibernate事务管理

    Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...

    aspectj-1.6.10.jar,aspectjweaver-1.6.9.jar,spring事务所用到的jar

    aspectj-1.6.10.jar,aspectjweaver-1.6.9.jar,spring3.+事务所用到的jar

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)

    spring框架手动提交事务,jdbctample

    注意:只是jdbc自带的jdbctample,不能 用于整合mybatis框架的事务,我整合了,事务不起作用!!!! 按老师的说法是基于xml方式,但不准确,因为也用到了注解 &lt;aop:aspectj-autoproxy proxy-target-class="true"&gt;...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    spring杂谈 作者zhang KaiTao

    1.1 Spring事务处理时自我调用的解决方案及一些实现方式的风险 1.2 我对AOP的理解 1.3 Spring开闭原则的表现-BeanPostProcessor的扩展点-1 1.4 我对IoC/DI的理解 1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成...

    spring2.5学习PPT 传智博客

    22.Spring集成的jdbc编码和事务管理 23.使用Spring注解方式管理事务与传播行为详解 24.使用Spring配置文件实现事务管理 25.搭建和配置Spring与Hibernate整合的环境 26.Spring集成的Hibernate编码与测试 27....

    Spring攻略PDF版

     第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 高级主题  第13章 Spring ...

    Spring攻略中文版PDF

     第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 高级主题  第13章 Spring ...

    Spring 2.0 开发参考手册

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    Spring+3.x企业应用开发实战光盘源码(全)

     第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。  第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    内含有mybatis 拦截器实现的分页代码,spring 的事务和aop 测试、和反射工具类

Global site tag (gtag.js) - Google Analytics