关于spring 事务 和 AOP 管理事务和打印日志问题
程序员文章站
2022-07-01 16:25:20
关于spring 事务 和 AOP 管理事务和打印日志问题 1. 就是支持事务注解的(@Transactional) 。 可以在server层总使用@Transactional,进行方法内的事务管理 配置 2. 在applicationContent.xml 引入 applicationCont ......
关于spring 事务 和 aop 管理事务和打印日志问题
1. 就是支持事务注解的(@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 源码总结