AOP底层使用动态代理实现:
- 有接口的情况,使用JDK动态代理
- 无接口的情况,使用CGLIB动态代理
AOP(JDK动态代理): java.lang.reflect.Proxy # newProxyInstance()
public interface UserDao {
int select(int a, int b);
String update(int id);
}
public class UserDaoImpl implements UserDao {
@Override
public int select(int a, int b) {
return a + b;
}
@Override
public String update(int id) {
return "#" + id;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxyDemo {
public static void main(String[] args) {
Class<?>[] interfaces = {UserDao.class};
//被代理的对象
UserDaoImpl userDaoImpl = new UserDaoImpl();
//返回代理对象
UserDao pUseDao = (UserDao) Proxy.newProxyInstance(JdkProxyDemo.class.getClassLoader(), interfaces,
new UserDaoInvocationHandler(userDaoImpl));
//调用方法
pUseDao.select(2, 5);
System.out.println(pUseDao);
}
}
/**
* 具体的处理逻辑类
*/
class UserDaoInvocationHandler implements InvocationHandler {
private Object obj;
public UserDaoInvocationHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
//方法调用之前的逻辑
System.out.println(methodName + " 方法调用之前的逻辑");
//方法调用
Object result = method.invoke(obj, args);
System.out.println(methodName + " 方法调用");
//方法调用之后的逻辑
System.out.println(methodName + " 方法调用之后的逻辑");
return result;
}
}