浏览 6032 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-19
最后修改:2009-10-19
什么是aop呢?简单的用一句话概括,就是通过proxy,根据你所定义的aspect,把advice根据指定的pointcut织入到你proxy所代理的target中,这就是aop。所以aop基本包含这5个术语。好了,不多说了,我们现在就用具体的例子来实现aop的拦截。 首先我们定义一个接口,具体代码如下所示 package org.whatisjava.test.aop; /** * 首先定义一个接口 * @author ij * */ public interface SomeService { public String saySome(String msg); } 接着对这个接口做一个实现,具体代码如下所示,这个就是要代理的target对象 package org.whatisjava.test.aop; /** * * @author ij * */ public class SomeServiceImpl implements SomeService { public String saySome(String msg) { return msg; //简单处理,将字符串返回即可 } } 接下来定义一个专门用于拦截非法字符的advice,具体代码如下 package org.whatisjava.test.aop; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * 能够过滤某些字符的advice * @author Lan * */ public class InterceptorAdvice implements MethodInterceptor { public Object invoke(MethodInvocation mi) throws Throwable { Object[] args = mi.getArguments(); //通过MethodInvocation可以将调用方法的参数取出 String str = (String)args[0]; System.out.println("---------" + str); if("傻X".equalsIgnoreCase(str)) { return "请不要说脏话"; } return mi.proceed(); } } 这个类要实现MethodInterceptor 这个接口,重写invoke方法,专门对方法中的参数进行拦截,MethodInterceptor 此接口在spring.jar中,如果感兴趣的话可以关注一下源码。 接下来就是最关键的spring的配置文件了,具体内容如下,很好理解 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- Advice--> <bean id="interceptorAdvice" class="org.whatisjava.test.aop.InterceptorAdvice"/> <!-- Target,要代理的目标对象 --> <bean id="someService" class="org.whatisjava.test.aop.SomeServiceImpl"/> <!-- Pointcut,对指定的方法名称进行匹配--> <bean id="somePointcut" class="org.springframework.aop.support.NameMatchMethodPointcut"> <property name="mappedName"> <value>saySome</value> </property> </bean> <!-- Aspect(Advisor)包括Advice和Pointcut --> <bean id="someAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="advice"> <ref bean="interceptorAdvice"/> </property> <property name="pointcut"> <ref bean="somePointcut"/> </property> </bean> <!-- Proxty包括Target和Aspect(Advisor) --> <bean id="someServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref bean="someService"/> </property> <property name="interceptorNames"> <list> <value>someAdvisor</value> </list> </property> </bean> </beans> 接下来进行测试就可以了,具体代码如下所示 package junit.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.whatisjava.test.aop.SomeService; public class InterceptorTest { private static ApplicationContext ctx; static { ctx = new ClassPathXmlApplicationContext("org/whatisjava/test/aop/aopContext.xml"); } @Test public void tstInterceptor() { SomeService service = (SomeService)ctx.getBean("someServiceProxy"); String str = service.saySome("傻X"); System.out.println(str); } } 运行测试,输入结果“请不要说脏话”,证明拦截成功。 换一个词,比如“你好”,则正常输入。说明此小小的拦截功能实现成功。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-10-19
用filter也可以吧
|
|
返回顶楼 | |
发表时间:2009-10-19
为什么不用过滤器呢 我觉得用AOP拦截不是那回事
|
|
返回顶楼 | |
发表时间:2009-10-19
aop拦截比过滤器功能强许多,不是那么多回事并不是只有前置、后置、环绕等等什么拦截之类。我写在配置文件里对具体的方法进行拦截。只要写配置方法名就可以了。类选取spring框架提供的类。用过滤器拦截的话,如果我方法多了启不是要写很多if...else,这样好扩展吗?当然个人的方法不同。这只是提供一种建议而已。
|
|
返回顶楼 | |
发表时间:2009-10-21
aop拦截确实比过滤器强
|
|
返回顶楼 | |
发表时间:2009-10-21
一个不错的应用,但是一定要注意过于泛的拦截会导致性能的低下。如果只是过滤或者数据验证,使用filter或validator是更加高效也易扩展的方式
|
|
返回顶楼 | |
发表时间:2009-10-21
字符的过滤完全可以在web层的过滤器去实现,没必要再让请求进入到Spring的bean中再去拦截,这不是让不好的字符又多通过了一层处理,影响性能,最好就是在请求在我们框架层的尽量最外面的一层做拦截。这个例子作为Spring AOP的教学还是可以的,但是在实际业务处理中并不会这样做。要指出的是Spring AOP的配置文件相对臃肿冗余,业务需求大了以后必将庞大,最好使用自动代理或者是使用注解。
|
|
返回顶楼 | |
发表时间:2009-10-22
YiSingQ 写道 字符的过滤完全可以在web层的过滤器去实现,没必要再让请求进入到Spring的bean中再去拦截,这不是让不好的字符又多通过了一层处理,影响性能,最好就是在请求在我们框架层的尽量最外面的一层做拦截。这个例子作为Spring AOP的教学还是可以的,但是在实际业务处理中并不会这样做。要指出的是Spring AOP的配置文件相对臃肿冗余,业务需求大了以后必将庞大,最好使用自动代理或者是使用注解。
受教了 |
|
返回顶楼 | |
发表时间:2009-10-22
凤舞凰扬 写道 一个不错的应用,但是一定要注意过于泛的拦截会导致性能的低下。如果只是过滤或者数据验证,使用filter或validator是更加高效也易扩展的方式
|
|
返回顶楼 | |