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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章