AOP入门
AOP导入-问题
解决共性代码的抽取问题,相同的代码抽取完成之后使用AOP动态增强。
AOP相关概念【总】
通知
被增强的逻辑,或者后期要加入的代码。
目标对象
被增强的对象
代理对象
增强后的对象
连接点
目标对象中的所有方法
切入点
目标对象中被增强的方法
切面
通知+切点
AOP快速入门-解决方法耗时问题
AOP快速入门-执行流程【总结】
如果进行了AOP配置,那么容器中存放的是代理对象,注入的也是代理对象
导入Aspect依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
AOP进阶
切入点表达式
execution
使用切点表达式匹配要增强的方法。
@Around(“execution(* com.itheima.service.impl.PersonServiceImpl.*(…))”)
@annotation
根据指定注解匹配要增强的方法
【第一步】自定义注解
【第二步】在要增强的类或者方法上使用注解
【第三步】在通知方法注解中使用@annotation注解指定要匹配的注解全类名
@Around(“@annotation(com.itheima.anno.MyAnno)”)
抽取公共切入点表达式
@Pointcut("execution(* com..impl.PersonServiceImpl.save(..))")public void save(){}
通知类型
@Around:环绕通知,一种手动调用目标对象方法的通知方法
@Before:前置通知,在目标方法执行之前执行
@AfterReturning :后置通知,在目标方法执行之后且没有异常时执行
@AfterThrowing :异常通知,在目标方法执行之后且出现异常时执行
@After :最终通知,在目标方法执行之后无论是否出现异常都执行
连接点
前置/后置/异常/最终通知方法中使用JoinPoint对象获取连接点信息。
@Before(“execution(* com.itheima.service.impl.PersonServiceImpl.*(…))”)
public void before(JoinPoint jp){…}
通知顺序
默认切面类类名的字符串先后顺序执行,但是可以通过@Order(数值)定义优先级。值越小,优先级越高。
扩展拔高
代理方式
jdk动态代理
代理对象和目标对象实现相同的接口
cglib动态代理(默认)
代理对象是目标对象的子类对象
通知失效
业务层方法中调用了本类的方法就会通知实现,原因是本类中方法调用不是使用代理对象调用,而是使用目标对象(this)调用。
解决:在类中注入代理对象,在配置文件中运行set方式循环依赖
AOP练习-统计每个方法的执行次数