spring中最強大的Advisor-DefaultPointcutAdvisor

來源:互聯網
上載者:User

  NameMatchMethodPointcutAdvisor和RegexMethodPointcutAdvisor提供了對一定命名規則和Regex切入點的封裝,defaultPointcutAdvisor則提供了一切切入點的支援,Spring提供了4種用來定義切入的類,分別為:org.springframework.aop.support.NameMatchMethodPointcut、org.springframework.aop.support.JdkRegexpMethodPointcut、org.springframework.aop.support.Perl5RegexpMethodPointcut,org.springframework.aop.support.ExpressionPointcut,這四種可以用來描述切入點的類均可由DefaultPointcutAdvisor來進行封裝,首先我們講解一下DefaultPointcutAdvisor的使用方法:

   DefaultPointcutAdvisor類的使用很簡單,他有一個 advice及 pointcut 屬性,advice屬性用來指明要使用的通知,pointcut屬性用來指定切入點,我們可以通過構造子或設值注入方式來配置這個 Bean。看下面的構造子注入方式:   

<bean id="defaultAdvisor" 
   class="org.springframework.aop.support.DefaultPointcutAdvisor"> 
   <constructor-arg ref="adviceBean"/> 
   <constructor-arg ref="poingcutBean"/> 
  </bean> 

或者使用設值方法注入,如下所示:<bean id="defaultAdvisor" 
   class="org.springframework.aop.support.DefaultPointcutAdvisor"> 
   <property name="advice" ref="adviceBean"></property> 
   <property name="pointcut" ref="pointcutBean"></property> 
 </bean>

 

下面集合這四種切入點的描述類一起講解DefaultPointcutAdvisor:1、org.springframework.aop.support.NameMatchMethodPointcut   將前面的RegexpMethodPointcutAdvisor的配置換成NameMatchMethodPointcut結合DefaultPointcutAdvisor只需要修改設定檔,最終配置如下: 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    <bean id="beforeAdvice"
       class="spring.chapter3.advice.AdviceBeforeComponent" />
    <bean id="component" class="spring.chapter3.proxy.Component" />
<bean id="pointcutBean" class="org.springframework.aop.support.NameMatchMethodPointcut">
    <property name="mappedNames"> 
    <list> 
     <value>business*</value> 
      </list> 
   </property> 
</bean>
    <bean id="defaultAdvisor"       class="org.springframework.aop.support.DefaultPointcutAdvisor">
       <property name="advice" ref=" beforeAdvice "/>
       <property name="pointcut" ref="pointcutBean" />
    </bean>
    <bean id="proxy"
       class="org.springframework.aop.framework.ProxyFactoryBean">
       <property name="proxyInterfaces"
           value="spring.chapter3.proxy.IComponent" />
       <property name="target" ref="component" />
       <property name="interceptorNames">
           <list>
              <value>defaultAdvisor</value>
           </list>
       </property>
    </bean>
</beans>NameMatchMethodPointcut只有一個屬性mappedName或者mappedNames,前者表示映射單個字串,後者表示映射一組字串,支援<list>配置,這裡“business*”表示所有business開頭的方法,這裡的“*”是萬用字元不是Regex,可以看出DefaultPointcutAdvisor的配置也很簡單,就是給advice屬性指定為beforeAdvice也就是前置通知,同時給pointcut屬性指向了配置的NameMatchMethodPointcut。2、org.springframework.aop.support.JdkRegexpMethodPointcut、   org.springframework.aop.support.Perl5RegexpMethodPointcut   由於這2個都是Regex切入點的描述,所以這裡就放到一起對比講解,JdkRegexpMethodPointcut需要在 JDK1.4 及以上的環境運行,不需要額外的庫;Perl5RegexpMethodPointcut需要把 jakarta-oro-xx.jar 檔案放到 classpath 上,比如 jakarta-oro-2.0.8.jar,這2個Regex切入點描述類的使用方法一樣,他們均有2個屬性: (1) pattern或patterns:前者表示單個Regex,後置表示多個Regex,支援<list>配置; (2) ExcludedPattern或ExcludedPatterns:前者表示排除某個字串,後者表示排除一組字串,支援<list>配置; 根據上面的講述我們將前面的NameMatchMethodPoint改成JdkRegexpMethodPointcut和Perl5RegexpMethodPointcut配置,分別如下:   JdkRegexpMethodPointcut配置:  

  ...
<bean id="pointcutBean"
class="org.springframework.aop.support. JdkRegexpMethodPointcut">
    <property name="pattern"> 
         <value>.*business.*</value> 
      </property> 
     <property name="ExcludedPattern"> 
         <value>business2</value> 
      </property>
</bean>
    ...

   這裡表示匹配所有business開頭的方法但是除去了business2這個方法,其他的配置和NameMatchMethodPointcut一樣。 Perl5RegexpMethodPointcut配置:   

...
<bean id="pointcutBean"
class="org.springframework.aop.support. Perl5RegexpMethodPointcut">
    <property name="pattern"> 
         <value>.*business.*</value> 
      </property> 
     <property name="ExcludedPattern"> 
         <value>business2</value> 
      </property>
</bean>
    ...這裡只需要給class換成 org.springframework.aop.support. Perl5RegexpMethodPointcut就可以了,同時在classpath中要添加jakarta-oro-xx.jar檔案,其他的不需要做任何改變。3、org.springframework.aop.support.ExpressionPointcut   在 Spring2 中,在 Pointcut 的基礎上,引入了一個 ExpressionPointcut 介面用來通過切入點表達語言來描述切入點。有了 ExpressionPointcut,我們可以使用下面更加簡單的方式來描述切入點,如 execution(* Component.business*(..))表示執行所有 Component 的業務方法(此處為 business 打頭的方法)。 Spring2 提供了一個 ExpressionPointcut 的實現,即 AspectJExpressionPointcut,該類的使用很簡單,只需要做如下配置即可:...
   <bean id="pointcutBean" 
class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
 <property name="expression" 
    value="execution(void spring.chapter3.proxy.Component.business*(..))"> 
   </property> 
 </bean>
...其他的配置和前面的幾個均一樣。除了以上4種不同的切入點的應用,還可以自訂切入點進行某些特殊的運用,自訂切入點類只需要實現org.springframework.aop.pointcut類,然後再bean中聲明該類,接著就可以使用這些自定的pointcut類了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.