spring学习笔记AOP
Posted 拐柒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring学习笔记AOP相关的知识,希望对你有一定的参考价值。
AOP
AOP就是在不改变云游业务逻辑的情况下,增强横切逻辑。横切逻辑代码旺旺是权限校验代码、日志代码、事务控制代码、性能监控代码。
连接点(Joinpoint)
方法开始时、结束时、正常运行完毕时等这些特殊的时机点,成为连接点。
项目中的每个方法都有连接点,连接点是一种候选点。
切入点(pointcut)
指定AOP思想想要影响的具体方法是哪些。描述感兴趣的方法。
通知/增强(advice)
1、横切逻辑
2、方位点,即连接点的一个升级,在某一些连接点上加入横切逻辑,这些连接点就叫做方位点,描述的是具体的特殊时机。
切面
切面是上述概念的一个综合,切面=切点(锁定方法)+方位点(锁定方法中的特殊时机)+ 横切逻辑。
这些概念,目的就是为了锁定要在那个地方插入什么样的横切逻辑代码
AOP xml开发
applicationContext.xml
<!--横切逻辑bean-->
<bean id="logUtils" class="com.lagou.edu.utils.LogUtils"></bean>
<!--进行aop相关的xml配置-->
<!--使用config表明开始aop配置,在内部配置切面aspect-->
<aop:config>
<aop:aspect id="logAspect" ref="logUtils">
<aop:pointcut id="pt1"
expression="execution(public void com.lagou.edu.service.impl.TransferServiceImpl.transfer(String, String, int))"/>
<!--前置增强-->
<aop:before method="beforeMethod" pointcut-ref="pt1"></aop:before>
<!--aop:after最终通知,无论如何都回执行-->
<!--aop:after-returning正常执行通知-->
<!--aop:throwing异常通知-->
<!--aop:around环绕通知-->
<aop:around method="aroundMethod" pointcut-ref="pt1"></aop:around>
</aop:aspect>
</aop:config>
LogUtils
public void beforeMethod(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
System.out.println(arg);
}
System.out.println("业务逻辑开始执行之前");
}
public void afterMethod(){
System.out.println("业务逻辑结束执行执行");
}
public void exceptionMethod(){
System.out.println("异常时执行");
}
public void successMethod(){
System.out.println("正常执行");
}
public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕通知中的before");
Object proceed=null;
try {
//相当于method.invoke,控制原有方法是否执行
proceed = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
} catch (Exception e) {
System.out.println("环绕通知中的exception");
e.printStackTrace();
}finally {
System.out.println("环绕通知中的after");
}
return proceed;
}
AOP xml+注解开发
applicationContext.xml
//用于开启注解
<aop:aspectj-autoproxy/>
LogUtils
@Component
@Aspect
public class LogUtils {
@Pointcut("execution(* com.lagou.edu.service.impl.TransferServiceImpl.*(..))")
public void pt1(){}
@Before("pt1()")
public void beforeMethod(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
System.out.println(arg);
}
System.out.println("业务逻辑开始执行之前");
}
@After("pt1()")
public void afterMethod(){
System.out.println("业务逻辑结束执行执行");
}
@AfterThrowing("pt1()")
public void exceptionMethod(){
System.out.println("异常时执行");
}
@AfterReturning(value = "pt1()",returning ="retVal")
public void successMethod(Object retVal){
System.out.println("正常执行");
}
// @Around("pt1()")
public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕通知中的before");
Object proceed=null;
try {
//相当于method.invoke,控制原有方法是否执行
proceed = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
} catch (Exception e) {
System.out.println("环绕通知中的exception");
e.printStackTrace();
}finally {
System.out.println("环绕通知中的after");
}
return proceed;
}
}
AOP 纯注解开发
在启动类上添加@EnableAspectJAutoProxy即可
以上是关于spring学习笔记AOP的主要内容,如果未能解决你的问题,请参考以下文章
Spring5学习笔记 — “Spring AOP的概念相关术语”
Spring5学习笔记 — “Spring AOP的概念相关术语”
#展望我的2022Flag#Spring框架使用AspectJ实现AOP前置通知学习笔记
Spring5学习笔记 — “Spring AOP底层原理(动态代理)”