Spring中的JDK动态代理
在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层技术。
JDK的动态代理主要涉及Java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个复合某一接口的代理的实例。
JDK动态代理其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类完成对目标对象的代理。这点也是与CGLIB代理最大不同之处,CGLIB代理是针对类生成代理。
下面我们来模拟JDK动态代理
步骤一:创建一个接口UserDao
public interface UserDao { public void add(); public void eidt(); }
步骤二:创建一个UserDao接口的实现类UserDaoImpl
public class UserDaoImpl implements UserDao{ public void add() { System.out.println("add OK!"); } public void eidt() { System.out.println("eidt OK!"); } }
步骤三:创建测试类UserTest(代理对象主要在测试类中创建)
/** * * 动态代理测试 * */ public class UserTest { public static void main(String[] args) { //01.先创建出接口实现类 final UserDao dao=new UserDaoImpl(); //获取实现类的加载器 UserDao proxy=(UserDao)Proxy.newProxyInstance(dao.getClass().getClassLoader() //获取实现类的接口 , dao.getClass().getInterfaces() //Invocation(调用) Handler(处理) , new InvocationHandler() { /** * proxy 代理对象 * method 被代理对象 方法 add() * args add方法的参数 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置增强"); Object invoke = method.invoke(dao, args); System.out.println("后置增强"); return null; } }); proxy.add(); proxy.eidt(); } }
运行结果如下所示:
使用JDK动态代理方法实现增强例子演示完毕