SpringAOP中的PointcutAdvisor

55 篇文章 0 订阅
33 篇文章 0 订阅


        RegexpMethodPointcutAdvisor和NameMatchMethodPointcutAdvisor,它们都在org.springframework.aop.support包中,都可以过滤要拦截的方法,配置方法也大致相同,其中一个最主要的区别:
    RegexpMethodPointcutAdvisor:需要加上完整的类名和方法名,例如:com.package.classname.methodname或com.*.methodname或.*methodname。
    NameMatchMethodPointcutAdvisor:只需要方法名,不用加类名,例如:*methodname。

注意:需要spring-aop-2.5.1.jar、aopalliance-1.0.jar

1、RegexpMethodPointcutAdvisor:

接口:

package com.yourcompany.spring.spring1;

public interface Sleepable {
	public void sleep();  
}

实现:

package com.yourcompany.spring.spring1;

public class Human implements Sleepable {
	public void sleep() {
		System.out.println("人类睡觉...");  
	}
}

消息:

package com.yourcompany.spring.spring1;

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {
	public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {  
		System.out.println("睡觉前要脱衣服!");  
	}  
	public void afterReturning(Object arg0, Method arg1, Object[] arg2,Object arg3) throws Throwable {  
		System.out.println("起床后要穿衣服!");  
	}  
}

applicationContext.xml:

<?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.5.xsd">

	<bean id="human" class="com.yourcompany.spring.spring1.Human"/>
	<bean id="advice" class="com.yourcompany.spring.spring1.SleepHelper"/>
	
	<bean id="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice" ref="advice" />
		<property name="pattern" value=".*sleep" />
	</bean>

	<bean id="humanProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target" ref="human"/>
		<property name="interceptorNames">
			<list>
				<value>sleepAdvisor</value>
			</list>
		</property>
	</bean>
</beans>

程序主入口:

package com.yourcompany.spring.spring1;

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

public class Test {
	public static void main(String[] args) {
		 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	         Sleepable sleeper = (Sleepable)context.getBean("humanProxy");
	         sleeper.sleep();
	}
}

2、NameMatchMethodPointcutAdvisor:

接口:

package com.yourcompany.spring.spring2;

public interface Sleepable {
	public void sleep();  
}

实现:

package com.yourcompany.spring.spring2;

public class Human implements Sleepable {
	public void sleep() {
		System.out.println("人类睡觉...");  
	}
}

消息:

package com.yourcompany.spring.spring1;

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {
	public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {  
		System.out.println("睡觉前要脱衣服!");  
	}  
	public void afterReturning(Object arg0, Method arg1, Object[] arg2,Object arg3) throws Throwable {  
		System.out.println("起床后要穿衣服!");  
	}  
}

applicationContext.xml:

<?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.5.xsd">

	<bean id="advice" class="com.yourcompany.spring.spring2.SleepHelper"/>
	
	<bean id="sleepAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
		<property name="mappedName" value="*sleep" />
		<property name="advice" ref="advice" />
	</bean>

	<bean id="humanProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target">
			<bean id="human" class="com.yourcompany.spring.spring2.Human"></bean>
		</property>
		<property name="interceptorNames">
			<list>
				<value>sleepAdvisor</value>
			</list>
		</property>
	</bean>
</beans>

程序主入口:

package com.yourcompany.spring.spring1;

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

public class Test {
	public static void main(String[] args) {
		 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	         Sleepable sleeper = (Sleepable)context.getBean("humanProxy");
	         sleeper.sleep();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值