十一 使用CGLIB实现AOP功能与AOP概念解释
前面的proxy技术必须在类实现了接口的前提下才可以实现权限的控制,cglb可以在类不实现接口的情况下完成。
在spring文件夹下lib/cglib下找到cglib的jar库文件,加入工程。
CGlibProxyFactory.java
view plaincopy to clipboardprint?
01.package cn.pf.aop;
02.
03.import java.lang.reflect.Method;
04.
05.import cn.pf.aop.service.impl.PersonServiceBean;
06.
07.import net.sf.cglib.proxy.Enhancer;
08.import net.sf.cglib.proxy.MethodInterceptor;
09.import net.sf.cglib.proxy.MethodProxy;
10.
11.public class CGlibProxyFactory implements MethodInterceptor{
12. private Object targetObject;
13.
14. public Object createProxyIntance(Object targetObject){
15. this.targetObject = targetObject;
16. Enhancer enhancer = new Enhancer();
17. enhancer.setSuperclass(this.targetObject.getClass());
18. enhancer.setCallback(this);
19. return enhancer.create();
20. }
21.
22. @Override
23. public Object intercept(Object proxy, Method method, Object[] arg2,
24. MethodProxy arg3) throws Throwable {
25. PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;
26. Object result = null;
27. if(personServiceBean.getUser() != null){
28. result = method.invoke(targetObject, arg2);
29. }
30. return result;
31. }
32.}
package cn.pf.aop;
import java.lang.reflect.Method;
import cn.pf.aop.service.impl.PersonServiceBean;
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 createProxyIntance(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] arg2,
MethodProxy arg3) throws Throwable {
PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;
Object result = null;
if(personServiceBean.getUser() != null){
result = method.invoke(targetObject, arg2);
}
return result;
}
}
AOPTest.java
view plaincopy to clipboardprint?
01.@Test public void proxyTest2(){
02. CGlibProxyFactory factory = new CGlibProxyFactory();
03. PersonServiceBean personServiceBean = (PersonServiceBean) factory.createProxyIntance(new PersonServiceBean("1"));
04. personServiceBean.save("111");
05. }
@Test public void proxyTest2(){
CGlibProxyFactory factory = new CGlibProxyFactory();
PersonServiceBean personServiceBean = (PersonServiceBean) factory.createProxyIntance(new PersonServiceBean("1"));
personServiceBean.save("111");
}
CGlib的enhance继承了目标类所有非final方法,对这些方法进行覆盖。创建的代理对象是目标对象的子类
完毕 end!