浅谈SpringAOP代理之JDK动态代理
AOP中的代理就是由AOP框架动态生成的一个对象,该对象可以作为目标对象来使用!
JDK动态代理主要是创建代理类JdkProxy,该类要实现一个InvocationHandler接口
public class JdkProxy implements InvocationHandler{
private UserDao userDao;
public Object createProxy(UserDao userDao){
this.userDao = userDao;
//类加载器
ClassLoader classLoader =JdkProxy.class.getClassLoader();
//被代理对象实现的所有接口
Class[] clazz = userDao.getClass().getInterfaces();
//使用代理类进行增强,返回的是代理后的对象
return Proxy.newProxyInstance(classLoader, clazz, this);
}
//invoke()方法是接口实现的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//声明切面
MyAspect myAspect = new MyAspect();
//前增强
myAspect.check_Permissions();
Object obj = method.invoke(userDao, args);
myAspect.log();
return obj;
}
}
创建代理类方法createProxy()三部曲
1.首先拿到类加载器;2.然后拿到被代理对象(也就是目标对象)实现的所有接口,this.userDao = userDao;//目标对象为userDao,通过参数传进来。3.使用代理类进行增强,返回的是代理后的对象。
invoke()方法里面先要创建一个切面实例。然后在执行代理后对象的方法时增加前后增强。即切面的方法。
测试方法
先要创建一个代理对象,然后从代理对象中获取增强后的目标对象。执行目标对象的方法,就会自动植入切面内部的方法。
//测试方法
public static void main(String[] args) {
JdkProxy jdkProxy = new JdkProxy();
UserDao userDao = new UserDaoImpl();
UserDao userDao1 = (UserDao) jdkProxy.createProxy(userDao);
userDao1.addUser();
userDao1.deleteUser();
}
总概:创建代理对象类。代理对象类要实现InvocationHandler接口。该类要写一个创建代理对象的方法。三部曲:类加载器,所有接口,返回增强对象。
接口的实现方法invoke实现增强功能(由AOP框架内部调用),需要声明切面,方法里面会在目标类上调用方法,Object obj = method.invoke(userDao, args);在此代码前后增加前后增强。测试,创建代理对象,然后获得增强对象,执行增强对象的方法。(增强对象有监控,只要是目标对象的方法一执行,就被抓过来增强!
还没有评论,来说两句吧...