文档章节

Spring AOP+事务控制

满小茂
 满小茂
发布于 2015/12/31 11:10
字数 537
阅读 168
收藏 14

AOP事务控制  

applicationContext.xml配置文件

<!-- 开启AOP监听 只对当前配置文件有效 -->
<aop:aspectj-autoproxy expose-proxy="true"/>

<!--事务管理器配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
  </bean>
  
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
          <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
          <tx:method name="query*" propagation="REQUIRED" read-only="true" />
          <tx:method name="count*" propagation="REQUIRED" read-only="true"/>
          <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
          <tx:method name="list*" propagation="REQUIRED" read-only="true"/>
          <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<aop:config expose-proxy="true" proxy-target-class="true">
   <!-- 只对业务逻辑层实施事务 -->
   <aop:pointcut id="txPointcut" expression="execution(* com.usercare..service..*+.*(..)) or execution(* com.usercare..task..*+.*(..))"/>
   <aop:advisor id="txAdvisor" advice-ref="txAdvice" pointcut-ref="txPointcut"/>
 </aop:config>

  expression配置详情:

 execution(modifiers-pattern?ret-type-pattern   declaring-type-pattern?name-pattern(parm-pattern)  throws-pattern)

  • modifiers-pattern:方法的操作权

  • ret-type-pattern:返回值

  • declaring-type-pattern:方法所在的包

  • name-pattern:方法名

  • parm-pattern:参数名

  • throws-pattern:异常

  示例:项目可以按照这个方式来更改

  expression="execution(*  pp.business.*.*(..)) or execution(*  pp.business.impl.*.*(..))"

AOP面向切面编程

    连接点:可终端的点:1.方法前,2.方法后,3.异常抛出,4.方法前后

       切点: txPointcut

       通知:txAdvice  

       切面: txAdvisor

利用Spring 实现切面编程例子

(1) 创建切面

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ServiceAspect {

    private final Logger logger = LoggerFactory.getLogger(ServiceAspect.class);
    // 切入点表达式按需配置
    @Pointcut("execution(public * com.content.biz.aop.Aop*.*(..))")
    private void myPointcut() {
    }

    @Before("myPointcut()")
    public void before(JoinPoint joinPoint) {
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        logger.warn(className + "的" + methodName + "执行了");
        Object[] args = joinPoint.getArgs();
        StringBuilder log = new StringBuilder("入参为");
        for (Object arg : args) {
            log.append(arg + " ");
        }
        logger.warn(log.toString());
    }

    @AfterReturning(pointcut = "myPointcut()", returning = "returnVal")
    public void afterReturin(Object returnVal) {
        logger.warn("方法正常结束了,方法的返回值:" + returnVal);
    }

    @AfterThrowing(pointcut = "myPointcut()", throwing = "e")
    public void afterThrowing(Throwable e) {
        if (e!=null) {
            logger.error("通知中发现异常Exception", e);
        } else {
            logger.error("通知中发现未知异常", e);
        }
    }

    @Around("myPointcut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object result = null;
        long start=System.currentTimeMillis();
        result = proceedingJoinPoint.proceed();
        long endTime=System.currentTimeMillis();
        System.out.println("cost time:"+(endTime-start));
        return result;
    }
}

(2)监控方法

import org.aspectj.weaver.patterns.ExactAnnotationFieldTypePattern;
import org.springframework.stereotype.Component;

@Component
public class AopService {
    public  int sum(int a,int b) throws Exception {
        if(a<0){
            throw new Exception("a < 0");
        }
        return a+b;
    }
}

 

切点可以是注释了的方法或者类

@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")

切点的标识方法

使用注解,需要在SpringMVC配置文件中配置

<!-- 开启AOP监听 只对当前配置文件有效 -->
<aop:aspectj-autoproxy expose-proxy="true"/>

 

© 著作权归作者所有

共有 人打赏支持
满小茂
粉丝 65
博文 117
码字总数 126840
作品 0
成都
程序员
那些年,我们一起追的Spring

学无止境,但仍需及时总结。 自去年开始写作以来,写了一些关于Spring的文章,今天将它们汇总起来,一方面方便大家阅读,另一方面,也是一次小的复盘总结。 IOC 首先是Spring的IOC,也就是控...

SexyCode
08/14
0
0
spring 事务管理 1(使用spring的JdbcTemplate访问数据库)

持久层和事务的关系 dao层脱离事务也能操作数据库,事务是保证dao层数据操作的完整性(即原子性、一致性、隔离性、持久性,也即所谓的 ACID) 事务可以保证一组操作要么全成功,要么全部失败...

jiangtao
2012/01/06
0
2
Spring注解事务@Transactional

在声明式事务中我们比较常用的有两种:一种是基于tx和aop命名空间的xml文件。第二种是基于@Transactional的注解。两种都比较常用。前一种只要定义好规范就可以按照规范对方法进行命名。第二种...

u014231523
2017/02/27
0
0
在SSH框架中使用Spring的好处

在SSH框假中spring充当了管理容器的角色。我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句。Struts是用来做应用层...

空_明
2013/03/06
0
0
spring在SSH框架中的作用

从网上了搜了下sring 在ssh中起的作用,在百度知道上看到下面的回答,觉得简单移动,记录下来备查,原文地址: http://zhidao.baidu.com/link?url=JiONrax-Flkpi5hqsg1HQOrMm1Dk8U1WT88l5T0...

北方攻城师
2014/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day60-20180818-流利阅读笔记-待学习

钉钉:工作的归工作,生活的…也归工作? 毛西 2018-08-18 1.今日导读 你用过“钉钉”么?被公司要求使用钉钉的感受是如何的呢?这款阿里巴巴旗下的移动办公社交平台在弯道超车微信、为许多企...

aibinxiao
48分钟前
6
0
Kubernetes的HTTPS和证书问题,汇总

通过Kubernetes建立服务网站,需要干的事情和HTTPS和证书问题,汇总如下: 建立Nginx服务器 搞服务器第一步,Ubuntu 18.04设置静态IP 安装Nginx服务。 Kubernetes的deployment使用 创建服务,...

openthings
今天
2
0
php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
今天
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
今天
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部