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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后的话
无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!
部分截图:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)**
最后的话
无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!
部分截图:
[外链图片转存中…(img-VZr9tdya-1712688987643)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!