<?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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--该配置文件的作用是用来配置 Spring 声明式事务管理。Spring声明式事务管理就是通过AOP技术来实现的，他提供了能做事务管理的切面，通过对切面的
    配置完成声明式事务管理-->


    <!--配置事务管理器的切面 DataSourceTransactionManager基于JDBC的方式来做事务管理的切面-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--这个配置的dataSource是applicationContext-dao.xml配置文件中的，手动点击关联一下该文件即可-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--配置事务的属性:事务的传播行为、事务的隔离级别....
    如果事务管理切面的bean没有设置id，默认是transactionManager，如果是默认的那么tx:advice就不需要设置transaction-manager属性。
    如果不是默认的就需要使用transaction-manager属性来指定事务管理切面-->
    <tx:advice id="myAdvice" transaction-manager="dataSourceTransactionManager">
        <tx:attributes>
            <!--让哪些方法受到什么样的事务控制  add*：是一种通配写法，表示以add开头的添加数据方法会受到事务控制   REQUIRED：必须收到事务控制
            事务隔离级别不配置时默认是按数据库的隔离级别来作为默认的隔离级别-->
            <tx:method name="add*" propagation="REQUIRED"/>
            <!--modify*以modify开头的更新操作的方法  propagation不配置时默认是REQUIRED-->
            <tx:method name="modify*" propagation="REQUIRED"/>
            <!--drop*以drop开头的删除数据的方法-->
            <tx:method name="drop*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <!--find*以find开头查询数据的方法 read-only="true"受到只读事务的控制，这样可以提高效率-->
            <tx:method name="find*" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!--配置事务的切点。表示让哪些方法收到事务控制-->
    <aop:config>
        <!--execution(* com.bjsxt.service.*.*(..)):使用execution表达式指定会被拦截的方法
           * com.bjsxt.service.*.*(..)：有无返回值都可以是service包下的所有接口和类中的方法并且是任意参数的方法都是被事务切面拦截并且做事务控制-->
        <aop:pointcut id="myPointcut" expression="execution(* com.bjsxt.service.*.*(..))"/>
        <!--advice-ref：指定用于拦截方法的事务属性  pointcut-ref：指定切点 -->
        <aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"/>
    </aop:config>

    <!--开启aspectj注解处理，配置记录用户登录日志的切面   proxy-target-class指定创建代理对象的方式。true：CJLIB的方式，默认是false使用jdk方式-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>