最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解在Spring中如何自動(dòng)創(chuàng)建代理

 更新時(shí)間:2018年07月27日 14:35:25   作者:deniro  
這篇文章主要介紹了詳解在Spring中如何自動(dòng)創(chuàng)建代理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Spring 提供了自動(dòng)代理機(jī)制,可以讓容器自動(dòng)生成代理,從而把開(kāi)發(fā)人員從繁瑣的配置中解脫出來(lái) 。 具體是使用 BeanPostProcessor 來(lái)實(shí)現(xiàn)這項(xiàng)功能。

1 BeanPostProcessor

BeanPostProcessor 代理創(chuàng)建器的實(shí)現(xiàn)類(lèi)可以分為 3 類(lèi):

類(lèi)型 實(shí)現(xiàn)類(lèi)
基于 Bean 配置名規(guī)則 BeanNameAutoProxyCreator
基于 Advisor 匹配規(guī)則 DefaultAdvisorAutoProxyCreator
基于 Bean 中的 AspectJ 注解標(biāo)簽的匹配規(guī)則 AnnotationAwareAspectJAutoProxyCreator

BeanPostProcessor 類(lèi)繼承關(guān)系

所有的自動(dòng)代理器類(lèi)都實(shí)現(xiàn)了 BeanPostPorcessor ,在容器實(shí)例化 Bean 時(shí), BeanPostProcessor 將對(duì)它進(jìn)行加工處理,所以自動(dòng)代理創(chuàng)建器能夠?qū)M(mǎn)足匹配規(guī)則的 bean 自動(dòng)創(chuàng)建代理對(duì)象。

2 BeanNameAutoProxyCreator
假設(shè)有以下兩個(gè)實(shí)體類(lèi)(用戶(hù)與充電寶)。

用戶(hù)類(lèi):

public class User {

  public void rent(String userId) {
    System.out.println("User:租賃【充電寶】");
  }

  public void back(String userId){
    System.out.println("User:歸還【充電寶】");

  }
}

充電寶:

public class Charger {

  public void rent(String userId) {
    System.out.println("Charger:【充電寶】被租賃");
  }
}

我們希望通過(guò) BeanNameAutoProxyCreator 通過(guò) Bean 的名稱(chēng)來(lái)自動(dòng)創(chuàng)建代理,實(shí)現(xiàn)增強(qiáng):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

  <bean id="user" class="net.deniro.spring4.aop.User"/>
  <bean id="charger" class="net.deniro.spring4.aop.Charger"/>

  <!-- 前置增強(qiáng)-->
  <bean id="rentBeforeAdvice" class="net.deniro.spring4.aop.RentBeforeAdvice"/>

  <!-- 使用 BeanNameAutoProxyCreator-->
  <bean
      class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
      p:beanNames="*er"
      p:interceptorNames="rentBeforeAdvice"
      p:optimize="true"
      ></bean>
</beans>

BeanNameAutoProxyCreator的 beanNames 屬性允許指定一組需要自動(dòng)代理的 Bean 名稱(chēng), 這里可以使用 * 通配符 。

因?yàn)槲覀冃枰淼念?lèi)名分別是 user 與 charger,都是以 er 結(jié)尾的,所以我們這里定義為 *er。

也可以通過(guò) beanNames 的 value 值來(lái)明確指定需要代理的 Bean 名稱(chēng),多個(gè)以逗號(hào)分隔(更常用)。

<!-- 指定自動(dòng)代理的 Bean 名稱(chēng)-->
<property name="beanNames" value="user,charger">
</property>

也可以通過(guò) list 方式來(lái)指定 beanNames 的值:

<property name="beanNames">
  <list>
    <value>user</value>
    <value>charger</value>
  </list>
</property>

p:optimize 設(shè)置為 true,則表示使用 CGLib 動(dòng)態(tài)代理技術(shù)。

通過(guò)這樣的配置之后,容器在創(chuàng)建 user 和 charger Bean 的實(shí)例時(shí),就會(huì)自動(dòng)為它們創(chuàng)建代理對(duì)象,而這一操作對(duì)于使用者來(lái)說(shuō)完全是透明的 。

單元測(cè)試:

User user = (User) context.getBean("user");
Charger charger = (Charger) context.getBean("charger");

String userId = "001";
user.rent(userId);
charger.rent(userId);

輸出結(jié)果:

準(zhǔn)備租賃的用戶(hù) ID:001
User:租賃【充電寶】
準(zhǔn)備租賃的用戶(hù) ID:001
Charger:【充電寶】被租賃

3 DefaultAdvisorAutoProxyCreator

切面 Advisor 是切點(diǎn)和增強(qiáng)的復(fù)合體,而 DefaultAdvisorAutoProxyCreator 能夠掃描 Advisor, 并將 Advisor 自動(dòng)織入到匹配的目標(biāo) Bean 中。

<bean id="user" class="net.deniro.spring4.aop.User"/>
<bean id="charger" class="net.deniro.spring4.aop.Charger"/>

<!-- 前置增強(qiáng)-->
<bean id="rentBeforeAdvice" class="net.deniro.spring4.aop.RentBeforeAdvice"/>

<!-- 靜態(tài)正則表達(dá)式方法名匹配-->
<bean id="regexpAdvisor"
   class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
   p:advice-ref="rentBeforeAdvice">
  <!-- 匹配模式-->
  <property name="patterns">
    <list>
      <!-- 匹配字符串-->
      <value>.*rent.*</value>
    </list>
  </property>
</bean>

<!-- 使用 DefaultAdvisorAutoProxyCreator-->
<bean
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

首先我們配置了以靜態(tài)正則表達(dá)式方法名匹配的切面,然后直接配置了 DefaultAdvisorAutoProxyCreator Bean。

測(cè)試代碼與輸出結(jié)果與上一小節(jié)的 BeanNameAutoProxyCreator 相同。

JDK 動(dòng)態(tài)代理是通過(guò)接口來(lái)實(shí)現(xiàn)方法攔截,所以必須確保要攔截的目標(biāo)在接口中有定義。

CGLib 動(dòng)態(tài)代理是通過(guò)動(dòng)態(tài)生成代理子類(lèi)來(lái)實(shí)現(xiàn)方法攔截,所以必須確保要攔截的目標(biāo)方法可以被子類(lèi)所訪(fǎng)問(wèn),也就是目標(biāo)方法必須定義為非 final, 且非私有實(shí)例方法 。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Gradle的SpringBoot項(xiàng)目構(gòu)建圖解

    Gradle的SpringBoot項(xiàng)目構(gòu)建圖解

    這篇文章主要介紹了Gradle的SpringBoot項(xiàng)目構(gòu)建圖解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot之跨域過(guò)濾器配置允許跨域訪(fǎng)問(wèn)方式

    SpringBoot之跨域過(guò)濾器配置允許跨域訪(fǎng)問(wèn)方式

    這篇文章主要介紹了SpringBoot之跨域過(guò)濾器配置允許跨域訪(fǎng)問(wèn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java中CAS機(jī)制實(shí)現(xiàn)方法詳解

    Java中CAS機(jī)制實(shí)現(xiàn)方法詳解

    傳統(tǒng)的并發(fā)控制手段如synchronized和ReentrantLock雖有效防止資源競(jìng)爭(zhēng),卻可能引起性能開(kāi)銷(xiāo),相比之下,CAS(CompareAndSwap)提供一種輕量級(jí)的樂(lè)觀(guān)鎖策略,通過(guò)硬件級(jí)別的原子指令實(shí)現(xiàn)無(wú)鎖并發(fā),提高性能,需要的朋友可以參考下
    2024-09-09
  • SpringBoot中的五種對(duì)靜態(tài)資源的映射規(guī)則的實(shí)現(xiàn)

    SpringBoot中的五種對(duì)靜態(tài)資源的映射規(guī)則的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot中的五種對(duì)靜態(tài)資源的映射規(guī)則的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Spring Boot集成Ehcache緩存解決方式

    Spring Boot集成Ehcache緩存解決方式

    在本篇文章里小編給大家整理的是關(guān)于Spring Boot集成Ehcache緩存解決方式,需要的朋友們可以學(xué)習(xí)下。
    2019-12-12
  • Spring DATA JPA 中findAll 進(jìn)行OrderBy方式

    Spring DATA JPA 中findAll 進(jìn)行OrderBy方式

    這篇文章主要介紹了Spring DATA JPA 中findAll 進(jìn)行OrderBy方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • httpclient connect連接請(qǐng)求方法源碼解讀

    httpclient connect連接請(qǐng)求方法源碼解讀

    這篇文章主要為大家介紹了httpclient connect連接請(qǐng)求方法解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 探討Java驗(yàn)證碼制作(下篇)

    探討Java驗(yàn)證碼制作(下篇)

    這篇文章主要介紹了探討Java驗(yàn)證碼制作(下篇)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Java?多線(xiàn)程并發(fā)編程提高數(shù)據(jù)處理效率的詳細(xì)過(guò)程

    Java?多線(xiàn)程并發(fā)編程提高數(shù)據(jù)處理效率的詳細(xì)過(guò)程

    這篇文章主要介紹了Java?多線(xiàn)程并發(fā)編程提高數(shù)據(jù)處理效率,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • IDEA的Swing可視化插件JFormDesigner詳解

    IDEA的Swing可視化插件JFormDesigner詳解

    JFormDesigner是一個(gè)專(zhuān)業(yè)的軟件應(yīng)用程序,專(zhuān)門(mén)用于幫助您開(kāi)發(fā)Java?Swing用戶(hù)界面,而無(wú)需具備編程技能。它可作為獨(dú)立實(shí)用程序使用,也可以將其用作各種IDE的插件,本文給大家介紹idea?Swing可視化插件,感興趣的朋友一起看看吧
    2022-06-06

最新評(píng)論

兴安盟| 太原市| 漯河市| 广德县| 九龙城区| 金秀| 江西省| 襄汾县| 巩留县| 萨嘎县| 泊头市| 喀喇沁旗| 长白| 孟州市| 吕梁市| 神农架林区| 古田县| 法库县| 元江| 潼关县| 平遥县| 中阳县| 新源县| 紫金县| 即墨市| 江阴市| 黔西| 综艺| 白河县| 清远市| 永靖县| 永嘉县| 岳普湖县| 咸阳市| 东平县| 娄烦县| 浦东新区| 岢岚县| 扬中市| 靖西县| 班玛县|