Spring之aop
前言
今天为大家分享的是Spring中的aop,面向切面编程中的几大通知!
关于是spring项目的搭建以及相关插件的安装,请看我之前的博客:
1、在eclipse中添加Spring的插件
2、spring的初步介绍与学习
1、aop概念
aop是面向切面编程的一部分!
2、aop中的常见属性
属性名 | 相关解释 |
---|---|
连接点(Joinpoint) | 方法的调用、异常的抛出 |
目标(target) | 完成具体的业务逻辑 |
通知(Advice) | 完成切面编程 |
代理(Proxy) | 代理=目标+通知 |
切入点(PointCut) | 多个连接点的集合 |
适配器(Advisor) | 适配器=通知+切入点 |
3、项目结构
3.1、如何实现aop
1、目标对象只负责业务逻辑代码
2、通知对象负责AOP代码, 这两个对象都没有AOP的功能,只有代理对象才有!
3.2、通知中需要实现的接口
通知名称 | 需实现的接口 |
---|---|
前置通知 | MethodBeforeAdvice |
后置通知 | AfterReturningAdvice |
环绕通知 | MethodInterceptor |
异常通知 | ThrowsAdvice |
3.3、代理工厂Bean
代理对象全路径的获取方式
ProxyFactoryBean用来创建一个代理对象,在一般情况下它需要注入以下三个属性
proxyInterfaces:代理应该实现的接口列表(List)
interceptorNames:需要应用到目标对象上的通知Bean的 名字。(List)
target:目标对象 (Object)
前置通知
概念:在连接点之前执行的通知 !
前置通知代码展示
package com.wangqiuping.advice;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.springframework.aop.MethodBeforeAdvice;
/**
* 买书、评论前
* @author wangqiuping
* 2020年8月11日 下午3:10:58
*/
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(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+")");
}
}
其中method表示方法名,target表示目标对象,params表示目标对象方法所执行的参数!
后置通知
概念:在连接点正常执行后的通知
案例:在线购书系统中,要求不修改BookBizImpl代码的情况下增加如下功能:
对买书的用户进行返利:每买本书返利3元。(后置通知)
即:每调用一次buy方法打印:“[销售返利][时间]返利3元。”
后置通知代码展示
package com.wangqiuping.advice;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.springframework.aop.AfterReturningAdvice;
public class MyAfterReturningAdvice 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+")"+"\t 目标对象方法调用后的返回值"+returnValue);
}