还不理解springAOP系列第二篇,带你学习spring的面向切面编程,通知和切点的表达式配置

3 篇文章 0 订阅
本文作为springAOP系列的第二篇,主要介绍如何配置和优化面向切面编程的各个通知类型,包括前置、后置、异常和最终通知。通过简化切点表达式,如`expression="execution(* * cn.com.lzxh.service.impl.*.*(..))"`,实现匹配impl包下所有类的所有方法,降低了配置复杂性。
摘要由CSDN通过智能技术生成

此案例基于第一篇而写,初学者可先看第一篇熟悉springAOP,再看此篇。

此篇文章只对spring配置文件做改进。

AOP操作中,通常会将前置通知,后置通知,异常通知和最终通知结合使用,如下例:

        <!-- 配置AOP -->
        <aop:config>
        	<!-- 配置切面 -->
        	<aop:aspect id="trans" ref="jdbcTrans">
	        	<!-- 配置通知:前置通知 -->
        		<aop:before method="beginTransaction" pointcut="execution(public void cn.com.lzxh.service.impl.UserServiceImpl.saveUser())"/>
        		<!-- 后置通知 -->
        		<aop:after-returning method="commitTransaction" pointcut="execution(public void cn.com.lzxh.service.impl.UserServiceImpl.saveUser())"/>
        		<!-- 异常通知 -->
        		<aop:after-throwing method="rollbackTransaction" pointcut="execution(public void cn.com.lzxh.service.impl.UserServiceImpl.saveUser())"/>
        		<!-- 最终通知 -->
        		<aop:after method="releaseTransaction" pointcut="execution(public void cn.com.lzxh.service.impl.UserServiceImpl.saveUser())"/>        		
        	</aop:aspect>
        </aop:config>
        <!-- 添加如下配置防止spring AOP配置混乱 -->
        <aop:aspectj-autoproxy proxy-target-class="true"/>

前置通知在业务代码执行之前执行,后置通知在业务代码之后执行,异常通知在业务代码发生异常时执行,最终通知在最后执行,以上程序的执行过程类似如下代码:

try {
			jt.beginTransaction();
			us.saveUser();
			//int i = 1 / 0;
			jt.commitTransaction();
		} catch (Exception e) {
			jt.rollbackTransaction();
			e.printStackTrace();
		} finally {
			jt.releaseTransaction();
		}

用上面的方法配置pointcut显得十分繁琐,可以进行简化,如下:

<!-- 配置AOP -->
        <aop:config>
        	<!-- 配置切面 -->
        	<aop:aspect id="trans" ref="jdbcTrans">
	        	<!-- 配置通知:前置通知 -->
        		<aop:before method="beginTransaction" pointcut-ref="point"/>
        		<!-- 后置通知 -->
        		<aop:after-returning method="commitTransaction" pointcut-ref="point"/>
        		<!-- 异常通知 -->
        		<aop:after-throwing method="rollbackTransaction" pointcut-ref="point"/>
        		<!-- 最终通知 -->
        		<aop:after method="releaseTransaction" pointcut-ref="point"/>
        		<!-- 切点配置 -->
        		<aop:pointcut id="point" expression="execution(public void cn.com.lzxh.service.impl.UserServiceImpl.saveUser())"/>
        	</aop:aspect>
        </aop:config>
        <!-- 添加如下配置防止spring AOP配置混乱 -->
        <aop:aspectj-autoproxy proxy-target-class="true"/>

将<aop:pointcut/>单独作为一个标签配置在切面内部,或切面外部,但是要注意,如果单独配置在切面外部,则只能配置在切面上面,不能配置在切面下面,如下:

<!-- 配置AOP -->
        <aop:config>
       		<!-- 切点配置 -->
       		<aop:pointcut id="point" expression="execution(public void cn.com.lzxh.service.impl.UserServiceImpl.saveUser())"/>
        	
        	<!-- 配置切面 -->
        	<aop:aspect id="trans" ref="jdbcTrans">
	        	<!-- 配置通知:前置通知 -->
        		<aop:before method="beginTransaction" pointcut-ref="point"/>
        		<!-- 后置通知 -->
        		<aop:after-returning method="commitTransaction" pointcut-ref="point"/>
        		<!-- 异常通知 -->
        		<aop:after-throwing method="rollbackTransaction" pointcut-ref="point"/>
        		<!-- 最终通知 -->
        		<aop:after method="releaseTransaction" pointcut-ref="point"/>
        	</aop:aspect>
        </aop:config>
        <!-- 添加如下配置防止spring AOP配置混乱 -->
        <aop:aspectj-autoproxy proxy-target-class="true"/>

另外,切点表达式的配置也可以简化,普通写法如下:<aop:pointcut id="point" expression="execution(public void cn.com.lzxh.service.impl.UserServiceImpl.saveUser())"/>,此配置中的切点只能是一个方法,可简化为如下所示:

expression="execution(* * cn.com.lzxh.service.impl.*.*(..))",该表达式代表任何修饰符修饰的,具有任何返回类型的,impl包下的所有类的所有方法都是切点,这些方法可以有任意个参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值