jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks

          Spring AOP中的pointcut

          PointCuts用于定義所需要“攔截”的class及其method。分為靜態(tài)、動(dòng)態(tài)兩種pointcut。其中靜態(tài)pointcuts僅和class name, method name相關(guān),可以在配置文件中通過正則表達(dá)式進(jìn)行部署,因此它們都可以在運(yùn)行前進(jìn)行確認(rèn)。而動(dòng)態(tài)pointcuts則需要考慮到方法的參數(shù),在運(yùn)行時(shí)動(dòng)態(tài)的確認(rèn)pointcuts。一般來說,都是根據(jù)methodclass的名字來進(jìn)行。其涉及到的接口如下定義:

          public interface Pointcut {

              ClassFilter getClassFilter();

              MethodMatcher getMethodMatcher();

          }

          public interface ClassFilter {

              boolean matches(Class clazz);

          }

          public interface MethodMatcher {

              boolean matches(Method m, Class targetClass);

              boolean isRuntime();

              boolean matches(Method m, Class targetClass, Object[] args);

          }

          兩種靜態(tài)pointcut的實(shí)現(xiàn):

          NameMatchMethodPointcut:只能對(duì)方法名進(jìn)行判別。

          RegexpMethodPointcut:可以對(duì)類名、方法名使用正則表達(dá)式判別。

          <beans>

                 <bean id="maidServiceTarget"

                        class="com.springinaction.chapter03.cleaning.MaidService"/>

                

                 <bean id="queryInterceptor" class="com.springinaction.chapter03.cleaning.QueryInterceptor"/>

           

                 <bean id="queryPointcutAdvisor"

                        class="org.springframework.aop.support.RegExpPointcutAdvisor">

                        <property name="pattern">

                               <value>.*get.+By.+</value>

                        </property>

                        <property name="advice">

                               <ref bean="queryInterceptor"/>

                        </property>

                 </bean>

                

                 <bean id="maidService"

                        class="org.springframework.aop.framework.ProxyFactoryBean">

                        <property name="proxyInterfaces">

                               <value>com.springinaction.chapter03.cleaning.MaidService</value>

                        </property>

                        <property name="interceptorNames">

                               <list>

                                      <value>queryPointcutAdvisor</value>

                               </list>

                        </property>

                        <property name="target">

                               <value ref="maidServiceTarget">

                        </property>

                 </bean>

          </beans>

          一種動(dòng)態(tài)pointcut的實(shí)現(xiàn):

          ControlFlowPointcut:根據(jù)當(dāng)前運(yùn)行棧的情況,決定當(dāng)前的advice是否需要被觸發(fā)。因?yàn)樗耆谶\(yùn)行時(shí)棧的情況做決策,所以運(yùn)行速度肯定會(huì)變慢。

          <beans>

                 <bean id="myServiceTarget" class="MyServiceImpl"/>

                

                 <bean id="servletInterceptor" class="MyServletInterceptor"/>

                

                 <bean id="servletPointcut" class="org.springframework.aop.support.ControlFlowPointcut">

                        <constructor-arg>

                               <value>javax.servlet.http.HttpServlet</value>

                        </constructor-arg>

                 </bean>

           

                 <bean id="servletAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">

                        <property name="advice">

                               <ref bean="servletInterceptor"/>

                        </property>

                        <property name="pointcut">

                               <ref bean="servletPointcut"/>

                        </property>

                 </bean>

                 <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">

                        <property name="proxyInterfaces">

                               <value>MyService</value>

                        </property>

                        <property name="interceptorNames">

                               <list>

                                      <value>servletAdvisor</value>

                               </list>

                        </property>

                        <property name="target">

                               <value ref="myServiceTarget">

                        </property>

                 </bean>

          </beans>

          posted on 2005-03-02 17:33 jinfeng_wang 閱讀(2422) 評(píng)論(0)  編輯  收藏 所屬分類: spring
          主站蜘蛛池模板: 郧西县| 平谷区| 阿克陶县| 栾川县| 邵东县| 瓦房店市| 涟源市| 景谷| 易门县| 林口县| 四川省| 章丘市| 昭平县| 交口县| 东平县| 衡阳市| 苍溪县| 台中市| 灵寿县| 漠河县| 凉山| 车致| 和龙市| 高唐县| 定州市| 甘肃省| 博白县| 宝应县| 安图县| 武威市| 祥云县| 太湖县| 定日县| 高州市| 铜陵市| 井研县| 昂仁县| 榆社县| 平邑县| 宣恩县| 安多县|