使用,JDK的代理(被代理类,必须有一个接口),如果被代理类,没有实现接口。则使用CGlib来生成代理类
一、实现 InvocationHandler接口,并重构 invoke 方法
二、使用Proxy的newProxyInstance方法。生成代理类。
返回类型是被代理类,实现的接口。
使用,CGlib的代理(被代理类,必须有一个接口)
导入CGlib\cglib-nodep-2.1_3.jar包
一、实现 MethodInterceptor接口,并重构 intercept方法
二、使用Enhancer类。
设置Enhancer.setSuperclass(被代理的类);
设置Enhancer.setCallback(实现 MethodInterceptor接口的类);
返回类型是被代理类。
接口
PersonService.java
package com.dwt1220; public interface PersonService { public abstract void save(); }
被代理类
PersonServiceBean.java
package com.dwt1220; public class PersonServiceBean implements PersonService { private String user; public PersonServiceBean() {} public PersonServiceBean(String user) { this.user = user; } public String getUser(){ return user; } public void save() { System.out.println("personService的save()方法"); } }
使用,JDK的代理(被代理类,必须有一个接口)
一、实现 InvocationHandler接口,并重构 invoke 方法
二、使用Proxy的newProxyInstance方法。生成代理类。
返回类型是被代理类,实现的接口。
使用,JDK的代理。生成代理类的工厂类,并实现了InvocationHandler接口的。
JDKProxyFactory.java
package com.dwt1220; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JDKProxyFactory implements InvocationHandler { private Object targetObject;//代理的目标对象 public Object createProxyInstance(Object targetObject){ this.targetObject = targetObject; /** * 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器 * 第二个参数设置代理类实现的接口 * 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法(实现InvocationHandler接口的类) */ return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PersonServiceBean bean=(PersonServiceBean)this.targetObject; Object result=null; if(bean.getUser()!=null){ result=method.invoke(targetObject, args); } return result; } }
使用,CGlib的代理(被代理类,必须有一个接口)
导入CGlib\cglib-nodep-2.1_3.jar包
一、实现 MethodInterceptor接口,并重构 intercept方法
二、使用Enhancer类。
设置Enhancer.setSuperclass(被代理的类);
设置Enhancer.setCallback(实现 MethodInterceptor接口的类);
返回类型是被代理类。
CGlibProxyFactory.java
使用CGlib生成代理
package com.dwt1220; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CGlibProxyFactory implements MethodInterceptor{ private Object targetObject; public Object createProxyInstance(Object targetObject){ this.targetObject=targetObject; Enhancer enhancer=new Enhancer(); //设置被代理的类。生成子类, enhancer.setSuperclass(this.targetObject.getClass()); //设置回调函数 enhancer.setCallback(this); return enhancer.create(); } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { PersonServiceBean bean=(PersonServiceBean)this.targetObject; Object result=null; if(bean.getUser()!=null){ result=method.invoke(targetObject, args); } return result; } }
package com.dwt1220; public class Test { public static void main(String[] args) { // JDKProxyFactory factory=new JDKProxyFactory(); // /**生成代理类 ,如果user不为空,则执行save方法**/ // PersonService service=(PersonService)factory.createProxyInstance(new // PersonServiceBean("xxx")); // /**代理类调用save方法**/ // service.save(); CGlibProxyFactory CGlibfactory = new CGlibProxyFactory(); /** 生成代理类 ,如果user不为空,则执行save方法 **/ PersonServiceBean CGlibservice = (PersonServiceBean) CGlibfactory .createProxyInstance(new PersonServiceBean()); /** 代理类调用save方法 **/ CGlibservice.save(); } }