Spring AOP+事务控制
Spring AOP+事务控制
满小茂 发表于2年前
Spring AOP+事务控制
  • 发表于 2年前
  • 阅读 146
  • 收藏 11
  • 点赞 0
  • 评论 0
摘要: Spring AOP 在切入点加入事务

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"/>

 

共有 人打赏支持
粉丝 64
博文 115
码字总数 117706
×
满小茂
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: