亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

CGlib簡(jiǎn)單介紹

系統(tǒng) 1969 0

CGlib概述:
cglib( Code Generation Library )是一個(gè)強(qiáng)大的,高性能,高質(zhì)量的Code生成類庫(kù)。它可以在運(yùn)行期擴(kuò)展Java類與實(shí)現(xiàn)Java接口。
cglib封裝了asm,可以在運(yùn)行期動(dòng)態(tài)生成新的class。
cglib用于AOP,jdk中的proxy必須基于接口,cglib卻沒(méi)有這個(gè)限制。

CGlib應(yīng)用:
以一個(gè)實(shí)例在簡(jiǎn)單介紹下cglib的應(yīng)用。
我們模擬一個(gè)虛擬的場(chǎng)景,關(guān)于信息的管理。

1)原始需求是任何人可以操作信息的create,update,delete,query操作。


InfoManager.java --封裝對(duì)信息的操作

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?InfoManager?{
????
// ?模擬查詢操作
???? public ? void ?query()?{
????????System.out.println(
" query " );
????}
????
// ?模擬創(chuàng)建操作
???? public ? void ?create()?{
????????System.out.println(
" create " );
????}
????
// ?模擬更新操作
???? public ? void ?update()?{
????????System.out.println(
" update " );
????}
????
// ?模擬刪除操作
???? public ? void ?delete()?{
????????System.out.println(
" delete " );
????}
}

?

InfoManagerFactory.java --工廠類

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?InfoManagerFactory?{
????
private ? static ?InfoManager?manger? = ? new ?InfoManager();
????
/**
?????*?創(chuàng)建原始的InfoManager
?????*?
?????*?
@return
?????
*/
????
public ? static ?InfoManager?getInstance()?{
????????
return ?manger;
????}
}

?

client.java --供客戶端調(diào)用

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?Client?{

????
public ? static ? void ?main(String[]?args)?{
????????Client?c?
= ? new ?Client();
????????c.anyonecanManager();
????}

????
/**
?????*?模擬:沒(méi)有任何權(quán)限要求,任何人都可以操作
?????
*/
????
public ? void ?anyonecanManager()?{
????????System.out.println(
" any?one?can?do?manager " );
????????InfoManager?manager?
= ?InfoManagerFactory.getInstance();
????????doCRUD(manager);
????????separatorLine();
????}

????
/**
?????*?對(duì)Info做增加/更新/刪除/查詢操作
?????*?
?????*?
@param ?manager
?????
*/
????
private ? void ?doCRUD(InfoManager?manager)?{
????????manager.create();
????????manager.update();
????????manager.delete();
????????manager.query();
????}

????
/**
?????*?加一個(gè)分隔行,用于區(qū)分
?????
*/
????
private ? void ?separatorLine()?{
????????System.out.println(
" ################################ " );
????}

}

至此,沒(méi)有涉及到cglib的內(nèi)容,因?yàn)樾枨筇?jiǎn)單了,但是接下來(lái),需求發(fā)生了改變,要求:

2)只有一個(gè)叫“maurice”的用戶登錄,才允許對(duì)信息進(jìn)行create,update,delete,query的操作。
怎么辦?難道在每個(gè)方法前,都加上一個(gè)權(quán)限判斷嗎?這樣重復(fù)邏輯太多了,于是乎想到了Proxy(代理模式),但是原先的InfoManager也沒(méi)有實(shí)現(xiàn)接口,不能采用jdk的proxy。那么cglib在這邊就要隆重登場(chǎng)。
一旦使用cgblig,只需要添加一個(gè)MethodInterceptor的類以及修改factory代碼就可以實(shí)現(xiàn)這個(gè)需求。

?

AuthProxy.java --權(quán)限校驗(yàn)代理類

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?AuthProxy? implements ?MethodInterceptor?{

????
private ?String?name;? // ?會(huì)員登錄名

????
public ?AuthProxy(String?name)?{
????????
this .name? = ?name;
????}

????
/**
?????*?權(quán)限校驗(yàn),如果會(huì)員名為:maurice,則有權(quán)限做操作,否則提示沒(méi)有權(quán)限
?????
*/
????@Override
????
public ?Object?intercept(Object?obj,?Method?method,?Object[]?args,?MethodProxy?proxy)? throws ?Throwable?{
????????
if ?( ! " maurice " .equals( this .name))?{
????????????System.out.println(
" AuthProxy:you?have?no?permits?to?do?manager! " );
????????????
return ? null ;
????????}
????????
return ?proxy.invokeSuper(obj,?args);
????}

????
public ?String?getName()?{
????????
return ?name;
????}

????
public ? void ?setName(String?name)?{
????????
this .name? = ?name;
????}

}

?

InfoManagerFactory.java --代碼變動(dòng)如下:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?InfoManagerFactory?{

????
/**
?????*?創(chuàng)建帶有權(quán)限檢驗(yàn)的InfoManager
?????*?
?????*?
@param ?auth
?????*?
@return
?????
*/
????
public ? static ?InfoManager?getAuthInstance(AuthProxy?auth)?{
????????Enhancer?enhancer?
= ? new ?Enhancer();
????????enhancer.setSuperclass(InfoManager.
class );
????????enhancer.setCallback(auth);
????????
return ?(InfoManager)?enhancer.create();
????}

????
}

?

client.java --代碼修改如下

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?Client?{

????
public ? static ? void ?main(String[]?args)?{
????????Client?c?
= ? new ?Client();
????????c.haveNoAuthManager();
????????c.haveAuthManager();
????}

????
/**
?????*?模擬:登錄會(huì)員沒(méi)有權(quán)限
?????
*/
????
public ? void ?haveNoAuthManager()?{
????????System.out.println(
" the?loginer's?name?is?not?maurice,so?have?no?permits?do?manager " );
????????InfoManager?noAuthManager?
= ?InfoManagerFactory.getAuthInstance( new ?AuthProxy( " maurice1 " ));
????????doCRUD(noAuthManager);
????????separatorLine();
????}

????
/**
?????*?模擬:登錄會(huì)員有權(quán)限
?????
*/
????
public ? void ?haveAuthManager()?{
????????System.out.println(
" the?loginer's?name?is?maurice,so?have?permits?do?manager " );
????????InfoManager?authManager?
= ?InfoManagerFactory.getAuthInstance( new ?AuthProxy( " maurice " ));
????????doCRUD(authManager);
????????separatorLine();
????}

????
/**
?????*?對(duì)Info做增加/更新/刪除/查詢操作
?????*?
?????*?
@param ?manager
?????
*/
????
private ? void ?doCRUD(InfoManager?manager)?{
????????manager.create();
????????manager.update();
????????manager.delete();
????????manager.query();
????}

????
/**
?????*?加一個(gè)分隔行,用于區(qū)分
?????
*/
????
private ? void ?separatorLine()?{
????????System.out.println(
" ################################ " );
????}

}

執(zhí)行下代碼,發(fā)現(xiàn)這時(shí)client端中已經(jīng)加上了權(quán)限校驗(yàn)。

到這里,參照上面的代碼,就可以使用cglib帶來(lái)的aop功能了。但是為了更多介紹下cglib的功能,模擬需求再次發(fā)生變化:

3)由于query功能用戶maurice才能使用,招來(lái)其他用戶的強(qiáng)烈的抱怨,所以權(quán)限再次變更,只有create,update,delete,才需要權(quán)限保護(hù),query任何人都可以使用。
怎么辦?采用AuthProxy,使得InfoManager中的所有方法都被代理,加上了權(quán)限的判斷。當(dāng)然,最容易想到的辦法,就是在 AuthProxy的intercept的方法中再做下判斷,如果代理的method是query,不需要權(quán)限驗(yàn)證。這么做,可以,但是一旦邏輯比較復(fù)雜 的時(shí)候,intercept這個(gè)方法要做的事情會(huì)很多,邏輯會(huì)異常的復(fù)雜。
幸好,cglib還提供了CallbackFilter。使用CallbackFilter,可以明確表明,被代理的類(InfoManager)中不同的方法,被哪個(gè)攔截器(interceptor)攔截。

?

AuthProxyFilter.java

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?AuthProxyFilter? implements ?CallbackFilter?{

????
private ? static ? final ? int ?AUTH_NEED????? = ? 0 ;
????
private ? static ? final ? int ?AUTH_NOT_NEED? = ? 1 ;

????
/**
?????*?<pre>
?????*?選擇使用的proxy
?????*?如果調(diào)用query函數(shù),則使用第二個(gè)proxy
?????*?否則,使用第一個(gè)proxy
?????*?</pre>
?????
*/
????@Override
????
public ? int ?accept(Method?method)?{
????????
if ?( " query " .equals(method.getName()))?{
????????????
return ?AUTH_NOT_NEED;
????????}
????????
return ?AUTH_NEED;
????}

}

這段代碼什么意思?其中的accept方法的意思是說(shuō),如果代理的方法是query(),那么使用第二個(gè)攔截器去攔截,如果代理的方法不是 query(),那么使用第一個(gè)攔截器去攔截。所以我們只要再寫(xiě)一個(gè)攔截器,不做權(quán)限校驗(yàn)就行了。(其實(shí),cglib中的NoOp.INSTANCE就是 一個(gè)空的攔截器,只要配置上這個(gè)就可以了。)

?

InfoManagerFactory.java --代碼修改如下:(配置不同的攔截器和filter)

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public ? class ?InfoManagerFactory?{

????
/**
?????*?創(chuàng)建不同權(quán)限要求的InfoManager
?????*?
?????*?
@param ?auth
?????*?
@return
?????
*/
????
public ? static ?InfoManager?getSelectivityAuthInstance(AuthProxy?auth)?{
????????Enhancer?enhancer?
= ? new ?Enhancer();
????????enhancer.setSuperclass(InfoManager.
class );
????????enhancer.setCallbacks(
new ?Callback[]?{?auth,?NoOp.INSTANCE?});
????????enhancer.setCallbackFilter(
new ?AuthProxyFilter());
????????
return ?(InfoManager)?enhancer.create();
????}

}

記住:setCallbacks中的攔截器(interceptor)的順序,一定要和 CallbackFilter里面指定的順序一致!!切忌。

Client.java

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public ? class ?Client?{

????
public ? static ? void ?main(String[]?args)?{
????????Client?c?
= ? new ?Client();
????????c.selectivityAuthManager();
????}
????
????
/**
?????*?模擬:沒(méi)有權(quán)限的會(huì)員,可以作查詢操作
?????
*/
????
public ? void ?selectivityAuthManager()?{
????????System.out.println(
" the?loginer's?name?is?not?maurice,so?have?no?permits?do?manager?except?do?query?operator " );
????????InfoManager?authManager?
= ?InfoManagerFactory.getSelectivityAuthInstance( new ?AuthProxy( " maurice1 " ));
????????doCRUD(authManager);
????????separatorLine();
????}

????
/**
?????*?對(duì)Info做增加/更新/刪除/查詢操作
?????*?
?????*?
@param ?manager
?????
*/
????
private ? void ?doCRUD(InfoManager?manager)?{
????????manager.create();
????????manager.update();
????????manager.delete();
????????manager.query();
????}

????
/**
?????*?加一個(gè)分隔行,用于區(qū)分
?????
*/
????
private ? void ?separatorLine()?{
????????System.out.println(
" ################################ " );
????}

}

此時(shí),對(duì)于query的權(quán)限校驗(yàn)已經(jīng)被去掉了。


通過(guò)一個(gè)模擬需求,簡(jiǎn)單介紹了cglib aop功能的使用。
CGlib應(yīng)用非常廣,在spring,hibernate等框架中,被大量的使用。

CGlib簡(jiǎn)單介紹


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久综合一区二区 | 中文字幕最新中文字幕中文字幕 | 日本色图网站 | 日本免费在线视频 | 国产九九免费视频 | 成人久久伊人精品伊人 | 国产或人精品日本亚洲77美色 | 国产1769一七六九视频在线 | 久久青草国产精品一区 | 精精国产www视频在线观看免费 | 亚洲精品久久99久久一区 | 精品福利国产 | 就草草在线观看视频 | 91久久精品日日躁夜夜躁欧美 | 久操福利 | 色偷偷91久久综合噜噜噜噜 | 色噜噜狠狠一区二区三区 | 婷婷爱五月 | 国产日韩91 | 男女性高清爱潮视频免费观看 | 亚洲美女视频在线观看 | 亚洲看黄 | 黄色影院网站 | 久久久精| 亚洲精品乱码久久久久久v 亚洲精品乱码久久久久久麻豆 | 免看一级a毛片一片成人不卡 | 97se亚洲国产综合自在线观看 | 国产福利资源在线 | 免费两性的视频网站 | 奇米网在线视频 | 久久久国产麻豆 | 亚洲天堂久久久 | 国产一级一级毛片 | 欧美日韩精品一区二区三区 | 手机看片福利盒子久久 | 亚州精品永久观看视频 | 亚洲香蕉 | 99在线观看视频免费精品9 | 免费爱爱小视频 | 久久毛片免费看 | 日本亚洲黄色 |