欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1 BeanPostProcessor

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

類型 實現(xiàn)類
基于 Bean 配置名規(guī)則 BeanNameAutoProxyCreator
基于 Advisor 匹配規(guī)則 DefaultAdvisorAutoProxyCreator
基于 Bean 中的 AspectJ 注解標簽的匹配規(guī)則 AnnotationAwareAspectJAutoProxyCreator

BeanPostProcessor 類繼承關系

所有的自動代理器類都實現(xiàn)了 BeanPostPorcessor ,在容器實例化 Bean 時, BeanPostProcessor 將對它進行加工處理,所以自動代理創(chuàng)建器能夠對滿足匹配規(guī)則的 bean 自動創(chuàng)建代理對象。

2 BeanNameAutoProxyCreator
假設有以下兩個實體類(用戶與充電寶)。

用戶類:

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:【充電寶】被租賃");
  }
}

我們希望通過 BeanNameAutoProxyCreator 通過 Bean 的名稱來自動創(chuàng)建代理,實現(xiàn)增強:

<?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"/>

  <!-- 前置增強-->
  <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 屬性允許指定一組需要自動代理的 Bean 名稱, 這里可以使用 * 通配符 。

因為我們需要代理的類名分別是 user 與 charger,都是以 er 結尾的,所以我們這里定義為 *er。

也可以通過 beanNames 的 value 值來明確指定需要代理的 Bean 名稱,多個以逗號分隔(更常用)。

<!-- 指定自動代理的 Bean 名稱-->
<property name="beanNames" value="user,charger">
</property>

也可以通過 list 方式來指定 beanNames 的值:

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

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

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

單元測試:

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

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

輸出結果:

準備租賃的用戶 ID:001
User:租賃【充電寶】
準備租賃的用戶 ID:001
Charger:【充電寶】被租賃

3 DefaultAdvisorAutoProxyCreator

切面 Advisor 是切點和增強的復合體,而 DefaultAdvisorAutoProxyCreator 能夠掃描 Advisor, 并將 Advisor 自動織入到匹配的目標 Bean 中。

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

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

<!-- 靜態(tài)正則表達式方法名匹配-->
<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)正則表達式方法名匹配的切面,然后直接配置了 DefaultAdvisorAutoProxyCreator Bean。

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

JDK 動態(tài)代理是通過接口來實現(xiàn)方法攔截,所以必須確保要攔截的目標在接口中有定義。

CGLib 動態(tài)代理是通過動態(tài)生成代理子類來實現(xiàn)方法攔截,所以必須確保要攔截的目標方法可以被子類所訪問,也就是目標方法必須定義為非 final, 且非私有實例方法 。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 并發(fā)編程ConcurrentLinkedQueue示例詳解

    并發(fā)編程ConcurrentLinkedQueue示例詳解

    這篇文章主要為大家介紹了并發(fā)編程ConcurrentLinkedQueue使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • JSP代碼實現(xiàn) 金字塔(倒置)示例

    JSP代碼實現(xiàn) 金字塔(倒置)示例

    這篇文章主要介紹了JSP代碼實現(xiàn) 金字塔(倒置)示例,需要的朋友可以參考下
    2014-02-02
  • java秒殺系統(tǒng)常見問題庫存超賣解決實例分析

    java秒殺系統(tǒng)常見問題庫存超賣解決實例分析

    這篇文章主要為大家介紹了java秒殺系統(tǒng)常見問題庫存超賣解決實例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Spring?Boot配置內(nèi)容加密實現(xiàn)敏感信息保護

    Spring?Boot配置內(nèi)容加密實現(xiàn)敏感信息保護

    之前我們講過的配置相關知識都是Spring?Boot原生就提供的,而今天我們將介紹的功能并非Spring?Boot原生就支持,但卻非常有用:配置內(nèi)容的加密
    2021-11-11
  • MybatisPlus條件查詢的具體使用

    MybatisPlus條件查詢的具體使用

    MybatisPlus通過條件構造器可以組裝復雜的查詢條件,本文主要介紹了MybatisPlus條件查詢的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Spring?MVC請求處理流程和九大組件詳解

    Spring?MVC請求處理流程和九大組件詳解

    這篇文章主要介紹了Spring?MVC請求處理流程和九大組件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Java設計模式之橋接模式詳解

    Java設計模式之橋接模式詳解

    橋接模式(Bridge Pattern)是一種結構型設計模式,用于將抽象部分和實現(xiàn)部分`分離開來,從而使它們可以獨立地進行變化,本節(jié)給大家講一下設計模式中的橋接模式,并結合實際業(yè)務場景給大家講解如何使用,需要的朋友可以參考下
    2023-07-07
  • 使用springboot不自動初始化數(shù)據(jù)庫連接池

    使用springboot不自動初始化數(shù)據(jù)庫連接池

    這篇文章主要介紹了使用springboot不自動初始化數(shù)據(jù)庫連接池,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Netty?拆包沾包問題解決方案詳解

    Netty?拆包沾包問題解決方案詳解

    這篇文章主要為大家介紹了Netty?拆包沾包問題解決方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • java中i = i++和i =++i的深入講解

    java中i = i++和i =++i的深入講解

    這篇文章主要介紹了java中i = i++和i =++i的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論