[转贴]spring中最强大的Advisor-DefaultPointcutAdvisor
2008-08-05 12:20
435 查看
Spring2中除了NameMatchMethodPointcutAdvisor和RegexMethodPointcutAdvisor提供了对一定命名规则和正则表达式切入点的封装,defaultPointcutAdvisor则提供了一切切入点的支持,Spring提供了4种用来定义切入的类,分别为:
org.springframework.aop.support.NameMatchMethodPointcut、
org.springframework.aop.support.JdkRegexpMethodPointcut、org.springframework.aop.support.Perl5RegexpMethodPointcut,
org.springframework.aop.support.ExpressionPointcut,
这四种可以用来描述切入点的类均可由DefaultPointcutAdvisor来进行封装,首先我们讲解一下DefaultPointcutAdvisor的使用方法:
DefaultPointcutAdvisor类的使用很简单,他有一个 advice及 pointcut 属性,advice属性用来指明要使用的通知,pointcut属性用来指定切入点,我们可以通过构造子或设值注入方式来配置这个 Bean。看下面的构造子注入方式:
<bean id="defaultAdvisor"
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<constructor-arg ref="adviceBean"/>
<constructor-arg ref="poingcutBean"/>
</bean>
或者使用设值方法注入,如下所示:
<bean id="defaultAdvisor"
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="adviceBean"></property>
<property name="pointcut" ref="pointcutBean"></property>
</bean>
下面集合这四种切入点的描述类一起讲解DefaultPointcutAdvisor:
1、org.springframework.aop.support.NameMatchMethodPointcut
将前面的RegexpMethodPointcutAdvisor的配置换成NameMatchMethodPointcut结合DefaultPointcutAdvisor只需要修改配置文件,最终配置如下:
<?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.0.xsd">
<bean id="beforeAdvice"
class="spring.chapter3.advice.AdviceBeforeComponent" />
<bean id="component" class="spring.chapter3.proxy.Component" />
<bean id="pointcutBean" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>business*</value>
</list>
</property>
</bean>
<bean id="defaultAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref=" beforeAdvice "/>
<property name="pointcut" ref="pointcutBean" />
</bean>
<bean id="proxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"
value="spring.chapter3.proxy.IComponent" />
<property name="target" ref="component" />
<property name="interceptorNames">
<list>
<value>defaultAdvisor</value>
</list>
</property>
</bean>
</beans>
NameMatchMethodPointcut只有一个属性mappedName或者mappedNames,前者表示映射单个字符串,后者表示映射一组字符串,支持<list>配置,这里“business*”表示所有business开头的方法,这里的“*”是通配符不是正则表达式,可以看出DefaultPointcutAdvisor的配置也很简单,就是给advice属性指定为beforeAdvice也就是前置通知,同时给pointcut属性指向了配置的NameMatchMethodPointcut。
2、org.springframework.aop.support.JdkRegexpMethodPointcut、
org.springframework.aop.support.Perl5RegexpMethodPointcut
由于这2个都是正则表达式切入点的描述,所以这里就放到一起对比讲解,JdkRegexpMethodPointcut需要在 JDK1.4 及以上的环境运行,不需要额外的库;Perl5RegexpMethodPointcut需要把 jakarta-oro-xx.jar 文件放到 classpath 上,比如 jakarta-oro-2.0.8.jar,这2个正则表达式切入点描述类的使用方法一样,他们均有2个属性:
(1) pattern或patterns:前者表示单个正则表达式,后置表示多个正则表达式,支持<list>配置;
(2) ExcludedPattern或ExcludedPatterns:前者表示排除某个字符串,后者表示排除一组字符串,支持<list>配置;
根据上面的讲述我们将前面的NameMatchMethodPoint改成JdkRegexpMethodPointcut和Perl5RegexpMethodPointcut配置,分别如下:
JdkRegexpMethodPointcut配置:
...
<bean id="pointcutBean"
class="org.springframework.aop.support. JdkRegexpMethodPointcut">
<property name="pattern">
<value>.*business.*</value>
</property>
<property name="ExcludedPattern">
<value>business2</value>
</property>
</bean>
...
这里表示匹配所有business开头的方法但是除去了business2这个方法,其他的配置和NameMatchMethodPointcut一样。
Perl5RegexpMethodPointcut配置:
...
<bean id="pointcutBean"
class="org.springframework.aop.support. Perl5RegexpMethodPointcut">
<property name="pattern">
<value>.*business.*</value>
</property>
<property name="ExcludedPattern">
<value>business2</value>
</property>
</bean>
...
这里只需要给class换成org.springframework.aop.support. Perl5RegexpMethodPointcut就可以了,同时在classpath中要添加jakarta-oro-xx.jar文件,其他的不需要做任何改变。
3、org.springframework.aop.support.ExpressionPointcut
在 Spring2 中,在 Pointcut 的基础上,引入了一个 ExpressionPointcut 接口用来通过切入点表达语言来描述切入点。有了 ExpressionPointcut,我们可以使用下面更加简单的方式来描述切入点,如 execution(* Component.business*(..))表示执行所有 Component 的业务方法(此处为 business 打头的方法)。
Spring2 提供了一个 ExpressionPointcut 的实现,即 AspectJExpressionPointcut,该类的使用很简单,只需要做如下配置即可:
...
<bean id="pointcutBean"
class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
<property name="expression"
value="execution(void spring.chapter3.proxy.Component.business*(..))">
</property>
</bean>
...
其他的配置和前面的几个均一样。
除了以上4种不同的切入点的应用,还可以自定义切入点进行某些特殊的运用,自定义切入点类只需要实现org.springframework.aop.pointcut类,然后再bean中声明该类,接着就可以使用这些自定的pointcut类了。
文章系erikchang所有,EasyJF版权所有,转载请注明出处!
觉得很有用,就转了.
org.springframework.aop.support.NameMatchMethodPointcut、
org.springframework.aop.support.JdkRegexpMethodPointcut、org.springframework.aop.support.Perl5RegexpMethodPointcut,
org.springframework.aop.support.ExpressionPointcut,
这四种可以用来描述切入点的类均可由DefaultPointcutAdvisor来进行封装,首先我们讲解一下DefaultPointcutAdvisor的使用方法:
DefaultPointcutAdvisor类的使用很简单,他有一个 advice及 pointcut 属性,advice属性用来指明要使用的通知,pointcut属性用来指定切入点,我们可以通过构造子或设值注入方式来配置这个 Bean。看下面的构造子注入方式:
<bean id="defaultAdvisor"
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<constructor-arg ref="adviceBean"/>
<constructor-arg ref="poingcutBean"/>
</bean>
或者使用设值方法注入,如下所示:
<bean id="defaultAdvisor"
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="adviceBean"></property>
<property name="pointcut" ref="pointcutBean"></property>
</bean>
下面集合这四种切入点的描述类一起讲解DefaultPointcutAdvisor:
1、org.springframework.aop.support.NameMatchMethodPointcut
将前面的RegexpMethodPointcutAdvisor的配置换成NameMatchMethodPointcut结合DefaultPointcutAdvisor只需要修改配置文件,最终配置如下:
<?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.0.xsd">
<bean id="beforeAdvice"
class="spring.chapter3.advice.AdviceBeforeComponent" />
<bean id="component" class="spring.chapter3.proxy.Component" />
<bean id="pointcutBean" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>business*</value>
</list>
</property>
</bean>
<bean id="defaultAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref=" beforeAdvice "/>
<property name="pointcut" ref="pointcutBean" />
</bean>
<bean id="proxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"
value="spring.chapter3.proxy.IComponent" />
<property name="target" ref="component" />
<property name="interceptorNames">
<list>
<value>defaultAdvisor</value>
</list>
</property>
</bean>
</beans>
NameMatchMethodPointcut只有一个属性mappedName或者mappedNames,前者表示映射单个字符串,后者表示映射一组字符串,支持<list>配置,这里“business*”表示所有business开头的方法,这里的“*”是通配符不是正则表达式,可以看出DefaultPointcutAdvisor的配置也很简单,就是给advice属性指定为beforeAdvice也就是前置通知,同时给pointcut属性指向了配置的NameMatchMethodPointcut。
2、org.springframework.aop.support.JdkRegexpMethodPointcut、
org.springframework.aop.support.Perl5RegexpMethodPointcut
由于这2个都是正则表达式切入点的描述,所以这里就放到一起对比讲解,JdkRegexpMethodPointcut需要在 JDK1.4 及以上的环境运行,不需要额外的库;Perl5RegexpMethodPointcut需要把 jakarta-oro-xx.jar 文件放到 classpath 上,比如 jakarta-oro-2.0.8.jar,这2个正则表达式切入点描述类的使用方法一样,他们均有2个属性:
(1) pattern或patterns:前者表示单个正则表达式,后置表示多个正则表达式,支持<list>配置;
(2) ExcludedPattern或ExcludedPatterns:前者表示排除某个字符串,后者表示排除一组字符串,支持<list>配置;
根据上面的讲述我们将前面的NameMatchMethodPoint改成JdkRegexpMethodPointcut和Perl5RegexpMethodPointcut配置,分别如下:
JdkRegexpMethodPointcut配置:
...
<bean id="pointcutBean"
class="org.springframework.aop.support. JdkRegexpMethodPointcut">
<property name="pattern">
<value>.*business.*</value>
</property>
<property name="ExcludedPattern">
<value>business2</value>
</property>
</bean>
...
这里表示匹配所有business开头的方法但是除去了business2这个方法,其他的配置和NameMatchMethodPointcut一样。
Perl5RegexpMethodPointcut配置:
...
<bean id="pointcutBean"
class="org.springframework.aop.support. Perl5RegexpMethodPointcut">
<property name="pattern">
<value>.*business.*</value>
</property>
<property name="ExcludedPattern">
<value>business2</value>
</property>
</bean>
...
这里只需要给class换成org.springframework.aop.support. Perl5RegexpMethodPointcut就可以了,同时在classpath中要添加jakarta-oro-xx.jar文件,其他的不需要做任何改变。
3、org.springframework.aop.support.ExpressionPointcut
在 Spring2 中,在 Pointcut 的基础上,引入了一个 ExpressionPointcut 接口用来通过切入点表达语言来描述切入点。有了 ExpressionPointcut,我们可以使用下面更加简单的方式来描述切入点,如 execution(* Component.business*(..))表示执行所有 Component 的业务方法(此处为 business 打头的方法)。
Spring2 提供了一个 ExpressionPointcut 的实现,即 AspectJExpressionPointcut,该类的使用很简单,只需要做如下配置即可:
...
<bean id="pointcutBean"
class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
<property name="expression"
value="execution(void spring.chapter3.proxy.Component.business*(..))">
</property>
</bean>
...
其他的配置和前面的几个均一样。
除了以上4种不同的切入点的应用,还可以自定义切入点进行某些特殊的运用,自定义切入点类只需要实现org.springframework.aop.pointcut类,然后再bean中声明该类,接着就可以使用这些自定的pointcut类了。
文章系erikchang所有,EasyJF版权所有,转载请注明出处!
觉得很有用,就转了.
相关文章推荐
- spring中最强大的Advisor-DefaultPointcutAdvisor
- Spring RegexpMethodPointcutAdvisor和NameMatchMethodPointcutAdvisor
- Spring AOP——Pointcut,Advisor
- 使用Spring(15) Spring AOP APIs(NameMatchMethodPointcutAdvisor,RegexpMethodPointcutAdvisor))
- Spring AOP 之 RegexpMethodPointcutAdvisor
- Spring AOP实例(Pointcut,Advisor)
- Spring中切面的<aop:advisor pointcut="execution参数解析
- Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)
- Spring横切面(advice),增强(advisor),切入点(PointCut)
- 对于Spring JoinPoint Pointcut Advice Advisor定义的理解
- 【转】Spring横切面(advice),增强(advisor),切入点(PointCut)
- Spring AOP 之 RegexpMethodPointcutAdvisor
- Spring3系列: Spring AOP——Pointcut,Advisor
- Spring3- Spring AOP——Pointcut,Advisor
- Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法
- Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Cannot cre
- Spring横切面(advice),增强(advisor),切入点(PointCut)
- Spring AOP:使用NameMatchMethodPointcutAdvisor实现切面编程
- SpringAOP中的PointcutAdvisor
- Spring3系列10-Spring AOP——Pointcut,Advisor拦截指定方法