Spring的AOP配置--XML文件配置

首先导入aop的包和相关依赖包

在配置文件中创建增强方法的bean,随后配置aop的相关内容

   <bean id="userService" class="com.aop.service.UserServiceImpl"></bean>
   <bean id="logger" class="com.aop.logger.LoggerTest"></bean>
   <aop:config>
        <!--配置切入点表达式-->
	    <aop:pointcut expression="execution(* *..*.*(..))" id="log"></aop:pointcut>
			<!--配置切面-->
			<aop:aspect id="logAop" ref="logger">
                                <!--前置通知-->
				<aop:before method="beforePrintLog" pointcut-ref="log"></aop:before>
				<!--后置通知-->
				<aop:after-returning method="afterReturingPrintLog" pointcut-ref="log"></aop:after-returning>
				<!--异常通知-->
				<aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="log"></aop:after-throwing>
				<!--最终通知-->
				<aop:after method="afterPrintLog" pointcut-ref="log"></aop:after>
				
			</aop:aspect>
		</aop:config>

配置切入点表达式时,表达式一定要加execution()  全通配表达式* *..*.*(..)

下面的是相关类的代码

//	前置通知
	public void beforePrintLog() {
		System.out.println("前置通知beforePrintLog执行了");
	}

//	后置通知
	public void afterReturingPrintLog() {
		System.out.println("后置通知afterReturingPrintLog执行了");
	}

//	异常通知
	public void afterThrowingPrintLog() {
		System.out.println("异常通知afterThrowingPrintLog执行了");
	}

//	最终通知
	public void afterPrintLog() {
		System.out.println("最终通知afterPrintLog执行了");
	}

 此处根据你是否要测试异常来选择注释掉 int = 1/0;

	@Override
	public void findAllUser() {
		int i = 1/0;
		System.out.println("执行了查询操作");
	}

环绕通知比较特殊,不能像之前其他通知一样配置,以下配置会导致切入点方法不执行

	public Object aroundPrintLog() {
		System.out.println("环绕通知aroundPrintLog执行了");
		return null;




<aop:around method="aroundPrintLog" pointcut-ref="log"></aop:around>

由动态代理可知,环绕通知就是invoke方法,但环绕通知里没有明确的切入点方法调用
      解决:使用Spring提供的ProceedingJoinPoint,该接口可以作为环绕通知方法的参数使用
      该接口有一个方法proceed(),此方法等同于method.invoke(),就是明确调用切入点方法

	public Object aroundPrintLog(ProceedingJoinPoint pjp) {
		Object result = null;
		try {
			System.out.println("前置通知执行了==========");
			
			result = pjp.proceed();
			
			System.out.println("后置通知执行了==========");
			
		} catch (Throwable e) {
			System.out.println("异常通知执行了==========");
			e.printStackTrace();
		}finally {
			System.out.println("最终通知执行了==========");
		}
		return result;
	}

 

此文章为我个人的学习笔记总结,自用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值