Spring AOP+事务控制
2015-12-31 00:00
501 查看
摘要: Spring AOP 在切入点加入事务
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
(2)监控方法
切点可以是注释了的方法或者类
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
切点的标识方法
使用注解,需要在SpringMVC配置文件中配置
<!-- 开启AOP监听 只对当前配置文件有效 -->
<aop:aspectj-autoproxy expose-proxy="true"/>
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"/>
相关文章推荐
- Java多线程实现方式
- java线程状态
- 八皇后问题(经典回溯法)
- java 静态导入 import static
- day05-----------java 语言基础(基础语法)(传智视频)
- JAVA设计模式单例模式(懒汉式和饿汉式)
- java Executors介绍
- 给jdk写注释系列之jdk1.6容器(9)-Strategy设计模式之Comparable&Comparator接口
- java 多线程机制简单总结
- Java集合框架
- 插入排序
- Java枚举类型的小应用
- Spring MVC集成Tiles使用方法
- win10 jdk配置环境变量时的注意事项
- springmvc(1)DispatcherServlet源码简单解析
- Java的接口与内部类
- javamail使用IMAP协议收取gmail邮件
- java 枚举
- java使用jdbc创建新的数据库
- RxJava练习(2)--时间间隔输出字符串