Spring AOP使用配置介绍(二):切面的配置

来源:互联网 发布:tda分析软件正版费用 编辑:程序博客网 时间:2024/04/26 07:18
在文章(一)中已经介绍了增强的使用,此篇介绍切面的配置方法。

创建静态普通方法名匹配的切面:
package com.maxjay.bank.advice;import java.lang.reflect.Method;import org.springframework.aop.ClassFilter;import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;import com.maxjay.bank.service.UserService;/** * 静态普通方法名匹配切面定义 * @author Administrator * */public class ValidateUserAdvisor extends StaticMethodMatcherPointcutAdvisor {/** *  */private static final long serialVersionUID = 1L;/** * 只对validateUser进行拦截 */public boolean matches(Method method, Class targetClass) {// 此次可以使用正则表达式来匹配return "validateUser".equals(method.getName());}public ClassFilter getClassFilter() {return new ClassFilter() {public boolean matches(Class clazz) {return UserService.class.isAssignableFrom(clazz);}};}}

该类中的matches方法用来确定哪些方法需要执行增强中的内容;getClassFilter则确定哪些类需要被代理,这个方法在使用自动创建代理时会很有用。

在spring配置文件中配置切面:
<bean id="validateUserAdvisor" class="com.maxjay.bank.advice.ValidateUserAdvisor"><property name="advice"><ref bean="loggerBeforeAdvice" /></property></bean>

其中loggerBeforeAdvice是(一)中已经定义过的增强。
配置代理类:
<!--配置单个bean的代理,在使用时不能用原有bean的id要用AppContext.get("singleLoginProxy")从context中获取(见测试类LoggerAdviceTest)--><bean id="singleLoginProxy" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="proxyInterfaces"><value>com.maxjay.bank.service.UserService</value></property><property name="interceptorNames"><list>     <value>validateUserAdvisor</value>         </list></property><property name="target"><ref bean="userService" /></property><!-- 设置是否直接代理类(默认为false):true即使用cglib生成代理类,此时target对象不可以是JDK动态代理过的bean;false则使用JDK动态代理 --><property name="proxyTargetClass"><value>true</value></property></bean>

注意此处配置与(一)中只有interceptorNames换成了我们刚刚配置的那个切面。

此外也可以使用静态正则表达式方法匹配来创建切面,代码如下
<!-- 定义静态正则表达式方法名匹配切面 --><bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><property name="patterns"><list><value>.*get.*</value></list></property><property name="advice"><ref bean="loggerBeforeAdvice" /></property></bean>

其中.*get.*是标准的正则表达式语言,它匹配那些名称种包含get的方法
       通过上面的步骤我们就定义完了切面了。
0 0
原创粉丝点击