在文章(一)中已经介绍了增强的使用,此篇介绍切面的配置方法。
创建静态普通方法名匹配的切面:
该类中的matches方法用来确定哪些方法需要执行增强中的内容;getClassFilter则确定哪些类需要被代理,这个方法在使用自动创建代理时会很有用。
在spring配置文件中配置切面:
其中loggerBeforeAdvice是(一)中已经定义过的增强。
配置代理类:
注意此处配置与(一)中只有interceptorNames换成了我们刚刚配置的那个切面。
此外也可以使用静态正则表达式方法匹配来创建切面,代码如下
其中.*get.*是标准的正则表达式语言,它匹配那些名称种包含get的方法
通过上面的步骤我们就定义完了切面了。
创建静态普通方法名匹配的切面:
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的方法
通过上面的步骤我们就定义完了切面了。