1.什么是AOP
AOP就是通过动态为项目中某些类在运行过程中动态创建代理对象,在对象中完成附加功能,保证在处理业务时更加专注于自己的业务逻辑开发。
有以下几个概念:
1.通知(Advice)——给目标方法添加额外操作称之为通知,也可以称为增强
2.连接点(Joinpoint)——就是可以增强的地方(方法的前后某个阶段)
3.切入点(Pointcut)——实际增强的地方
4.切面(Aspect)——封装了通知和切入点用来横向插入的类
5.代理(Proxy)——将通知应用到目标类动态创建的对象
6.织入(Weaving)——将切面插入到目标从而生成代理对象的过程
2.springboot使用aop
切面类代码:
@Component
@Aspect //切面类注解
@Order(2)
public class AsceptTest {
@Pointcut("execution(* com.study.service.UserService.eat(*))")
private void Myeat(){
};
//前置通知。value匹配规则,也就是指定拦截的切入点(方法)
// @Before(value = "execution(* com.study.service.UserService.eat(*))") // execution匹配某些方法效率,whithin匹配某些类(中的所有方法)
@Before(value = "Myeat()")
public void before(JoinPoint joinPoint){
System.out.println("当前方法名: "+joinPoint.getSignature().getName());
System.out.println("当前执行方法参数: "+joinPoint.getArgs()[0]);
System.out.println("目标对象target: "+joinPoint.getTarget());
System.out.println("前置增强——保姆做饭");
}
//后置通知
// @After(value = "execution(* com.study.service.UserService.eat(*))")
@After("Myeat()")
public void after(JoinPoint joinPoint){
System.out.println("当前方法名: "+joinPoint.getSignature().getName());
System.out.println("当前执行方法参数: "+joinPoint.getArgs()[0]);
System.out.println("目标对象target: "+joinPoint.getTarget());
System.out.println("后置增强——保姆洗碗");
}
//环绕通知
@Around(value = "execution(* com.study.service.UserService.out())" )
public Object round(ProceedingJoinPoint joinPoint) throws Throwable {
//环绕增强必须要获取ProceedingJoinPoint参数,
System.out.println("当前方法名: "+joinPoint.getSignature().getName());
// System.out.println("当前执行方法参数: "+joinPoint.getArgs()[0]); 目标对象没参数不可获取
System.out.println("目标对象target: "+joinPoint.getTarget());
System.out.println("环绕增强——保安开门"); //目标方法执行前
Object proceed = joinPoint.proceed(); //执行目标方法
System.out.println("环绕增强——保安关门"); //目标方法执行后
return proceed; //返回目标方法执行结果
}
//异常通知
@AfterThrowing(value = "within(com.study.service.UserService+)",throwing="e")
public void ex(JoinPoint joinPoint,Exception e){
System.out.println("出错了"+e.getMessage());
}
//返回通知,方法正常返回则生效
@AfterReturning(value = "within(com.study.service.UserService+)",returning="result")
public void ex(JoinPoint joinPoint,Object result){
System.out.println(joinPoint.getSignature().getName()+ ":返回通知生效");
System.out.println("返回了"+result);
}
}