使用,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();
}
}