spring AOP 拦截器实现问题

 我来答
影视后期制作学习
2017-06-10 · 知道合伙人教育行家
影视后期制作学习
知道合伙人教育行家
采纳数:258 获赞数:698
荣获北京智泽苑教育科技有限公司金牌教师称号。

向TA提问 私信TA
展开全部

原理

AOP(Aspect Oriented Programming),也就是面向方面编程的技术。AOP基于IoC基础,是对OOP的有益补充。

AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。

AOP正在成为软件开发的下一个光环。使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。

Spring framework是很有前途的AOP技术。作为一种非侵略性的、轻型的AOP framework,你无需使用预编译器或其他的元标签,便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework,其他人还是像往常一样编程。

 让我们从定义一些重要的AOP概念开始。

— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。

— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。

— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

— 引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。

— 目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。

— AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

— 编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

 拦截器(也称拦截机)

拦截机 (Interceptor), 是 AOP (Aspect-Oriented Programming) 的另一种叫法。AOP本身是一门语言,只不过我们使用的是基于JAVA的集成到Spring 中的 SpringAOP。同样,我们将通过我们的例子来理解陌生的概念。


Java代码   

<span style="font-size: medium;">package com.test.TestSpring3;  

public interface UserService // 被拦截的接口  

...{  

public void printUser(String user);  

}  

</span>  

实现类

Java代码   

<span style="font-size: medium;">package com.test.TestSpring3;  

public class UserServiceImp implements UserService // 实现UserService接口  

...{  

public void printUser(String user) ...{  

System.out.println("printUser user:" + user);// 显示user  

}  

}  

</span>  

AOP拦截器

Java代码   

<span style="font-size: medium;">package com.test.TestSpring3;  

import org.aopalliance.intercept.MethodInterceptor;  

import org.aopalliance.intercept.MethodInvocation;  

public class UserInterceptor implements MethodInterceptor  

// AOP方法拦截器  

...{  

public Object invoke(MethodInvocation arg0) throws Throwable ...{  

try ...{  

if (arg0.getMethod().getName().equals("printUser"))  

// 拦截方法是否是UserService接口的printUser方法  

...{  

Object[] args = arg0.getArguments();// 被拦截的参数  

System.out.println("user:" + args[0]);  

arg0.getArguments()[0] = "hello!";// 修改被拦截的参数  

}  

System.out.println(arg0.getMethod().getName() + "---!");  

return arg0.proceed();// 运行UserService接口的printUser方法  

} catch (Exception e) ...{  

throw e;  

}  

}  

}  

</span><span style="font-size: medium;">  

</span>  

测试类

Java代码   

<span style="font-size: medium;">package com.test.TestSpring3;  

import org.springframework.beans.factory.BeanFactory;  

import org.springframework.beans.factory.xml.XmlBeanFactory;  

import org.springframework.context.ApplicationContext;  

import org.springframework.context.support.ClassPathXmlApplicationContext;  

import org.springframework.context.support.FileSystemXmlApplicationContext;  

import org.springframework.core.io.ClassPathResource;  

import org.springframework.core.io.Resource;  

import org.springframework.web.context.support.WebApplicationContextUtils;  

public class TestInterceptor ...{  

public static void main(String[] args) ...{  

ApplicationContext ctx = new FileSystemXmlApplicationContext(  

"classpath:applicationContext.xml");  

//        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");      

UserService us = (UserService) ctx.getBean("userService");  

us.printUser("shawn");  

}  

}</span><span style="font-size: medium;">  

</span>  

配置文件

Xml代码   

<span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  

<beans>  

<bean id="userServiceImp"  

class="com.test.TestSpring3.UserServiceImp" />  

<bean id="userInterceptor" class="com.test.TestSpring3.UserInterceptor" />  

<bean id="userService"  

class="org.springframework.aop.framework.ProxyFactoryBean">  

<!-- 代理接口 -->  

<property name="proxyInterfaces">  

<value>com.test.TestSpring3.UserService</value>  

</property>  

<!-- 目标实现类 -->  

<property name="target">  

<ref local="userServiceImp" />   

</property>  

<!-- 拦截器 -->  

<property name="interceptorNames">  

<list>  

<value>userInterceptor</value>  

</list>  

</property>  

</bean>  

</beans>  

</span>  

输出:
user:shawn
printUser---!
printUser user:hello! 

结论:调用方法的时候 传入的值被拦截修改了.

mtfmtf101
2017-06-10 · TA获得超过311个赞
知道小有建树答主
回答量:255
采纳率:71%
帮助的人:126万
展开全部
啥问题。。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式