springAOP

本文详细介绍了Spring中基于XML的AOP配置步骤,包括配置通知Bean、AOP配置、切面与通知类型。同时,展示了如何简化切入点表达式。此外,还阐述了Spring声明式事务控制的配置,包括事务管理、事务通知、通用切入点表达式以及事务属性的设定。通过XML配置,实现了对服务层方法的事务控制。
摘要由CSDN通过智能技术生成

spring中基于xml的AOP配置步骤

  1. 通知Bean也交给spring来管理
  2. 使用aop:config标签表明开始AOP配置
  3. 使用aop:aspect标签表示配置切面
    id属性:是给切面提供唯一的标识
    ref属性:是指定通知类bean的Id
  4. aop:aspect标签的内部使用对应标签来配置通知的类型
    我们现在的示例是让printLog方法在切入点方法执行之前,所以要用前置通知
    aop:before 表示配置前置通知
    method属性:用于指定Logger类中的哪个方法是前置通知
    pointcut属性:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强
    切入点表达式的写法:
    关键字:execution(表达式)
表达式:
       访问修饰符 返回值 包名.包名.包名......类名.方法名(参数列表)
       标准形式:public void com.csq.service.impl.AccountServiceImpl.saveAccount()
       访问修饰符可以省略
       返回值可以使用通配符,表示任意返回值
       * com.csq.service.impl.AccountServiceImpl.saveAccount()
       包名可以使用通配符,表示任意包,但是有几级包,就需要写几个
       * *.*.*.AccountServiceImpl.saveAccount()
       包名可以使用..表示当前包及其子包
       * *..AccountServiceImpl.saveAccount()
       类名和方法名都可以使用*来实现通配
       * *..*.*()
                   参数列表:
                       可以直接写数据类型
                       基本类型直接写名称        int
                       引用类型写包名.类名的方式  java.lang.String
                      可以使用通配符表示任意类型,但是必须有参数
                      可以使用..表示有无参数均可,有参数可以是任意类型
                   全通配写法:
                   * *..*.*(..)
                   * 
                   实际开发中切入点表达式的通常写法:
                   切到业务层实现类下的所有方法
                        * com.csq.service.impl.*.*(..)

所有的通知类型

<!-- 配置spring的Ioc,把service对象配置进来 -->
    <bean id="accountService" class="com.csq.service.impl.AccountServiceImpl"></bean>

    <!-- 配置logger类 -->
    <bean id="logger" class="com.csq.utils.logger"></bean>
        <!-- 配置AOP -->
        <aop:config>
            <!-- 配置切片 -->
            <aop:aspect id="logAdvice" ref="logger">
                <!-- 配置前置通知的类型,在切入方法执行前执行 -->
                <aop:before method="beforePrintLog" pointcut="execution(* *..*.*(..))"></aop:before>
                <!-- 配置后置通知的类型,在切入点方法正常执行之后执行,它和异常永远只能执行一个 -->
                <aop:after-returning method="afterReturningPrintLog" pointcut="execution(* *..*.*(..))"></aop:after-returning>
                <!-- 配置异常通知的类型,在切入点方法产生异常之后执行,它和后置永远只能执行一个 -->
                <aop:after-throwing method="afterThrowingPrintLog" pointcut="execution(* *..*.*(..))"></aop:after-throwing>
                <!-- 配置最终通知的类型,无论切入点方法是否正常执行它都会在后面执行 -->
                <aop:after method="afterPrintLog" pointcut="execution(* *..*.*(..))"></aop:after>
            </aop:aspect>
        </aop:config>

将其表达式进行改进,减少代码量

<!-- 配置spring的Ioc,把service对象配置进来 -->
    <bean id="accountService" class="com.csq.service.impl.AccountServiceImpl"></bean>

    <!-- 配置logger类 -->
    <bean id="logger" class="com.csq.utils.logger"></bean>
        <!-- 配置AOP -->
        <aop:config>
            <!-- 配置切入点表达式,id属性用于指定表达式的唯一标识,expression属性用于指定表达式的内容
                    此标签写在aop:aspect标签内部只能当前切面使用。
                    它还可以写在aop:aspect外面,此时就变成了所有切面可用(注,当放在外面的时候,因为导入约束问题,必须将其放在配置切面最前面)
                 -->
            <aop:pointcut id="pt1" expression="execution(* *..*.*(..))"/>
            <!-- 配置切片 -->
            <aop:aspect id="logAdvice" ref="logger">
                <!-- 配置前置通知的类型,在切入方法执行前执行 -->
                <aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>
                <!-- 配置后置通知的类型,在切入点方法正常执行之后执行,它和异常永远只能执行一个 -->
                <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>
                <!-- 配置异常通知的类型,在切入点方法产生异常之后执行,它和后置永远只能执行一个 -->
                <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>
                <!-- 配置最终通知的类型,无论切入点方法是否正常执行它都会在后面执行 -->
                <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>
                
            </aop:aspect>
        </aop:config>

spring配置声明式事务控制配置步骤(基于xml)

  1. 配置事务管理

  2. 配置事务通知

        此时我们需要导入事务的约束,tx名称空间和约束,同时也需要使用tx:advice标签配置事务通知
        属性:id:给事务通知一个唯一的标识
            transaction:给事务通知提供一个事务管理器引用
    
  3. 配置AOP中通用的切入点表达式

  4. 建立事务通知和切入点表达式的对应关系

  5. 配置事务的属性

        是在事务通知tx:advice标签内部
    
<!-- 配置事务管理 -->
    <bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
     </bean>
    <!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="transaction">
        <tx:attributes>
            <!-- 配置事务属性
                isolation:用于指定事务的隔离级别,默认值是DEFAULT,表示使用数据库的隔离级别
                propagation:表示指定事务的传播行为,默认值是REQUIRED,表示一定有事务,增删改的选择,查询方法可以选择SUPPORTS
                read-only:用于指定事务是否只读,只有查询方法才能设置为true,默认值为false,表示读写
                timeout:用于指定事务超时时间,默认值为-1,表示永不超时,如果指定了数值,以秒为单位
                rollback-for:用以指定一个异常类,当产生异常时,事务回滚,产生其他异常时,事务不回滚,没有默认值,就表示任何异常都回滚
                no-rollback-for:用于指定一个异常类,当产生异常时,事务不回滚,产生其他异常时事务回滚,没有默认值,便是任何异常都回滚
             -->
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!-- 配置aop -->
    <aop:config>
        <!-- 配置切入点表达式 -->
        <aop:pointcut id="pt1" expression="execution(* com.csq.service.impl.*.*(..))"/>
        <!-- 建立切入点表达式和事务通知的关系 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
    </aop:config>

spring配置声明式事务控制配置步骤(基于注释)

  1. 配置事务管理
  2. 开启spring对注解事务的支持
  3. 在需要支持事务的地方使用注释@Transactional
<!-- 配置事务管理 -->
    <bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
     </bean>
    <!-- 开启spring对注释事务的支持 -->
    <tx:annotation-driven transaction-manager="transaction"></tx:annotation-driven>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值