关于spring 事务 和 AOP 管理事务和打印日志问题

1. <tx:annotation-driven /> 就是支持事务注解的(@Transactional) 。

​ 可以在server层总使用@Transactional,进行方法内的事务管理

配置
<!-- 事务注解-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:orcl</value>
</property>
<property name="username">
<value>xxx</value>
</property>
<property name="password">
<value>xxx</value>
</property>
<property name="maxActive">
<value>255</value>
</property>
<property name="maxIdle">
<value>2</value>
</property>
<property name="maxWait">
<value>120000</value>
</property>
</bean>

2. 在applicationContent.xml 引入 applicationContext-aop.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- aop 统一处理类 -->
<bean id="serviceLogging" class="com.xxx.hrzcyp.aop.ServiceLogging"/> <!-- aop 配置 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut id="serviceMethodLoggingPointcut" expression="execution(* com.xxx.service.impl.*.*(..))"/>
<!-- 定义 切面 order 的值越小,说明越先被执行 -->
<aop:aspect id="serviceMethodLoggingAspect" ref="serviceLogging" order="100">
<aop:before method="loggingMethodInvoked" pointcut-ref="serviceMethodLoggingPointcut"/>
<aop:after-throwing method="loggingServiceException" pointcut-ref="serviceMethodLoggingPointcut" throwing="throwable"/>
</aop:aspect>
</aop:config> </beans>

3. 用于aop处理日志和异常的java

package com.xxx.aop;

import org.aspectj.lang.JoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* AOP 统一处理异常和返回值
*/
public class ServiceLogging { private static Logger exceptionLogger = LoggerFactory.getLogger("ExceptionLogging");
private static Logger methodInvokeLogger = LoggerFactory.getLogger("MethodInvokeLogging"); /**
* 捕获Service层抛出的异常并做日志
*
* @param throwable 方法抛出的异常
*/
public void loggingServiceException(Throwable throwable) {
if (exceptionLogger.isErrorEnabled()) {
StringBuilder builder = new StringBuilder();
builder.append("cause:").append(throwable.getMessage());
builder.append("\n\tstackTrack:\n");
for (StackTraceElement stack : throwable.getStackTrace()) {
builder.append("\t\t");
builder.append(stack.toString());
builder.append("\n");
}
exceptionLogger.error(builder.toString());
}
} /**
* 记录Service方法的调用
*
* @param joinPoint 切入点
*/
public void loggingMethodInvoked(JoinPoint joinPoint) {
if (methodInvokeLogger.isDebugEnabled()) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
StringBuilder builder = new StringBuilder();
builder.append("调用方法[AOP切入点]:").append(methodName);
builder.append("\t参数:");
for (Object arg : args) {
builder.append(arg.toString());
}
methodInvokeLogger.debug(builder.toString());
}
} }

总结

以上工作做完后,只要有访问当 com.xxx.service.impl 目录下的所有方法。aop都会帮助我们答应访问的日志,如果加上 @Transactional 会将整个方法内的事务统一管理。有异常时也会通过aop抛出异常。

关于spring 事务 和 AOP 管理事务和打印日志问题的更多相关文章

  1. Spring整合JDBC以及AOP管理事务

    本节内容: Spring整合JDBC Spring中的AOP管理事务 一.Spring整合JDBC Spring框架永远是一个容器,Spring整合JDBC其实就是Spring提供了一个对象,这个对象 ...

  2. spring IOC DI AOP MVC 事务, mybatis 源码解读

    demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...

  3. Spring AOP 管理事务

    <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* ...

  4. Spring学习之AOP与事务

      一.概述 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续, ...

  5. spring中使用aop配置事务

    spring的事务配置有5种方式,这里记录其中的一种:基于tx/aop声明式事务配置 在之前spring aop介绍和示例这篇所附代码的基础上进行测试 一.添加save方法 1.在testDao类里添 ...

  6. spring Boot使用AOP统一处理Web请求日志记录

    1.使用spring boot实现一个拦截器 1.引入依赖: <dependency>   <groupId>org.springframework.boot</grou ...

  7. springboot aop + logback + 统一异常处理 打印日志

    1.src/resources路径下新建logback.xml 控制台彩色日志打印 info日志和异常日志分不同文件存储 每天自动生成日志 结合myibatis方便日志打印(debug模式) < ...

  8. spring是如何管理 事务的

    Spring提供的事务管理可以分为两类:编程式的和声明式的.编程式的,比较灵活,但是代码量大,存在重复的代码比较多:声明式的比编程式的更灵活方便.  1.传统使用JDBC的事务管理  以往使用JDBC ...

  9. Spring怎么管理事务?

    我们一般通过aop管理事务,就是把代码看成一个纵向有序的,然后通过aop管理事务,就好比增删改的时候需要开启一个事务,我们给他配置一个required,required就是有事务就执行事务,没有就给他 ...

随机推荐

  1. kindeditor实现ctrl+v粘贴word图片并上传

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  2. eclipse-jee-luna安装ADT-23.0.6出现的问题,以及解决办法

    刚安装好ADT-23.0.6,然后配置sdk路径(最新的版本android-22),然后创建一个新的Android Project; 对于布局界面会出现如下错误,导致无法显示布局界面: java.la ...

  3. 2019 Multi-University Training Contest 10

    目录 Contest Info Solutions C - Valentine's Day D - Play Games with Rounddog E - Welcome Party G - Clo ...

  4. gcc 带参数进行编译

    gcc -DYES -o helloyes hello.c 在hello.c中存在 #ifdefine YES ........

  5. 1635:【例 5】Strange Way to Express Integers

    #include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,a,lcm,now; bool flag; ...

  6. centos6中安装VMware Tools

    使用的是centos6.8,其他6版本方法大致相同. 1 .工具/原料1)安装过虚拟机软件的计算机2)linux操作系统 3)虚拟机配置VMware tools文件, 点击工具栏上的[虚拟机],然后选 ...

  7. 关于pl/sql打开后database为空的问题解决办法

    前置条件:楼主是在虚拟机里面进行安装oracle和pl/sql的,所以我的安装后,发现我的pl/sql显示的database是空的,当然楼主会检查我的tnsnames.ora是不是配置正确了,但是检查 ...

  8. 异步机制 - ReadFileEx(WriteFileEx)

    1 ReadFileEx定义 BOOL WINAPI ReadFileEx( __in HANDLE hFile, __out LPVOID lpBuffer, __in DWORD nNumberO ...

  9. PG数据库创建并执行存储过程批量插入数据

    记录一下PG数据库创建并执行存储过程批量插入数据的SQL: create or replace function addId() returns boolean AS $BODY$ declare i ...

  10. Wamp win10 1077error

    检查日志发现了1077错误 State of services:   The service 'wampapache64' is NOT started EXIT error code:1077 He ...