假设我们的业务类是一个简单的计算器类,它有两个方法:add和subtract,我们希望在这两个方法执行前后记录一下日志。以下是不使用注解定义切点和通知的示例:

// 切点,选择需要增强的方法
public interface Calculator {
    int add(int a, int b);
    int subtract(int a, int b);
}

// 通知,增强逻辑
public class LoggingAdvice implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("Before method " + invocation.getMethod().getName());
        Object result = invocation.proceed();
        System.out.println("After method " + invocation.getMethod().getName());
        return result;
    }
}

// 代理类,创建代理对象
public class CalculatorProxy implements Calculator {
    private Calculator calculator;
    private LoggingAdvice advice;

    public CalculatorProxy(Calculator calculator, LoggingAdvice advice) {
        this.calculator = calculator;
        this.advice = advice;
    }

    @Override
    public int add(int a, int b) {
        // 创建代理对象
        ProxyFactory proxyFactory = new ProxyFactory(calculator);
        // 添加通知
        proxyFactory.addAdvice(advice);
        // 获取代理对象
        Calculator proxy = (Calculator) proxyFactory.getProxy();
        // 调用代理对象的方法
        return proxy.add(a, b);
    }

    @Override
    public int subtract(int a, int b) {
        // 创建代理对象
        ProxyFactory proxyFactory = new ProxyFactory(calculator);
        // 添加通知
        proxyFactory.addAdvice(advice);
        // 获取代理对象
        Calculator proxy = (Calculator) proxyFactory.getProxy();
        // 调用代理对象的方法
        return proxy.subtract(a, b);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Calculator calculator = new CalculatorImpl();
        LoggingAdvice advice = new LoggingAdvice();
        Calculator proxy = new CalculatorProxy(calculator, advice);
        int result = proxy.add(1, 2); // 输出日志:Before method add, After method add
        System.out.println(result); // 输出:3
        result = proxy.subtract(3, 2); // 输出日志:Before method subtract, After method subtract
        System.out.println(result); // 输出:1
    }
}

在上面的示例中,我们使用了Spring的ProxyFactory来创建代理对象,添加了LoggingAdvice通知,然后调用代理对象的方法来执行业务逻辑。虽然没有使用注解,但是我们仍然可以通过代理的方式实现AOP

不使用注解定义切点和通知使用代理的方式给出示例

原文地址: https://www.cveoy.top/t/topic/cIO9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录