您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么在Java中動態(tài)代理Cglib,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
1.SpringMVC,Spring Web MVC是一種基于Java的實現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架。2.Shiro,Apache Shiro是Java的一個安全框架。3.Mybatis,MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。4.Dubbo,Dubbo是一個分布式服務(wù)框架。5.Maven,Maven是個項目管理和構(gòu)建自動化工具。6.RabbitMQ,RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務(wù)器。7.Ehcache,EhCache 是一個純Java的進(jìn)程內(nèi)緩存框架。
經(jīng)測試,jdk創(chuàng)建對象的速度遠(yuǎn)大于cglib,這是由于cglib創(chuàng)建對象時需要操作字節(jié)碼。cglib執(zhí)行速度略大于jdk,所以比較適合單例模式。另外由于CGLIB的大部分類是直接對Java字節(jié)碼進(jìn)行操作,這樣生成的類會在Java的永久堆中。如果動態(tài)代理操作過多,容易造成永久堆滿,觸發(fā)OutOfMemory異常。spring默認(rèn)使用jdk動態(tài)代理,如果類沒有接口,則使用cglib。
package proxy.cglib; public class OrderServiceImpl { /** * 下單 * * @param orderNo 訂單號 * @return 結(jié)果 */ public String preOrder(String orderNo) { System.out.println("OrderServiceImpl.preOrder" + orderNo); return "下單成功"; } /** * 下單 * * @return 結(jié)果 */ public String list() { return "list"; } }
package proxy.cglib; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.Objects; /** * @Description: <br/> * Cglib 通過繼承的方式 實習(xí)代理 * final類 和 final 方法 不能代理 * <p> * <br/> * @Author: Qz1997 * @create 2021/5/1 13:24 */ public class CglibProxyFactory implements MethodInterceptor { /** * 創(chuàng)建一個代理對象 * * @param clazz 類型 * @return 代理對象 */ public Object creatProxyedObj(Class<?> clazz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } /** * 代理方法 * * @param proxyObject 代理對象 * @param method 方法 * @param args 方法參數(shù) * @param methodProxy 代理方法 * @return * @throws Throwable */ @Override public Object intercept(Object proxyObject, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { // 判斷方法參數(shù) 如果是null || 參數(shù)格式 <= 0 if (Objects.isNull(args) || args.length <= 0) { return methodProxy.invokeSuper(proxyObject, args); } /// // 判斷這個方法上是否包含某個注解 // if (method.isAnnotationPresent(Async.class)) { // // ....進(jìn)行一頓增強(qiáng) // // return method.invoke(proxy, arg); // } Parameter[] parameters = method.getParameters(); Parameter parameter = parameters[0]; Class<?> type = parameter.getType(); // 類型為String if (type == String.class) { String orderNo = (String) args[0]; if (Objects.nonNull(orderNo) && orderNo.length() < 10) { throw new RuntimeException("訂單號錯誤"); } } String result = (String) methodProxy.invokeSuper(proxyObject, args); if (Objects.equals(result, "下單成功")) { System.out.println("發(fā)動訂單短信"); } return result; } }
關(guān)于怎么在Java中動態(tài)代理Cglib就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。