spring切入點使用

package cuigh.spring.aop.step02;

import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.NameMatchMethodPointcut;

public class NameMatchMethodPointcutExample {

	/**
	 * 功能:演示簡單的名字匹配
	 */
	public static void main(String[] args) {
		
		//創建目標對象
		Math1 math1 = new Math1();
		Math2 math2 = new Math2();
		
		Math1 math1Proxy;
		Math2 math2Proxy;
		int a=10,b=2;

		//創建切入點
		//Pointcut pointcut = new MyStaticPoincut();
		NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
		//只通知 add() 方法
		pointcut.addMethodName("add");
		
		//創建通知
		Advice advice = new MyAdvice();
		//創建通知者
		Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
		
		//創建目標對象 math1 的代理
		ProxyFactory pf = new ProxyFactory();
		//設置通知者
		pf.addAdvisor(advisor);
		//設置目標對象
		pf.setTarget(math1);
					
		math1Proxy = (Math1)pf.getProxy();
		math1Proxy.add(a, b);
		math1Proxy.sub(a, b);
		System.out.println("------------------------------");
		//創建目標對象 math12的代理
		pf = new ProxyFactory();
		//設置目標對象
		pf.setTarget(math2);
		//設置通知者
		pf.addAdvisor(advisor);
		
		math2Proxy = (Math2)pf.getProxy();
		math2Proxy.add(a, b);
		math2Proxy.sub(a, b);

	}

}

上篇演示了靜態方法匹配器的使用,下面把其它使用方法也舉例使用一下。

  1.  spring動態方法匹配器切入點使用

package cuigh.spring.aop.step02;

import java.lang.reflect.Method;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;

public class MyDynamicPointcut extends DynamicMethodMatcherPointcut {

	/*
	 * public boolean matches(Method method, Class<?> targetClass) {
	 * 與StaticMethodMatcherPointcut相比,多一個參數:args,可以對參數在更細緻的通知
	 * */
	@Override
	public boolean matches(Method method, Class<?> targetClass, Object[] args) {
		// TODO Auto-generated method stub
		System.out.println("實現類="+this.getClass().getName());
		return ( ("sub".equals(method.getName()) && (targetClass==Math1.class))
				|| ("add".equals(method.getName()) && (targetClass==Math2.class))
		);
	}
}

package cuigh.spring.aop.step02;
import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
/**
 * 功能:演示spring動態方法匹配器切入點使用
 */
public class AdvisorDynamicExample {

	public static void main(String[] args) {
		//創建目標對象
		Math1 math1 = new Math1();
		Math2 math2 = new Math2();
		
		Math1 math1Proxy;
		Math2 math2Proxy;
		int a=10,b=2;

		//創建切入點
		Pointcut pointcut = new MyDynamicPointcut();
		
		
		//創建通知
		Advice advice = new MyAdvice();
		//創建通知者
		Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
		
		//創建目標對象 math1 的代理
		ProxyFactory pf = new ProxyFactory();
		//設置通知者
		pf.addAdvisor(advisor);
		//設置目標對象
		pf.setTarget(math1);
					
		math1Proxy = (Math1)pf.getProxy();
		math1Proxy.add(a, b);
		math1Proxy.sub(a, b);
		System.out.println("------------------------------");
		//創建目標對象 math12的代理
		pf = new ProxyFactory();
		//設置目標對象
		pf.setTarget(math2);
		//設置通知者
		pf.addAdvisor(advisor);
		
		math2Proxy = (Math2)pf.getProxy();
		math2Proxy.add(a, b);
		math2Proxy.sub(a, b);
	}
}
2 簡單的名字匹配


3 JDK正則表達式匹配
package cuigh.spring.aop.step02;

import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;

public class RegexpMethodPointcutExample {

	/**
	 * 功能:演示JDK正則表達式匹配
	 */
	public static void main(String[] args) {
		
		//創建目標對象
		Math1 math1 = new Math1();
		Math2 math2 = new Math2();
		
		Math1 math1Proxy;
		Math2 math2Proxy;
		int a=10,b=2;

		//創建切入點
		JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
		//只通知 sub() 方法
		pointcut.setPattern(".*sub.*");
		
		//創建通知
		Advice advice = new MyAdvice();
		//創建通知者
		Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
		
		//創建目標對象 math1 的代理
		ProxyFactory pf = new ProxyFactory();
		//設置通知者
		pf.addAdvisor(advisor);
		//設置目標對象
		pf.setTarget(math1);
					
		math1Proxy = (Math1)pf.getProxy();
		math1Proxy.add(a, b);
		math1Proxy.sub(a, b);
		System.out.println("------------------------------");
		//創建目標對象 math12的代理
		pf = new ProxyFactory();
		//設置目標對象
		pf.setTarget(math2);
		//設置通知者
		pf.addAdvisor(advisor);
		
		math2Proxy = (Math2)pf.getProxy();
		math2Proxy.add(a, b);
		math2Proxy.sub(a, b);

	}

}




發佈了36 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章