文档章节

Spring AOP+事务控制

满小茂
 满小茂
发布于 2015/12/31 11:10
字数 537
阅读 177
收藏 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"/>

 

© 著作权归作者所有

共有 人打赏支持
满小茂
粉丝 73
博文 119
码字总数 131754
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

《netty入门与实战》笔记-05:netty内置的channelHandler

Netty 内置了很多开箱即用的 ChannelHandler。下面,我们通过学习 Netty 内置的 ChannelHandler 来逐步构建我们的 pipeline。 ChannelInboundHandlerAdapter 与 ChannelOutboundHandlerAdap...

Funcy1122
23分钟前
1
0
帧动画(wifi信号动态动画)

准备六张wifi不同信号强度的素材图片,复制到drawable目录中 在drawable目录中新建frame文件,并编写代码 <animation-list xmlns:android="http://schemas.android.com/apk/res/android"> ...

lanyu96
43分钟前
2
0
快速get到学习Linux操作系统的点

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能够运行主要的UNIX工具软件、网络协议和应用程序。它支持32位...

问题终结者
51分钟前
1
0
Django2 model操作数据库

1.将应用(如learn)添加到安装应用配置中 将我们新建的应用(learn)添加到 settings.py 中的 INSTALLED_APPS中,告诉Django有这么一个应用。 INSTALLED_APPS = [ 'django.contrib.ad...

MichaelShu
54分钟前
2
0
SpringBoot基础篇Bean之条件注入之注解使用

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 bean的条件注入,除了前面一篇博文中介绍的通过@Conditional注解配合Condition接口的实现之外,还提供了更多简化的注解使用方式,省略了自己...

小灰灰Blog
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部