十一 使用CGLIB实现AOP功能与AOP概念解释
十一 使用CGLIB实现AOP功能与AOP概念解释前面的proxy技术必须在类实现了接口的前提下才可以实现权限的控制,cglb可以在类不实现接口的情况下完成。在spring文件夹下lib/cglib下找到cglib的jar库文件,加入工程。CGlibProxyFactory.javaview 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();}@Overridepublic 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.javaview 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!
?