1.在jdk的动态代理中必须要求类实现了接口,要是一个类没有实现接口,那么此时我们应该怎么办呢?
使用cglib我们就可以不用实现就可以生成动态代理对象
cgLib动态代理实现 详细看代码注释
package com.qunar.dynaproxy.cglib;
public interface PersonService {
public void save(String name);
public void update(String name,Integer personId);
public String getPersonName(Integer personId);
}
package com.qunar.dynaproxy.cglib;
public class PersonServiceBean implements PersonService {
private String user = null;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public PersonServiceBean() {
}
public PersonServiceBean(String user) {
this.user = user;
}
@Override
public void save(String name) {
System.out.println("i am save()");
}
@Override
public void update(String name, Integer personId) {
System.out.println("i am update()");
}
@Override
public String getPersonName(Integer personId) {
System.out.println("i am getPersonName()");
return "xxxxxxx";
}
}
package com.qunar.dynaproxy.cglib;
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;
/**
*
* @param targetObject
* @return
*/
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());// 设置父类,也就是目标类,这样就会产生一个类并覆盖目标类中所有final的方法
enhancer.setCallback(this);//设置回调,要想让这个类的对象作为回调则,该类必须实现MethodInterceptor接口
return enhancer.create();
}
/**
* 当代理对象的方法被调用的时候可以回调这个方法
* @param arg0 表示代理对象本身
* @param arg1 表示被拦截到的方法
* @param arg2 方法的参数
* @param arg3 方法的代理对象
*/
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
PersonServiceBean bean = (PersonServiceBean)this.targetObject;
Object result = null;
if(bean.getUser()!=null){
this.before(arg1.getName());//advice 前置通知
try{
arg3.invoke(targetObject, arg2);
//afterAdvice -->后置通知
}catch(Exception e){
//ExceptionAdivce -->例外通知
}finally{
//finallyAdvice-->最终通知
}
}
return result;
}
private void before(String name) {
System.out.println(name+"method"+"start");
}
}
测试类:
package com.qunar.spring.test;
import org.junit.Test;
import com.qunar.dynaproxy.cglib.CGlibProxyFactory;
import com.qunar.dynaproxy.cglib.PersonService;
import com.qunar.dynaproxy.cglib.PersonServiceBean;
public class TestCGlib {
@Test
public void testCGlibProxy(){
CGlibProxyFactory factory = new CGlibProxyFactory();
PersonService service = (PersonService) factory.createProxyInstance(new PersonServiceBean("suhao"));
service.save("888888");
}
}
测试结果:
savemethodstart
i am save()