1.基于注解的AOP编程的开发步骤
- 原始对象
- 额外功能
- 切⼊点
- 组装切面
/*
通过切⾯类 定义了 额外功能定义了@Around
定义了 切⼊点 @Around("execution(*login(..))")
@Aspect 切⾯类*/
@Aspect
public class MyAspect {
@Around("execution(* login(..))")
/* @Around("execution(* login(..))") 等价于
<aop:config>
<aop:pointcut id="pc" expression="execution(* *(..))"/>
<!-- 组装-->
<aop:advisor advice-ref="arround" pointcut-ref="pc"/>
</aop:config>*/
public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("- ---aspect log ------");
Object ret = joinPoint.proceed();
return ret;
}
}
上述9-12行和之前的实现MethodInterceptor接口类似,如下代码所示
/*
1. 额外功能
public class MyArround implements MethodInterceptor{
public Object invoke(MethodInvocation invocation){
System.out.println("- ---MethodInterceptor log ------");
Object ret = invocation.proceed();
return ret;
}
}*/
配置文件:
<bean id="userService" class="com.dy.basic.aspect.UserServiceImpl"/>
/*
切⾯:
1. 额外功能
2. 切⼊点
3. 组装切⾯*/
<bean id="arround" class="com.dy.basic.aspect.MyAspect"/>
//告知Spring基于注解进⾏AOP编程
<aop:aspectj-autoproxy/>
2.细节
1.切入点复用
切⼊点复⽤:在切⾯类中定义⼀个方法,方法上⾯@Pointcut注解 通过这种⽅式,定义切⼊点表达式,后续更加有利于切⼊点复⽤。
@Aspect
//切面类
public class MyAspect {
@Pointcut("execution(* login(..))")
public void myPointcut(){}
// 添加切入点复用方法后,将@Around("execution(* login(..))")改为 @Around(value = "myPointcut()")
@Around(value = "myPointcut()")
public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("- ---aspect log ------");
Object ret = joinPoint.proceed();
return ret;
}
}
2.动态代理的创建方式
AOP底层实现 2种代理创建⽅式
1. JDK 通过实现接⼝ 做新的实现类⽅式 创建代理对象
2. Cglib通过继承⽗类 做新的⼦类创建代理对象
默认情况 AOP编程 底层应⽤JDK动态代理创建⽅式
如果切换Cglib呢?
1. 注解AOP开发
//告知Spring基于注解进⾏AOP编程
将 <aop:aspectj-autoproxy/>改成
<aop:aspectj-autoproxy proxy-target-class="true" />
2. 传统的AOP开发切换Cglib
<aop:config>
<aop:pointcut id="pc" expression="execution(* *(..))"/>
# 组装
<aop:advisor advice-ref="arround" pointcut-ref="pc"/>
</aop:config>
改成
在aop:config标签中添加属性proxy-target-class="true" 如下:
<aop:config proxy-target-class="true">
</aop>
本系列文章从Spring5原理开始深入浅出,从工厂特性=>依赖注入–IOC=>AOP编程=>Spring事务=>纯注解开发。本文来自观看B站孙帅Spring教程后做的笔记。持续更新…