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即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值