使用Spring AOP松散耦合

使用Spring AOP松散耦合

  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)。

  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 提供了切入点上的集合操作——交集和合并。

  3、用ProxyFactoryBean创建AOP代理

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

  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使用声明式事务的相同功能。

  结论

  AOP 是面向对象编程的有力补充。通过方面就可以聚合在应用中行为形成可重用模块。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值