aop-获取连接点的信息

实现类代码

package org.atguigu.spring.annotation;

import org.springframework.stereotype.Component;

@Component
public class CalculatorImpl implements Calculator{
    @Override
    public int add(int i, int j) {
        int result = i + j;
        System.out.println("内部方法 result = " + result);
        return result;
    }

    @Override
    public int sub(int i, int j) {
        int result = i - j;
        System.out.println("内部方法 result = " + result);
        return result;
    }

    @Override
    public int mul(int i, int j) {
        int result = i * j;
        System.out.println("内部方法 result = " + result);
        return result;
    }

    @Override
    public int div(int i, int j) {
        int result = i / j;
        System.out.println("内部方法 result = " + result);
        return result;
    }
}

切面代码

package org.atguigu.spring.annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
@Aspect
public class LoggerAspect {

    @Before("execution(* org.atguigu.spring.annotation.CalculatorImpl.*(..))")
    public void beforeAdviceMethod(JoinPoint joinPoint){
        //获取连接点所对应方法的签名信息
        Signature signature = joinPoint.getSignature();
        //获取连接点所对应方法的参数
        Object[] args = joinPoint.getArgs();

        System.out.println("连接点的方法名:"+signature.getName());
        System.out.println("连接点方法的参数:"+ Arrays.toString(args));
    }

    @Around("execution(* org.atguigu.spring.annotation.CalculatorImpl.*(..))")
    public Object aroundAdviceMethod(ProceedingJoinPoint joinPoint) throws Throwable {

        Object[] args = joinPoint.getArgs();
        //将第一个参数x10
        args[0] = (int)args[0] * 10;
        //注意,如果调用joinPoint.proceed()方法,则修改的参数值不会生效,必须调用joinPoint.proceed(Object[] args)
        Object result = joinPoint.proceed(args);
        System.out.println("环绕通知");
        //如果这里不返回result,则目标对象实际返回值会被置为null
        return result;
    }
}

 

测试代码

package org.atguigu.spring;

import org.atguigu.spring.annotation.Calculator;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestCase {

    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("aop-annotation.xml");
        Calculator calculator = context.getBean(Calculator.class);
        calculator.add(1,2);

    }
}

 

posted @ 2023-03-12 22:14  Mr_sven  阅读(38)  评论(0编辑  收藏  举报