您的位置:首页 > 编程语言 > Java开发

Spring AOP+事务控制

2015-12-31 00:00 501 查看
摘要: 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"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: