`
firecool
  • 浏览: 83523 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

用Spring AOP实现松散耦合

    博客分类:
  • java
阅读更多
摘 要 面向方面编程(AOP)是面向对象编程(OOP)的一种扩展技术,能够很好的解决横切关注点问题以及相关的设计难题来实现松散耦合。 Spring AOP 是 AOP 技术的一种实现。本文介绍了AOP 概念,然后详细讨论了如何利用Spring AOP 开发AOP 程序,最后展望了Spring AOP 的前景。

关键词 AOP Spring AOP Java

1 引言

AOP(Aspected Oriented Programming)是一种新兴的编程技术。它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题,如:事务、安全、日志等横切关注。当未来系统变得越来越复杂,横切关注点就成为一个打问题的时候,AOP就可以很轻松的解决横切关注点这个问题,使得AOP编程成为。Spring 是基于J2EE的轻量级开源开发框架,其中Spring AOP组件实现了面向方面编程。

2 AOP 概述

面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。 面向对象将应用程序分解成各个层次的对象,而AOP将程序分解成各个方面或者说关注点 。这使得可以模块化诸如事务管理等这些横切多个对象的关注点。

2.1 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框架一样, 在运行时完成织入。

3 Spring AOP 介绍

Spring的一个关键组件就是AOP框架。 Spring IoC容器(BeanFactory 和ApplicationContext)并不依赖于AOP, 这意味着如果你不需要使用,AOP可以不用,AOP完善了Spring IoC,使之成为一个有效的中间件解决方案。

Spring AOP 是Spring 框架的重要组成部分,它实现了AOP联盟约定的接口。Spring AOP 是由纯Java开发完成的。 Spring AOP 只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级的操作已经足够。OOP倡导的是基于 setter/getter 的方法访问,而非直接访问域,而Spring 有足够理由仅仅提供方法级的连接点。为了使控制反转(IoC)很方便的使用到非常健壮、灵活的企业服务,则需要Spring AOP 的实现。Spring AOP 在运行时才创建Advice 对象。Spring AOP的优点如下:

允许开发者使用声明式企业服务,比如事务服务、安全性服务。

开发者可以开发满足业务需求的自定义方面。

开发Spring AOP Advice 很方便,可以借助代理类快速搭建Spring AOP 应用。

4 使用Spring AOP松散耦合

4.1 创建通知

为实现AOP,开发者需要开发AOP 通知(Advice)。AOP 通知(Advice) 包含了方面(Aspect)的逻辑。当创建一个 Advice 对象的时候,你就编写了实现横切(cross-cutting)功能。 Spring 的连接点是用方法拦截器实现的,这就意味着你编写的 Spring AOP 通知将在方法调用的不同点组入进程序中。由于在调用一个方法时有几个不同的时间点,Spring 可以在不同的时间点组入进程序。 Spring AOP中,提供了四种通知的接口: MethodBeforeAdvice 用于在目标方法调用前触发;AfterReturningAdvice 用于在目标方法调用后触发; ThrowsAdvice 用于在目标方法抛出异常时触发;MethodInterceptor 用于实现 Around 通知(Advice),在目方法执行的前后触发。
如果要实现相应功能,则需要实现上述对应的接口。例如:实现Before 通知(Advice)需要实现方法 void before(Method method, Object[] args, Object target) ,实现 After 通知(Advice) 需要实现方法 void afterReturning (Method method, Object[] args, Object target)。

4.2 在Spring 中定义切入点

在不能明确调用方法的时候,通知就很不实用。切入点则可以决定特定的类,特定的方法是否匹配特定标准。如果某匹配,则通知将应用到此方法上。 Spring 切入点允许用很灵活的方式将通知组织进我们的类中。Spring 中的切入点框架的核心是Pointcut接口,此接口允许我们定义组入通知中的类和方法。许多方面是通过一系列的通知和切入点组合来定义。

在Spring中,一个advisor就是一个方面的完整的模块化表示。Spring提供了PointcutAdvisor接口把通知和切入点组合成一个对象。Spring中很多内建的切入点都有对应的PointcutAdvisor,这使得你可以很方便在一个地方管理切入点和通知。Spring 中的切入点分为两类:静态和动态。因为静态切入点的性能要优于动态切入点,所以优先考虑使用。Spring 为我们提供创建静态切入点很实用的类 StaticMethodMatherPointcut。在这个类中,我们只需要关心setMappedName和setMappedNams方法。你可以使用具体的类名,也可以使用通配符。如:设置mappedName属性为set* 则匹配所有的set方法。Spring还提供了另通过正则表达式来创建静态切入点的实用类RegexpMethodPointcut。通过使用Perl样式的正则表达式来定义你感兴趣的方法。当切入点需要运行时参数值来执行通知时,这时就需要使用动态切入点。Spring提供了一个内建的动态切入点:ControlFlowPointcut,此切入点匹配基于当前线程的调用堆栈。我们可以在只有在当前线程执行的执行时找到特定的类和特定的方法才返回true。使用动态切入点有很大的性能损耗。大多数的切入点可以静态确定,我们很少有机会创建动态切入点。为了增加可切入点的可重用性,Spring 提供了切入点上的集合操作——交集和合并。

4.3 用ProxyFactoryBean创建AOP代理

ProxyFactoryBean,和其他Spring的 FactoryBean实现一样,引入一个间接的层次。如果你定义一个名字为 myfactory的ProxyFactoryBean, 引用myfactory的对象所看到的不是ProxyFactoryBean 实例本身,而是由实现ProxyFactoryBean的类的 getObject()方法所创建的对象。这个方法将创建一个包装了目标对象 的AOP代理。使用 ProxyFactoryBean或者其他IoC可知的类来创建AOP代理的最重要的优点之一是IoC可以管理通知和切入点。这是一个非常的强大的功能,能够实现其他AOP框架很难实现的特定的方法。例如,一个通知本身可以引用应用对象(除了目标对象, 它在任何AOP框架中都可以引用应用对象),这完全得益于依赖注入所提供的可插入性。通常,我们不需要ProxyFactoryBean的全部功能,因为我们常常只对一个方面感兴趣: 例如,事务管理。当我们仅仅对一个特定的方面感兴趣时,我们可以使用许多便利的工厂来创建AOP代理,如:TransactionProxyFactoryBean。

4.4 自动代理

在应用较小时,只有很少类需要被通知的时,ProxyFactoryBean 可以很好的工作。当有许多类需要通知的时,显示的创建每个代理就显得很繁琐。幸运的是Spring提供了是使用自动通过容器来创建代理。这时,就只需要配置一个Bean来做繁琐的工作。Spring提供了两个类实现自动代理:BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator。

BeanNameAutoProxyCreator为匹配名字的Bean产生代理,它可以使用在将一个或者多个方面应用在命名相似的Bean中。自动代理框架假设代理将要暴露出什么接口。如果目标Bean没有实现任何接口,这时就会动态产生一个子类。而更强大的自动代理是 DefaultAdvisorAutoProxyCreator,你所需要做的是在BeanFactory中包含它的配置。这个类的奇妙之处在于他使用实现了BeanPostProcessor接口。在Bean定义被加载倒Spring容器中后,DefaultAdvisorAutoProxyCreator将搜索上下文中的Advisor,最后它将Advisor应用到匹配Advisor切入点的Bean中。这个代理只对Advisor起作用,它需要通过Advisor来得到需要通知的Bean。元数据自动代理(MetaData AutoProxy)。元数据自动代理配置依赖于源代码属性而不是外部XML配置文件。这可以非常方便的使源代码和AOP元数据组织在同一个地方。元数据自动代理最常用的地方是用来声明事务。Spring提供了很强的框架来通过AOP框架来声明事务。这提供了在EJB使用声明式事务的相同功能。

5 结论

AOP 是面向对象编程的有力补充。通过方面就可以聚合在应用中行为形成可重用模块。
通过程序可以实现怎样和在什么地方来调用这些行为。这可以减少代码重复,并使你更加关注业务逻辑。Spring 提供了AOP框架来实现调用方法时加入方面。在AOP框架中可以很方便的使用预定义的静态切入点来定义被调用的类和方法。我们需要通过Spring提供的代理类来产生代理对象,可以使用 ProxyFactoryBean也可以使用自动代理。Spring AOP 的编程方式模块化了横向关注点的实现,提供了一个更好更快的软件开发方式。在软件结构日益扩大,结构日益复杂的今天,Spring AOP 将会发挥越来越重要的作用。
分享到:
评论

相关推荐

    springAop的配置实现

    了解和掌握Spring AOP的配置实现,有助于提升我们构建松散耦合、易于维护的系统的能力。在实际项目中,我们可以根据需求选择合适的代理类型,并结合XML配置实现面向切面编程,提高代码的可读性和可维护性。

    spring

    **使用Spring AOP实现松散耦合** 1. **创建通知(Advice)**:编写实现横切逻辑的代码,例如事务管理的代码,定义在通知中。 2. **定义切入点(Pointcut)**:通过表达式或注解定义通知触发的条件,例如标记哪些方法...

    spring aop ioc实例

    总结来说,Spring的IOC和AOP提供了强大的功能,帮助我们构建松散耦合、易于测试和维护的应用。通过理解并熟练运用这两个特性,开发者可以编写出更高效、更灵活的代码。在实际项目中,结合使用Spring AOP进行日志记录...

    spring aop 原理解析

    【Spring AOP 原理解析】 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许开发者定义“切面”来封装系统中的...通过理解和熟练使用Spring AOP,开发者可以更好地构建松散耦合、高度模块化的应用程序。

    SpringIOC和AOP实现机制模拟

    在实际项目中,结合使用Spring的IOC和AOP,我们可以构建出松散耦合、易于扩展的应用系统。例如,通过AOP处理日志记录,可以确保每个方法调用前后都有相应的日志输出,而无需在每个方法内部添加日志代码,大大提高了...

    利用SPring AOP配置切面的一个例子

    通过这种方式,我们将这些行为抽象为独立的模块——切面,从而实现代码的松散耦合。 #### 步骤一:定义业务类`DukePerformer` 首先,我们定义了`DukePerformer`类,实现了`Performer`接口,其中包含了一个`perform...

    Spring AOP总结

    **Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了在不修改...通过理解并熟练掌握Spring AOP,我们可以更好地构建松散耦合、易于维护的Java应用。

    SpringAOP原理及拦截器.doc

    Spring AOP,全称为Spring的面向切面编程,是一种编程范式,旨在将核心业务逻辑与横切关注点(如事务管理、日志记录、安全控制...通过熟练掌握AOP的原理和实践,开发者能够更高效地构建模块化的、松散耦合的软件系统。

    模拟实现spring IOC AOP的例子

    通过实践,你可以更深入地掌握这两个关键概念,并了解它们如何帮助构建松散耦合、可维护性更强的应用程序。在探索这些项目时,你可能会遇到如Bean生命周期管理、自动装配、代理模式等其他Spring特性,这些都是进一步...

    论文研究-基于Spring AOP企业应用安全模块的研究与实现 .pdf

    依赖注入(DI)是一种设计模式,它允许将对象之间的依赖关系从硬编码转变为松散耦合。这一概念最早由Martin Fowler提出,并随着Spring框架的广泛使用而普及。依赖注入的核心思想是将对象的依赖关系从对象本身移除,...

    spring_aop2.rar_java spring_spring

    在实际应用中,Spring AOP通常与IoC(控制反转)和DI(依赖注入)结合使用,以创建松散耦合且易于维护的系统。通过Spring容器管理切面和目标对象,可以轻松地在运行时调整或扩展系统的行为。 总之,Spring AOP是...

    Spring4--2.bean注解和AOP

    在Spring 4中,Bean注解和AOP结合使用,可以构建出松散耦合、易于维护的系统。通过注解配置,我们可以快速地声明和管理Bean,而AOP则帮助我们处理那些贯穿多个类的通用任务,提高代码的复用性和可读性。在实际项目中...

    sqring aop 必须的四个jar包

    Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序...同时,Spring AOP与Spring IoC(依赖注入)相结合,可以构建出松散耦合、高度模块化的应用系统。

    spring4.0.0.RELEASE全套jar包

    它支持模型绑定、数据验证、本地化、视图解析等特性,让开发者可以编写松散耦合、测试友好且高性能的控制器。 6. **spring-aop-4.0.0.RELEASE.jar**:面向切面编程模块,允许在不修改代码的情况下添加新的行为到...

    helloAop.zip 内含spring ioc,aop例子

    通过IOC,我们可以编写松散耦合的代码,易于维护和测试;利用AOP,我们可以在不侵入核心业务逻辑的情况下,实现跨切面的功能。例如,通过定义一个事务管理切面,可以在所有需要的地方透明地处理事务,而无需在每个...

    详解SpringBoot之集成Spring AOP

    Spring AOP是Spring框架中的一个重要组件,提供了面向方面编程(Aspect-Oriented Programming)的能力,能够帮助开发者更好地实现松散耦合的设计。 在SpringBoot中集成Spring AOP是非常简单的,只需要添加相应的...

    spring4.3.6全部jar包

    8. **Spring Integration**:提供了企业级集成模式的实现,如消息传递、文件处理等,便于构建松散耦合的系统。 9. **Spring Security**:是Spring提供的一个安全框架,用于身份验证、授权和会话管理,保护Web应用免...

    Java Spring面试题

    Spring框架的设计目标是简化企业级应用程序的开发,使开发者更容易构建松散耦合的应用程序。 Spring概述 Spring框架的设计目标是提供一个灵活、可扩展、松散耦合的框架,帮助开发者快速构建企业级应用程序。Spring...

    2022年Spring笔试考试题目.doc

    1.1 Spring 框架是一种轻量级容器,以 IOC 模式作为关键,从而可以实现应用程序组件的松散耦合构造,让应用程序组件可以轻易进行测试。在这里,IOC 模式的关键是指依赖注入(Dependency Injection),这种模式可以将...

Global site tag (gtag.js) - Google Analytics