《SpringAOP原理及拦截器》由会员分享,可在线阅读,更多相关《SpringAOP原理及拦截器(30页珍藏版)》请在金锄头文库上搜索。
1、word原理AOP(Aspect Oriented Programming),也就是面向方面编程的技术。AOP基于IoC根底,是对OOP的有益补充。AOP将应用系统分为两局部,核心业务逻辑Core business concerns与横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉与到的持久化管理Persistent、事务管理Transaction Management、安全管理Security、日志管理Logging和调试管理Debugging等。AOP正在成为软件开发的下一个光环。使用AOP,你可以将处理aspec
2、t的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。Spring framework是很有前途的AOP技术。作为一种非侵略性的、轻型的AOP framework,你无需使用预编译器或其他的元标签,便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework,其他人还是像往常一样编程。AOP概念让我们从定义一些重要的AOP概念开始。 方面Aspect:一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。 连接点Joinpoin
3、t:程序执行过程中明确的点,如方法的调用或特定的异常被抛出。 通知Advice:在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around、“before和“throws通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕连接点的拦截器链。 切入点Pointcut:指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正如此表达式。 引入Introduction:添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简
4、化缓存。 目标对象Target Object:包含连接点的对象,也被称作被通知或被代理对象。 AOP代理AOP Proxy:AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。 编织Weaving:组装方面来创建一个被通知对象。这可以在编译时完成例如使用AspectJ编译器,也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。各种通知类型包括: Around通知:包围一个连接点的通知,如方法调用。这是最强大的通知。Aroud通知在方法调用前后完成自定义的行为,它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出
5、异常来短路执行。 Before通知:在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行除非它抛出一个异常。 Throws通知:在方法抛出异常时执行的通知。Spring提供强制类型的Throws通知,因此你可以书写代码捕获感兴趣的异常和它的子类,不需要从Throwable或Exception强制类型转换。 After returning通知:在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。Around通知是最通用的通知类型。大局部基于拦截的AOP框架如Nanning和oss 4只提供Around通知。如同AspectJ,Spring提供所有类型的通知,我们推荐你使用
6、最 为适宜的通知类型来实现需要的行为。例如,如果只是需要用一个方法的返回值来更新缓存,你最好实现一个after returning通知,而不是around通知,虽然around通知也能完成同样的事情。使用最适宜的通知类型使编程模型变得简单,并能减少潜在错 误。例如,你不需要调用在around通知中所需使用的MethodInvocation的proceed()方法,因此就调用失败。切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。切入点使通知独立于OO的层次选定目标。例如,提供声明式事务管理的around通知可以被应用到跨越多个对象的一组方法上。 因此切入点构成了AOP的结构要素。
7、拦截器也称拦截机 拦截机 (Interceptor), 是 AOP (Aspect-Oriented Programming) 的另一种叫法。AOP本身是一门语言,只不过我们使用的是基于JAVA的集成到Spring 中的 SpringAOP。同样,我们将通过我们的例子来理解陌生的概念。 接口类Java代码 1. package.test.TestSpring3;2. 3. publicinterfaceUserService/被拦截的接口4. .5. publicvoidprintUser(Stringuser);6. 7. 实现类Java代码 1. package.test.TestSpri
8、ng3;2. 3. publicclassUserServiceImpimplementsUserService/实现UserService接口4. .5. publicvoidprintUser(Stringuser).6. System.out.println(printUseruser:+user);/显示user7. 8. 9. 10. AOP拦截器Java代码 1. package.test.TestSpring3;2. 3. importorg.aopalliance.intercept.MethodInterceptor;4. importorg.aopalliance.inte
9、rcept.MethodInvocation;5. 6. publicclassUserInterceptorimplementsMethodInterceptor7. /AOP方法拦截器8. .9. 10. publicObjectinvoke(MethodInvocationarg0)throwsThrowable.11. 12. try.13. 14. if(arg0.getMethod().getName().equals(printUser)15. /拦截方法是否是UserService接口的printUser方法16. .17. Objectargs=arg0.getArgumen
10、ts();/被拦截的参数18. System.out.println(user:+args0);19. arg0.getArguments()0=hello!;/修改被拦截的参数20. 21. 22. 23. System.out.println(arg0.getMethod().getName()+-!);24. returnarg0.proceed();/运行UserService接口的printUser方法25. 26. catch(Exceptione).27. throwe;28. 29. 30. 31. 32. 测试类Java代码 1. package.test.TestSprin
11、g3;2. 3. importorg.springframework.beans.factory.BeanFactory;4. 5. importorg.springframework.beans.factory.xml.XmlBeanFactory;6. importorg.springframework.context.ApplicationContext;7. importorg.springframework.context.support.ClassPathXmlApplicationContext;8. importorg.springframework.context.suppo
12、rt.FileSystemXmlApplicationContext;9. importorg.springframework.core.io.ClassPathResource;10. importorg.springframework.core.io.Resource;11. importorg.springframework.web.context.support.WebApplicationContextUtils;12. 13. publicclassTestInterceptor.14. 15. publicstaticvoidmain(Stringargs).16. ApplicationContextctx=newFileSystemXmlApplicationContext(17. classpath:applicationContext.xml);18. /ApplicationContextctx=newClassPathXmlApplicationContext(applicationContext.xml);19. 20. UserServiceus=(UserService)ctx.getBean(userService);21. us.printUser(shawn);22. 23. 24. 25.