在spring中,提供了两种动态代理机制,一种是JDK自带的,一种是cglib的动态代理。
<aop:aspectj-autoproxy poxy-target-class="true"/> 这里的true就表示cglib代理
==
package faicm.agent.cglib;
/**
* 这个是没有实现接口的实现类
*
* @author student
*
*/
public class PersonDoImpl {
public void addPerson() {
System.out.println("增加图书的普通方法...");
}
}
==
package faicm.agent.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 使用cglib动态代理
*/
public class PersonCglib implements MethodInterceptor {
private Object obj;
/**
* 创建代理对象 上面的obj很随意 ,可以随便该。
*/
public Object getInstance(Object target) {
this.obj = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.obj.getClass());// 可变
enhancer.setCallback(this);// 这个this是指MethodInterceptor 实现类的intercept方法
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("做了一些事情");
proxy.invokeSuper(obj, args);
System.out.println("做了一些事情");
return null;
}
}
==
package faicm.agent.cglib;
public class TestCglib {
public static void main(String[] args) {
PersonCglib cglib = new PersonCglib();
PersonDoImpl bookCglib = (PersonDoImpl) cglib
.getInstance(new PersonDoImpl());
bookCglib.addPerson();
}
}
代码来自网络修改后的,代码流程有些乱。。。。。。