Spring AOP实例(Pointcut,Advisor)

本文内容纲要:

- 

-

-

在上一个Spring AOP通知的例子,一个类的整个方法被自动拦截。但在大多数情况下,可能只需要一种方式来拦截一个或两个方法,这就是为什么引入'切入点'的原因。它允许你通过它的方法名来拦截方法。另外,一个“切入点”必须具有“Advisor' 相关联。

在Spring AOP中,有三个非常专业术语- Advices, Yiibaicut , Advisor,把它在非官方的方式...

  • Advice – 指示之前或方法执行后采取的行动。
  • Yiibaicut – 指明哪些方法应该拦截,通过方法的名称或正则表达式模式。
  • Advisor – 分组"通知"和”切入点“成为一个单元,并把它传递到代理工厂对象。

再次回顾上一个 Spring AOP通知的例子。

切入点的例子

可以通过以下两种方式相匹配的方法:

  1. 名称匹配
  2. 正则表达式匹配

1.切入点 - 名称匹配的例子

通过“切入点”和“advisor”拦截printName()方法。

创建NameMatchMethodPointcut切入点bean,并提出要在“mappedName”属性值来拦截方法名。

<bean id="pointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">

<property name="mappedName" value="printName"/>

</bean>

创建 DefaultPointcutAdvisor 通知 bean,通知和切入点相关联。

<bean id="pointcutAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">

<property name="pointcut" ref="pointcut"/>

<property name="advice" ref="AroundMethodBean"/>

</bean>

更换代理“interceptorNames”到“customerAdvisor”(它是“AroundMethodBeanAdvice”)。

<bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target" ref="customerService"/>

<property name="interceptorNames">

<list>

<value>pointcutAdvisor</value>

</list>

</property>

</bean>

完整bean配置文件

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

<bean id="customerService" class="com.ray.customer.service.CustomerService">

<property name="name" value="Ray"/>

<property name="url" value="http://www.baidu.com"/>

</bean>

<bean id="AroundMethodBean" class="com.ray.aop.AroundMethod"/>

<bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target" ref="customerService"/>

<property name="interceptorNames">

<list>

<value>pointcutAdvisor</value>

</list>

</property>

</bean>

<bean id="pointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">

<property name="mappedName" value="printName"/>

</bean>

<bean id="pointcutAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">

<property name="pointcut" ref="pointcut"/>

<property name="advice" ref="AroundMethodBean"/>

</bean>

</beans>

再次运行,输出结果

*************************

Method name:printName

Method arguments:[]

AroundMethod : Before method!

Customer name : Ray

AroundMethod : Before after!

*************************

Customer website : http://www.baidu.com

*************************

现在,只拦截 printName()方法。

2.切入点 - 正则表达式的例子

也可以通过使用正则表达式匹配切入点方法的名称 – RegexpMethodPointcutAdvisor.

<bean id="pointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

<property name="patterns">

<list>

<value>.*URL.*</value>

</list>

</property>

<property name="advice" ref="AroundMethodBean"/>

</bean>

完整bean配置文件

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

<bean id="customerService" class="com.ray.customer.service.CustomerService">

<property name="name" value="Ray"/>

<property name="url" value="http://www.baidu.com"/>

</bean>

<bean id="AroundMethodBean" class="com.ray.aop.AroundMethod"/>

<bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="target" ref="customerService"/>

<property name="interceptorNames">

<list>

<value>pointcutAdvisor</value>

</list>

</property>

</bean>

<bean id="pointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

<property name="patterns">

<list>

<value>.*URL.*</value>

</list>

</property>

<property name="advice" ref="AroundMethodBean"/>

</bean>

</beans>

再次运行,输出结果

*************************

Customer name : Ray

*************************

Method name:printURL

Method arguments:[]

AroundMethod : Before method!

Customer website : http://www.baidu.com

AroundMethod : Before after!

*************************

现在,它拦截方法名称中有“URL”的方法。在实践中,可以用它来管理DAO层,声明“.*DAO.*” 拦截所有的DAO类来支持事务。

本文内容总结:,,,

原文链接:https://www.cnblogs.com/Remenber-Ray/p/12320158.html

以上是 Spring AOP实例(Pointcut,Advisor) 的全部内容, 来源链接: utcz.com/z/362859.html

回到顶部