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底层原理(动态代理)”

Spring5学习笔记 — “Spring AOP底层原理(动态代理)”

Spring学习笔记③