中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站輪播廣告動畫怎么做的可以免費(fèi)領(lǐng)取會員的軟件

網(wǎng)站輪播廣告動畫怎么做的,可以免費(fèi)領(lǐng)取會員的軟件,app設(shè)計(jì)風(fēng)格,dede網(wǎng)站url采集文章目錄 理解AOPAOP的實(shí)現(xiàn)原理 AOP代理模式靜態(tài)代理動態(tài)代理1-JDK動態(tài)代理2-CGLIB動態(tài)代理 總結(jié) 理解AOP OOP - - Object Oriented Programming 面向?qū)ο缶幊?AOP - - Aspect Oriented Programming 面向切面編程 AOP是Spring提供的關(guān)鍵特性之一。AOP即面向切面編程&#xff0…

文章目錄

    • 理解AOP
      • AOP的實(shí)現(xiàn)原理
    • AOP代理模式
      • 靜態(tài)代理
      • 動態(tài)代理
        • 1-JDK動態(tài)代理
        • 2-CGLIB動態(tài)代理
    • 總結(jié)

理解AOP

OOP - - Object Oriented Programming 面向?qū)ο缶幊?br /> AOP - - Aspect Oriented Programming 面向切面編程
AOP是Spring提供的關(guān)鍵特性之一。AOP即面向切面編程,是OOP編程的有效補(bǔ)充。使用AOP技術(shù),可以將一些系統(tǒng)性相關(guān)的編程工作,獨(dú)立提取出來,獨(dú)立實(shí)現(xiàn),然后通過切面切入進(jìn)系統(tǒng)。從而避免了在業(yè)務(wù)邏輯的代碼中混入了很多的系統(tǒng)性相關(guān)的邏輯–比如:事務(wù)管理、日志記錄、權(quán)限管理等,從而達(dá)到了將不同的關(guān)注點(diǎn)分離出來松耦合的效果。

AOP的實(shí)現(xiàn)原理

AOP的實(shí)現(xiàn)原理就是代理模式----其關(guān)鍵點(diǎn)是AOP框架自動創(chuàng)建的AOP代理
AOP代理分為靜態(tài)AOP代理和動態(tài)AOP代理:

  1. 靜態(tài)AOP代理 –– 是指AspectJ實(shí)現(xiàn)的AOP代理,它是將切面代碼直接編譯到Java字節(jié)碼文件中,發(fā)生在編譯時(shí)。
  2. 動態(tài)AOP代理 –– 是指將切面代碼進(jìn)行動態(tài)織入實(shí)現(xiàn)的AOP代理,發(fā)生在運(yùn)行時(shí)。Spring的AOP即為動態(tài)AOP實(shí)現(xiàn)技術(shù)為:JDK提供的動態(tài)代理技術(shù)和CGLIB(Code Generation Library動態(tài)字節(jié)碼增強(qiáng)技術(shù))。盡管實(shí)現(xiàn)技術(shù)不一樣,但都是基于代理模式,都是生成一個(gè)代理對象。

AOP代理模式

代理模式的核心作用就是通過代理,控制對被代理的目標(biāo)對象的訪問。它的設(shè)計(jì)思路是:定義一個(gè)抽象角色{接口},讓代理角色和真實(shí)角色分別去實(shí)現(xiàn)它。

真實(shí)角色:實(shí)現(xiàn)抽象角色,定義真實(shí)角色所要實(shí)現(xiàn)的業(yè)務(wù)邏輯,供代理角色調(diào)用。它只關(guān)注真正的業(yè)務(wù)邏輯。

代理角色:實(shí)現(xiàn)抽象角色,是真實(shí)角色的代理,通過真實(shí)角色的業(yè)務(wù)邏輯方法來實(shí)現(xiàn)抽象方法,并在前后可以附加自己的操作。
代理模式實(shí)現(xiàn)歌星演出場景

靜態(tài)代理

要求被代理類和代理類同時(shí)實(shí)現(xiàn)相應(yīng)的一套接口,通過代理類調(diào)用重寫接口的方法,實(shí)際上調(diào)用的是原始對象的同樣的方法。如下圖

在這里插入圖片描述

/*** 明星接口*/
public interface Star {void sing();
}
/*** 真實(shí)明星類*/
public class RealStar implements Star{@Overridepublic void sing() {System.out.println("明星本人開始唱歌...");}
}/*** 明星靜態(tài)代理類*/
public class ProxyStar implements Star{private Star star; //接收明星對象/*** 通過構(gòu)造方法傳進(jìn)來真實(shí)的明星對象* @param star*/public ProxyStar(Star star) {this.star = star;}@Overridepublic void sing() {System.out.println("明星代理先進(jìn)行商務(wù)談判...");//真實(shí)明星唱歌star.sing();System.out.println("明星演出完,代理收款...");}
}

這樣的話,邏輯就非常清晰了。在代理類中,可以看到,維護(hù)了一個(gè)Star對象,通過構(gòu)造方法傳進(jìn)來一個(gè)真實(shí)的Star對象給其賦值,
然后在唱歌這個(gè)方法里,使用真實(shí)對象來唱歌。所以說面談、收錢都是由代理對象來實(shí)現(xiàn)的,唱歌是代理對象讓真實(shí)對象來做。

/*** 測試客戶端*/
public class TestClient {/*** 測試靜態(tài)代理結(jié)果* @param args*/public static void main(String[] args) {Star realStar = new RealStar(); //創(chuàng)建真實(shí)對象Star proxy = new ProxyStar(realStar); //創(chuàng)建代理對象proxy.sing();}
}

靜態(tài)代理的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
  1.被代理的業(yè)務(wù)類只需要做好自己的業(yè)務(wù),實(shí)現(xiàn)了責(zé)任分離,保證了業(yè)務(wù)類的重用性
  2.將業(yè)務(wù)類隱藏起來,起到了保護(hù)作用
缺點(diǎn):
  1.代理對象的某個(gè)接口只服務(wù)于某一個(gè)業(yè)務(wù)對象,每個(gè)真實(shí)對象都得創(chuàng)建一個(gè)代理對象
  2.如果接口增加一個(gè)方法,除了所有實(shí)現(xiàn)類需要實(shí)現(xiàn)這個(gè)方法外,代理類也需要實(shí)現(xiàn),增加了代碼的復(fù)雜度和成本

動態(tài)代理

在程序運(yùn)行時(shí)由JVM通過反射機(jī)制動態(tài)的創(chuàng)建出代理對象的字節(jié)碼。代理對象和真實(shí)對象的關(guān)系是在程序運(yùn)行時(shí)才確定

1-JDK動態(tài)代理

JDK動態(tài)代理是使用java.lang.reflect包中的Proxy類與InvocationHandler接口來完成的,要使用JDK動態(tài)代理,必須要定義接口

API分析:
(1) java.lang.reflect.Proxy 類|-Java動態(tài)代理機(jī)制生成的所有動態(tài)代理類的父類,它提供了一組靜態(tài)方法來為一組接口動態(tài)地生成代理類及其對象。public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler hanlder)
方法職責(zé):為指定類加載器、一組接口及調(diào)用處理器  生成動態(tài)代理類實(shí)例 
參數(shù):loader        :類加載器interfaces        :目標(biāo)(真實(shí))對象實(shí)現(xiàn)的接口hanlder        :代理執(zhí)行處理器
返回:動態(tài)生成的代理對象
(2) java.lang.reflect.InvocationHandler接口:
public Object invoke(Object proxy, Method method, Object[] args)
方法職責(zé):負(fù)責(zé)集中處理動態(tài)代理類上的所有方法調(diào)用
參數(shù): proxy :  生成的代理對象method: 當(dāng)前調(diào)用的真實(shí)方法對象args:    當(dāng)前調(diào)用方法的實(shí)參
返回: 真實(shí)方法的返回結(jié)果
jdk動態(tài)代理操作步驟 實(shí)現(xiàn)InvocationHandler接口,創(chuàng)建自己增強(qiáng)代碼的處理器。
② 給Proxy類提供ClassLoader對象和代理接口類型數(shù)組,創(chuàng)建動態(tài)代理對象。
③ 在處理器中實(shí)現(xiàn)增強(qiáng)操作。

示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** JDK動態(tài)代理處理類*/
public class JdkProxyHandler implements InvocationHandler {/*** 用來接收真實(shí)明星對象*/private Object realStar;/*** 傳入真實(shí)明星對象,動態(tài)創(chuàng)建一個(gè)代理** @param realStar* @return*/public Object bind(Object realStar) {this.realStar = realStar;return Proxy.newProxyInstance(realStar.getClass().getClassLoader(),realStar.getClass().getInterfaces(), this);}/*** 當(dāng)調(diào)用代理對象的方法時(shí),會調(diào)用此方法** @param proxy* @param method* @param args* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("明星代理先進(jìn)行談判...");Object result = method.invoke(realStar, args); //真實(shí)對象明星唱歌System.out.println("演出完,代理收款...");return result;}
}
/*** 測試Jdk動態(tài)代理客戶端*/
public class TestJdkProxyClient {public static void main(String[] args) {Star realStar = new RealStar(); //真實(shí)對象//創(chuàng)建一個(gè)代理對象實(shí)例Star proxy = (Star)new JdkProxyHandler().bind(realStar);//代理對象調(diào)用方法proxy.sing();}
}

相對于靜態(tài)代理,JDK 動態(tài)代理大大減少了我們的開發(fā)任務(wù),同時(shí)減少了對業(yè)務(wù)接口的依賴,降低了耦合度

2-CGLIB動態(tài)代理

由上面的分析可知,JDK 實(shí)現(xiàn)動態(tài)代理需要實(shí)現(xiàn)類通過接口定義業(yè)務(wù)方法,那對于沒有接口的類,如何實(shí)現(xiàn)動態(tài)代理呢,這就需要 CGLIB 了。

  • CGLIB(Code Generation Library),是一個(gè)代碼生成的類庫,可以在運(yùn)行時(shí)動態(tài)的生成某個(gè)類的子類.
  • CGLIB動態(tài)代理是針對沒有接口的類進(jìn)行的代理,和JDK動態(tài)代理的區(qū)別是獲取代理對象的方法不一樣
/*** 真實(shí)明星類*/
public class RealStar{public void sing() {System.out.println("明星本人開始唱歌...");}
}import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** Cglib代理處理類*/
public class CglibProxyHandler implements MethodInterceptor {/*** 維護(hù)的目標(biāo)對象*/private Object realStar;/***  Enhancer類是CGLIB中的一個(gè)字節(jié)碼增強(qiáng)器,它可以方便的對你想要處理的類進(jìn)行擴(kuò)展*/private Enhancer enhancer = new Enhancer();/*** 根據(jù)被代理對象的類型 ,動態(tài)創(chuàng)建一個(gè)代理對象* @param realStar* @return*/public Object bind(Object realStar){
this.realStar = realStar;enhancer.setSuperclass(realStar.getClass()); //使用增強(qiáng)器,設(shè)置被代理對象為父類enhancer.setCallback(this);  //設(shè)置回調(diào)方法,攔截器//動態(tài)創(chuàng)建一個(gè)代理類對象,并返回return enhancer.create();}/***  當(dāng)調(diào)用代理對象的方法時(shí),會調(diào)用此方法進(jìn)行攔截* @param proxy 代理對象* @param method 需要增強(qiáng)的方法* @param objects 需要增強(qiáng)方法的參數(shù)* @param methodProxy  需要增強(qiáng)的方法的代理* @return 方法執(zhí)行后的返回值* @throws Throwable*/@Overridepublic Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("代理明星先進(jìn)行演出談判...");//invokeSuper方法調(diào)用的對象已經(jīng)是增強(qiáng)了Object result = methodProxy.invokeSuper(object,args); //明星唱歌System.out.println("演出完成,代理去收款...");return result;}
}/*** 測試Cglib動態(tài)代理客戶端*/
public class TestCglibProxyClient {public static void main(String[] args) {RealStar realStar = new RealStar(); //真實(shí)對象//創(chuàng)建一個(gè)代理對象實(shí)例RealStar proxy = (RealStar) new CglibProxyHandler().bind(realStar);//代理對象調(diào)用方法proxy.sing();}
}

關(guān)于CGLIB 動態(tài)代理總結(jié):

  • CGLib所創(chuàng)建的動態(tài)代理對象在實(shí)際運(yùn)行時(shí)候的性能要比JDK動態(tài)代理高不少,但是CGLIB 創(chuàng)建代理對象時(shí)所花費(fèi)的時(shí)間卻比JDK多得多,所以對于單例singleton的對象,因?yàn)闊o需頻繁創(chuàng)建對象,用 CGLIB 合適,反之使用JDK方式要更為合適一些。
  • CGLIB是通過繼承的方式做的動態(tài)代理,因此如果某個(gè)類被標(biāo)記為final,那么它是無法使用CGLIB做動態(tài)代理的,諸如private的方法也是不可以作為切面的。

小結(jié)
Spring AOP 中的代理使用邏輯:如果目標(biāo)對象實(shí)現(xiàn)了接口,默認(rèn)情況下會采用 JDK 的動態(tài)代理實(shí)現(xiàn) AOP;如果目標(biāo)對象沒有實(shí)現(xiàn)了接口,則采用 CGLIB 庫,Spring 會自動在 JDK 動態(tài)代理和 CGLIB 動態(tài)代理之間轉(zhuǎn)換

總結(jié)

  • AOP面向切面編程,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)
  • 使用AOP技術(shù),可以將一些系統(tǒng)性相關(guān)的編程工作,獨(dú)立提取出來,獨(dú)立實(shí)現(xiàn),然后通過切面切入進(jìn)系統(tǒng)。
  • Spring的AOP為動態(tài)AOP,實(shí)現(xiàn)的技術(shù)為: JDK提供的動態(tài)代理技術(shù) 和 CGLIB(動態(tài)字節(jié)碼增強(qiáng)技術(shù))
  • 代理模式--官方的定義為“為其他對象提供一種代理以控制對這個(gè)對象的訪問”
  • java中有靜態(tài)代理、JDK動態(tài)代理、CGLib動態(tài)代理的方式。靜態(tài)代理指的是代理類是在編譯期就存在的,相反動態(tài)代理則是在程序運(yùn)行期動態(tài)生成的
http://m.risenshineclean.com/news/61164.html

相關(guān)文章:

  • 萊陽網(wǎng)站建設(shè)個(gè)人免費(fèi)網(wǎng)站申請注冊
  • 南陽做網(wǎng)站aokuo臨沂網(wǎng)站建設(shè)方案服務(wù)
  • 華傭網(wǎng)做最好的現(xiàn)貨瀝青返傭網(wǎng)站seo是指什么
  • php國內(nèi)外發(fā)展現(xiàn)狀關(guān)鍵詞seo深圳
  • 空間怎么做網(wǎng)站代發(fā)新聞稿最大平臺
  • 安徽住房與城鄉(xiāng)建設(shè)門戶網(wǎng)站十大互聯(lián)網(wǎng)平臺
  • 網(wǎng)站職位推薦怎么做全面的seo網(wǎng)站優(yōu)化排名
  • 做美容行業(yè)的網(wǎng)站哪個(gè)好百度 站長工具
  • 非你莫屬做網(wǎng)站的賣網(wǎng)幣起家的qq推廣引流網(wǎng)站
  • 網(wǎng)站建設(shè)制作設(shè)計(jì)珠海蘇州seo推廣
  • 墾利縣建設(shè)局網(wǎng)站admin5站長網(wǎng)
  • 二手車為什么做網(wǎng)站今天株洲最新消息
  • 漢化wordpress主題如何優(yōu)化搜索引擎
  • 長沙優(yōu)化網(wǎng)站廠家百度在線客服系統(tǒng)
  • 新鄉(xiāng)高端網(wǎng)站建設(shè)搜索引擎優(yōu)化的具體操作
  • 石家莊網(wǎng)站建設(shè)找哪家渠道推廣策略
  • 昆明做網(wǎng)站優(yōu)化公司優(yōu)化的含義是什么
  • 公司專業(yè)做網(wǎng)站湖南企業(yè)seo優(yōu)化推薦
  • 網(wǎng)站建設(shè)項(xiàng)目選題寧波seo教學(xué)
  • 網(wǎng)絡(luò)招商平臺網(wǎng)站怎么做seo攻略
  • 婚紗影樓網(wǎng)站建設(shè)百度瀏覽器手機(jī)版
  • 人才招聘網(wǎng)站開發(fā)+源代碼廣告策劃公司
  • node可以做電商網(wǎng)站么網(wǎng)絡(luò)銷售每天做什么
  • 河南做網(wǎng)站聯(lián)系電話東莞建設(shè)企業(yè)網(wǎng)站公司
  • vps網(wǎng)站如何綁定多個(gè)域名蕭山區(qū)seo關(guān)鍵詞排名
  • 嗶哩嗶哩做視頻網(wǎng)站如何推銷產(chǎn)品給客戶
  • 精美網(wǎng)站開發(fā)方案蘭州seo新站優(yōu)化招商
  • 企業(yè)網(wǎng)絡(luò)推廣整合營銷廣州seo外包多少錢
  • 城鄉(xiāng)建設(shè)網(wǎng)站首頁電商運(yùn)營公司排名
  • 有利于優(yōu)化的網(wǎng)站模板濰坊百度seo公司