动态代理和aop
参考博客
aop使用场景
aop术语介绍
aop概念介绍
使用动态代理实现简单的aop功能
动态代理
个人理解为是一种用于增强现有方法的手段。
aop
面向切面编程,目前学到的项目里很少使用,当前理解是用来 不改变服务实现类的前提下,添加日志方法。
使用动态代理实现简单aop功能
例子来自于尚硅谷课程day21
首先编写一个计算器的接口
package CalculatorTest;
public interface Calculator {
void add(int i ,int j);
void sub(int i ,int j);
void mul(int i ,int j);
void div(int i ,int j);
}
完成计算器接口的实现类
package CalculatorTest;
public class CalculatorImpl implements Calculator {
@Override
public void add(int i, int j) {
// TODO Auto-generated method stub
System.out.println(i + j);
}
@Override
public void sub(int i, int j) {
// TODO Auto-generated method stub
System.out.println(i - j);
}
@Override
public void mul(int i, int j) {
// TODO Auto-generated method stub
System.out.println(i * j);
}
@Override
public void div(int i, int j) {
// TODO Auto-generated method stub
if(j == 0) {
System.out.println("输入有误!");
return;
}
System.out.println(i / j);
}
}
在不改变计算器实现类的前提下,对每次调用方法前后添加一句话
package CalculatorTest;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CalculatorProxy {
private Calculator cal ;
public CalculatorProxy(Calculator target) {
this.cal = target;
}
public Object getProxy() {
ClassLoader classLoader = cal.getClass().getClassLoader();
Class[] interfaces = cal.getClass().getInterfaces();
Object proxy = Proxy.newProxyInstance(classLoader,
interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
String methodName = method.getName();
System.out.println("开启计算器");
System.out.println("开启方法:"+methodName);
method.invoke(cal, args);
System.out.println("关闭计算器");
return null;
}
});
return proxy;
}
}
测试方法
package CalculatorTest;
public class TestMain {
public static void main(String[] args) {
Calculator cal = new CalculatorImpl();
Calculator proxy = (Calculator) new CalculatorProxy(cal).getProxy();
proxy.add(1, 2);
}
}
最终打印结果
开启计算器
开启方法:add
3
关闭计算器