不使用注解定义切点和通知使用代理的方式给出示例
假设我们的业务类是一个简单的计算器类,它有两个方法: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 著作权归作者所有。请勿转载和采集!