欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于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抛出异常。