首页 > 开发 > 综合 > 正文

WEB开发中Spring AOP实际应用一例

2024-07-21 02:14:50
字体:
来源:转载
供稿:网友


   在中,用户对网页的访问权限检查是一个重要的环节。以strust为例,我们需要在action的excute方法中编写相关的代码(一般是调用基类的函数),也很显然,在每个action中这是一种重复劳动。

  如果我们在excute运行之前,能够自动去调用基类的权限检查函数,这无疑是个好的解决办法。aop就为我们提供了这样一种解决方法。

  下面以一个简化的实例介绍实现的办法。

  首先我们做一个接口:

public interface checkinterface {
  public abstract void check(string name);
  public abstract void excute(string name);
}

  再做一个基类:

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");
}
}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表