在文章(一)中已經介紹了增強的使用,此篇介紹切面的配置方法。
創(chuàng)建靜態(tài)普通方法名匹配的切面:
- 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;
-
- /**
- * 靜態(tài)普通方法名匹配切面定義
- * @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方法用來確定哪些方法需要執(zhí)行增強中的內容;getClassFilter則確定哪些類需要被代理,這個方法在使用自動創(chuàng)建代理時會很有用。
在spring配置文件中配置切面:
- <bean id="validateUserAdvisor" class="com.maxjay.bank.advice.ValidateUserAdvisor">
- <property name="advice">
- <ref bean="loggerBeforeAdvice" />
- </property>
- </bean>
其中l(wèi)oggerBeforeAdvice是(一)中已經定義過的增強。
配置代理類:
- <!--
- 配置單個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動態(tài)代理過的bean;false則使用JDK動態(tài)代理 -->
- <property name="proxyTargetClass">
- <value>true</value>
- </property>
- </bean>
注意此處配置與(一)中只有interceptorNames換成了我們剛剛配置的那個切面。
此外也可以使用靜態(tài)正則表達式方法匹配來創(chuàng)建切面,代碼如下
- <!-- 定義靜態(tài)正則表達式方法名匹配切面 -->
- <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的方法
通過上面的步驟我們就定義完了切面了。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。