Spring AOP的實現原理詳解及實例
spring 實現AOP是依賴JDK動態代理和CGLIB代理實現的。
以下是JDK動態代理和CGLIB代理簡單介紹
JDK動態代理:其代理對象必須是某個接口的實現,它是通過在運行期間創建一個接口的實現類來完成對目標對象的代理。
CGLIB代理:實現原理類似于JDK動態代理,只是它在運行期間生成的代理對象是針對目標類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的Java字節碼編輯類庫)操作字節碼實現的,性能比JDK強。
在Spring中,有接口時將采用JDK的方式實現proxy代理對象,當沒有接口時,將采用cglib中的方式實現prixy代理對象。詳情如下:
// JDK方式:PersonService為接口,PersonServiceBean為實現類, public class JDKProxyFactory implements InvocationHandler { private Object targetObject; public Object createProxyIntance(Object targetObject) { this.targetObject=targetObject; return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PersonServiceBean person=(PersonServiceBean)this.targetObject; Object result=null; if(person.getUser()!=null) { result = method.invoke(targetObject, args); } return result; } }
//使用CGlib包實現:PersonServiceBean為實現類, 而沒有PersonService接口, 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());//設置目標類的子類,該子類會覆蓋所有父類中的非final方法 enhancer.setCallback(this);//設置回調 return enhancer.create(); } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { PersonServiceBean person=(PersonServiceBean)this.targetObject; Object result=null; if(person.getUser()!=null) { result = methodProxy.invoke(targetObject, args); } return null; } }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答