当前位置: 移动技术网 > IT编程>开发语言>Java > 关于spring 事务 和 AOP 管理事务和打印日志问题

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

2019年08月12日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网