JDK动态代理主要是实现InvocationHandler接口,在invoke方法中实现代理逻辑
业务接口
package AOP.jdk;
public interface userDao {
public void addUser();
}
实现类
package AOP.jdk;
public class userDaoImpl implements userDao{
@Override
public void addUser() {
System.out.println("插入数据");
}
}
创建代理类
package AOP.aspect;
/**
* 切面
* @author dell
*
*/
public class MyAspect {
public void start(){
System.out.println("模拟事务处理");
}
public void end() {
System.out.println("事务结束");
}
}
创建InvocationHandler接口的实现类
package AOP.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import AOP.aspect.MyAspect;
/**
* JDK代理类
* @author dell
*
*/
public class jdkProxy implements InvocationHandler{
private userDao dao;
/**
* 创建代理方法
*/
public Object createProxy(userDao dao){
this.dao = dao;
/**
* 使用代理类进行增强,返回的是代理后的对象
*/
return Proxy.newProxyInstance(jdkProxy.class.getClassLoader(), dao.getClass().getInterfaces(), this);
}
/**
* 所有动态代理类的调用都交给invoke方法处理
* proxy 被代理后的对象
* method 将要执行的方法
* args 执行方法需要的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyAspect aspect = new MyAspect();
aspect.start();
Object obj = method.invoke(dao, args);
aspect.end();
return obj;
}
}
测试类
package AOP.test;
import AOP.jdk.jdkProxy;
import AOP.jdk.userDao;
import AOP.jdk.userDaoImpl;
public class jdkTest {
public static void main(String[] args) {
jdkProxy proxy = new jdkProxy();
userDao dao = new userDaoImpl();
/**
* 目标类被增强
*/
userDao dao1 = (userDao)proxy.createProxy(dao);
dao1.addUser();
}
}
运行结果
具体可参考