Spring之aop(关键性概念,前置,后置,环绕,异常,过滤通知的用法及作用)

import java.lang.reflect.Method;

import java.util.Arrays;

import org.springframework.aop.MethodBeforeAdvice;

public class MyMethodBeforeAdvice implements MethodBeforeAdvice{

/**

* 前置通知(验证)

* @param method

* @param arg1

* @param target

* @throws Throwable

*/

public void before(Method method, Object[] arg1, Object target) throws Throwable {

String clzName = target.getClass().getName();

String MethodName = method.getName();

String params = Arrays.toString(arg1);

System.out.println(“买书评论前加系统日志:”+clzName+“.”+MethodName+“(”+params+“)”);

}

}

target:目标对象

method:被触发的目标对象的方法

arg1:目标对象的目标方法携带的参数

4,配置

在spring-context.xml中,配置目标

获取bookBiz,运行输出

IBookBiz iBookBiz = (IBookBiz) applicationContext.getBean(“bookBiz”);

运行只是输出,但是没有验证

因此我们需要调用MyMethodBeforeAdvice里面的方法

首先我们要在spring-context.xml中,配置前置通知

再配置 ,生成代理对象 (目标+通知)

<bean class=“org.springframework.aop.framework.ProxyFactoryBean”

id=“proxyFactoryBean”>

com.ltf.aop.biz.IBookBiz

myBefore

ref为目标

value为代理工厂生产的代理需要实现的接口列表,也是这里的目标的接口

获取proxyFactoryBean,运行输出

IBookBiz iBookBiz = (IBookBiz) applicationContext.getBean(“proxyFactoryBean”);

运行结果说明每一个常规业务代码的执行都调用了前置通知,并表明调用了什么方法,携带了什么参数

前置通知的价值在于:创建session,开启事务

三,后置通知

======

1.后置通知代码类(MyAfterRetruningAdvice implements AfterReturningAdvice

package com.ltf.aop.advice;

import java.lang.reflect.Method;

import java.util.Arrays;

import org.springframework.aop.AfterReturningAdvice;

public class MyAfterRetruningAdvice implements AfterReturningAdvice{

@Override

public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {

String clzName = target.getClass().getName();

String MethodName = method.getName();

String params = Arrays.toString(args);

System.out.println(“后置通知:”+clzName+“.”+MethodName+“(”+params+“)”+“返回:”+returnValue);

}

}

2,在spring-context.xml中,配置后置通知

因为目标对象相同,所以写在同一个list里面

myBefore

myAfter

3,运行结果如下

前置通知----》目标对象的业务代码----》后置通知

boolean  返回类型true

void   返回类型null

后置通知价值在于:速度提交,关闭session

四,环绕通知

======

1.环绕通知代码(MyMethodInterceptor implements MethodInterceptor

package com.ltf.aop.advice;

import java.lang.reflect.Method;

import java.util.Arrays;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class MyMethodInterceptor implements MethodInterceptor{

@Override

public Object invoke(MethodInvocation invocation) throws Throwable {

Object target = invocation.getThis();

Method method = invocation.getMethod();

Object[] args = invocation.getArguments();

String targetName = target.getClass().getName();

String methodName = method.getName();

String params = Arrays.toString(args);

System.out.println(“环绕通知:调用—”+targetName+“的方法—”+methodName+"  参数为–"+params);

Object returnValue = invocation.proceed();

System.out.println(“环绕通知:目标对象所调用的方法的返回值:”+returnValue);

return returnValue;

}

}

invocation:

其一:通过这一个参数可以获取到标对象、被触发的目标对象的方法、目标对象的目标

方法的携带的参数、返回值这四个参数;

其二:通过这行代码Object returnValue = invocation.proceed();(实际调用的时bookdao的buy方法)

invocation可以执行被代理的目标对象的业务方法**(相当于过滤器    chain.dofilter:放行)**

2,在spring-context.xml中,配置环绕通知

     

myInterceptor

3,运行结果

相当于调用业务代码,在前置通知后,后置通知前,产生两次

环绕通知价值在于:包含了前置通知和后置通知

五,异常通知

======

例如:加入订单插入失败,订单项肯定是不能插入的(要么同时成功,要么同时失败)

所以说处理失败的业务逻辑代码,可以将数据进行回滚;

异常通知一定要实现 ThrowsAdvice,且afterThrowing方法名不能修改;

1.异常通知代码(MyThrowsAdvice implements ThrowsAdvice

package com.ltf.aop.advice;

import org.springframework.aop.ThrowsAdvice;

import com.ltf.aop.exception.PriceException;

public class MyThrowsAdvice implements ThrowsAdvice{

public void afterThrowing(PriceException exception) {

System.out.println(“价格输入有误,购买失败,请重新输入”);

}

}

2,在spring-context.xml中,配置环绕通知


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后的话

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!

部分截图:
在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)**

img

最后的话

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!

部分截图:
[外链图片转存中…(img-VZr9tdya-1712688987643)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 29
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值