Spring AOP實際應用一例
在WEB開發中,使用者對網頁的訪問許可權檢查是一個重要的環節。以STRUST為例,我們需要在Action的excute方法中編寫相關的程式碼(一般是呼叫基類的函式),也很顯然,在每個Action中這是一種重複勞動。
如果我們在excute執行之前,能夠自動去呼叫基類的許可權檢查函式,這無疑是個好的解決辦法。AOP就為我們提供了這樣一種解決方法。
下面以一個簡化的例項介紹實現的辦法。
首先我們做一個介面:
|
再做一個基類:
public abstract class BaseClass implements CheckInterface {
public BaseClass() {
}
public void check(String name){
if (name.equals("supervisor"))
System.out.println("Check Pass!!");
else {
System.out.println("No access privilege! Please do sth. else!");
}
}
}
再做一個測試類:
public class ExcuteClass extends BaseClass {
public ExcuteClass() {
}
public void excute(String name){
System.out.println("Excute here!"+name);
}
}
好了,下面做一個通知類(Advice):
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
public class BeforeAdvisor implements MethodBeforeAdvice {
private static Logger logger=Logger.getLogger(BeforeAdvisor.class);
public void before(Method m, Object[] args, Object target) throws Throwable {
if (target instanceof CheckInterface){
logger.debug("Is Instanceof CheckInterface!!!");
CheckInterface ci=(CheckInterface)target;
ci.check((String)args[0]);
}
}
}
其中重要的before方法的引數:Object target傳入的通知的物件(即測試類的介面),Method m, Object[] args分別是該物件被呼叫的方法和引數。
我們再來作spring bean定義xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<description>Spring Quick Start</description>
<bean id="MyAdvisor" class="com.wysm.netstar.test.springaop.BeforeAdvisor"/>
<bean id="myPointcutAdvisor2" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="MyAdvisor" />
</property>
<property name="patterns">
<list>
<value>.*excute.*</value>
</list>
</property>
</bean>
<bean id="checkInterface" class="com.wysm.netstar.test.springaop.ExcuteClass"/>
<bean id="myCheckClass" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.wysm.netstar.test.springaop.CheckInterface</value>
</property>
<property name="target">
<ref local="checkInterface" />
</property>
<property name="interceptorNames">
<value>myPointcutAdvisor2</value>
</property>
</bean>
</beans>
這個定義檔案指明瞭ExcuteClass為監視物件,它的excute方法被執行的時候,BeforeAdvisor將被呼叫。
最後是測試類:
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringTestCase2 extends TestCase {
CheckInterface test=null;
protected void setUp() throws Exception {
super.setUp();
ApplicationContext ctx=new FileSystemXmlApplicationContext("src/com/wysm/netstar/test/springaop/aoptest.xml");
test = (CheckInterface) ctx.getBean("myCheckClass");
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testExcute(){
test.excute("supervisor");
}
}
相關文章
- Spring AOP:面向切面程式設計的核心概念與實際應用Spring程式設計
- Spring Boot實際專案用簡單的AOPSpring Boot
- Spring AOP 實現原理與 CGLIB 應用SpringCGLib
- spring AOP 程式設計式應用Spring程式設計
- Spring AOP與AspectJ的對比及應用Spring
- AOP及其在Spring中的應用(一) .Spring
- AOP及其在Spring中的應用(二)Spring
- 面向切片程式設計(AOP)應用的一些實際例子程式設計
- Spring AOP高階應用與原始碼剖析Spring原始碼
- Spring——AOP實現Spring
- Spring AOP實踐Spring
- Spring Cloud Alibaba系列(六)sentinel的實際應用SpringCloud
- Spring之AOP實現Spring
- 【Spring】AOP實現原理Spring
- Spring AOP實現原理Spring
- redis實際應用-限流Redis
- Spring AOP的實現原理Spring
- Spring AOP實現過程Spring
- Spring框架系列(9) - Spring AOP實現原理詳解之AOP切面的實現Spring框架
- expdp sample 應用一例
- JavaScript中AOP的應用JavaScript
- 反向代理的實際應用
- Redis實際應用場景Redis
- Spring AOP 的實現機制Spring
- spring-AOP(一)實現原理Spring
- Spring AOP概述、底層實現Spring
- spring aop的實現機制Spring
- Spring AOPSpring
- spring AOPSpring
- [Spring]AOPSpring
- Spring AOT應用實踐Spring
- Spring系列:基於Spring-AOP和Spring-Aspects實現AOP切面程式設計Spring程式設計
- Spring框架系列(10) - Spring AOP實現原理詳解之AOP代理的建立Spring框架
- Spring系列之aAOP AOP是什麼?+xml方式實現aop+註解方式實現aopSpringXML
- Spring-aop 全面解析(從應用到原理)Spring
- Redis應用一例(存證數量用計數器實現)Redis
- 動態代理的實際應用
- 觀察者模式的實際應用模式