龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

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

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
在WEB开发中,用户对网页的访问权限检查是一个重要的环节。以STRUST为例,我们需要在Action的excute方法中编写相关的代码(一般是调用基类的函数),也很显然,在每个Action中这是一种

      在WEB开发中,用户对网页的访问权限检查是一个重要的环节。以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将被调用。

  
  

精彩图集

赞助商链接