1. 程式人生 > >SSM-Spring-12:Spring中NameMatchMethodPointcutAdvisor名稱匹配方法切入點顧問

SSM-Spring-12:Spring中NameMatchMethodPointcutAdvisor名稱匹配方法切入點顧問

cep con ram -c intercept cts str framework 所有

------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------

advice 是通知
advisor 是顧問

顧問(Advisor)  

  通知Advice是Spring提供的一種切面(Aspect)。但其功能過於簡單,只能將切面織入到目標類的所有目標方法中,無法完成將切面織入到指定目標方法中。

  顧問Advisor是Spring提供的另一種切面。其可以完成更為復雜的切面織入功能,能選擇性的將增強切面中的部分方法。

  PointcutAdvisor是顧問的一種,可以指定具體的切入點。顧問將通知進行了包裝,會根據不同的通知類型,在不同的時間點,將切面織入到不同的切入點。

  PointcutAdvisor接口有兩個較為常用的實現類:
    *:NameMatchMethodPointcutAdvisor 名稱匹配方法切入點顧問
    *: RegexpMethodPointcutAdvisor 正則表達式方法切入點顧問

    <property name="pattern" value=".*do.*"></property> 表示方法全名(包名,接口名,方法名)
    運算符 名稱 意義
    . 點號 表示任意單個字符
    + 加號 表示前一個字符出現一次或者多次


    * 星號 表示前一個字符出現0次或者多次

    名稱匹配方法切入點顧問 NameMatchMethodPointcutAdvisor
    <!-- 03.配置顧問 advisor 包裝 advice-->
    <bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
      <property name="advice" ref="beforeAdvice"></property>


      <property name="mappedNames" value="do*"></property>
    </bean>

名稱匹配方法切入點顧問方法的案例

  一個需要增強的類:SomeServiceImpl

package cn.dawn.day15advisor01;


/**
 * Created by Dawn on 2018/3/8.
 */
public class SomeServiceImpl {
    public void doSome() {
        System.out.println("do something");
    }
    public void doAny() {
        System.out.println("do Any");
    }
}

  增強內容的類

package cn.dawn.day15advisor01;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

/**
 * Created by Dawn on 2018/3/5.
 */
/*後置增強*/
public class LoggerAfter implements AfterReturningAdvice {
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println("===============after==================");
    }
}

  配置文件

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--要增強的對象-->
    <bean id="service" class="cn.dawn.day15advisor01.SomeServiceImpl"></bean>
    <!--增強的內容-->
    <bean id="myadvice" class="cn.dawn.day15advisor01.LoggerAfter"></bean>
    <!--顧問-->
    <bean id="myadvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <property name="advice" ref="myadvice"></property>
        <!--<property name="mappedNames" value="do*"></property>-->
        <property name="mappedNames" value="doAny"></property>
    </bean>
    <!--代理工廠bean-->
    <bean id="proxyfactory" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!--要增強的對象-->
        <property name="target" ref="service"></property>
        <!--增強的內容-->
        <property name="interceptorNames" value="myadvisor"></property>
    </bean>

</beans>

  顧問的mappedNames的值可以做操作,讓你想讓匹配到的方法才能匹配到,可以用可以說是?通配符?的方式,類似do*或者直接寫方法名doAny或者用逗號分割倆個方法dosome,doAny

  少年,你明白了嗎?

  單測方法:

package cn.dawn.day15advisor01;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by Dawn on 2018/3/3.
 */
public class test20180305 {
    @Test
    /*aop代理工廠bean異常增強*/
    public void t01(){
        ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day15advisor01.xml");
        SomeServiceImpl service = (SomeServiceImpl) context.getBean("proxyfactory");

        service.doSome();
        service.doAny();

    }
}

SSM-Spring-12:Spring中NameMatchMethodPointcutAdvisor名稱匹配方法切入點顧問