`
kidiaoer
  • 浏览: 822169 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Spring总结之AOP

阅读更多
 Spring总结之AOP 

 AOP(Aspect Oriented Programming)面向切面编程,简单来说就是实现横切(crossing)的工具。在一个程序的很多部分重复使用的某一块逻辑我们可以将其抽离出来作为一个切面,重构为一个独立的类,通过声明式配置在那些组件的方法调用前后织入这个切面。AOP将作为OOP的一种辅助,使得代码更加整洁灵活、逻辑更加清晰。

AOP的种类:静态和动态。静态AOP是指横切的逻辑是在编译期间织入到程序中去的,如果要修改横切就必须重新编译代码。动态AOP是在运行时织入程序中去的。Spring AOP框架使用动态代理技术来实现,包括了JDK动态代理和CGLIB动态代理两种方式。

JDK动态代理和CGLIB动态代理—

JDK自带的动态代理使用java.lang.reflect.Proxy类,核心方法是getProxyClass(ClassLoader, Class<?> interfaces)。另外构造Proxy的时候需要绑定一个实现了InvocationHandler接口的实例。而 InvocationHandler唯一需要实现的方法就是invoke(Object proxy,Method method, Object[] args)。整个流程是Proxy会根据传入需要代理的类的interfaces构造一个代理类对象proxy,而针对这个proxy调用接口中的任何方法都会通过触发InvocationHanlder实例的invoke方法返回真实的调用结果。关于代理对象如何形成这里不讨论,笔者会以后专门总结。 JDK动态代理需要被代理的对象实现某些接口并职能代理这些接口中的方法。

CGLIB动态代理使用CGLIB包,这是一个强大的高性能字节码生成包,底层使用字节码处理框架ASM来转换字节码生成新类。除了ASM,脚本语言如Groovy和BeanShell也使用ASM生成Java代码。本质上,CGLIB是通过生成代理类的一个子类覆盖代理类的所有非final方法,并且还设置了callback。对代理类的每个方法调用会转变成用户定义的拦截方法,比JDK的动态代理要快一些。核心类是Enhancer,一般通过它的setSuperClass(targetClass)和setCallback(final int model)来配置代理类,最后通过enhancer.create()方法开始产生新类的字节码。与JDK动态代理相比,CGLIB没有被代理类必须实现接口的限制。

AOP的几个核心概念—

联结点(JointPoint):定义在程序的哪个位置,织入逻辑

通知(Advice):应该在联结点织入的代码

方面(Aspect):通知和切入点的组合叫做方面,在Spring AOP里面对应的类是Advisor

切入点(Pointcut):织入的代码在什么情况下将被执行,定义各种情况(方法调用是最基本的一种)

引入(Introduction):通过引入,可以在一个对象中加入新的方法或者属性、以改变它的结构,甚至增加实现一个接口的逻辑

Spring AOP各组件—(强调:Spring AOP只支持方法拦截的切入点)

Spring中5种Advice

MethodBeforeAdvice (前置通知):在联结点之前自定义的操作

AfterReturningAdvice (后置通知):在联结点之后执行的操作

MethodInterceptor (包围通知):模仿AOP联盟的“方法拦截”标准,包装一个方法的调用前后

ThrowAdvice (抛出通知):仅当方法调用调用抛出一个异常才执行

IntroductionInterceptor (引入):特殊拦截器,为了实现引入功能

Spring提供的7种Pointcut

ComposablePointcut (可组合切入点):通过union()和intersection()组合操作两个或两个以上的切入点

ControlFlowPointcut (流程切入点):匹配另一个方法流程中包含的所有方法(直接或间接调用)

DynamicMethodMatcherPointcut (动态方法匹配器切入点): 提供动态切入点的基类

JdkRegexpMethodPointcut (JDK正则表达式切入点):支持JDK1.4以上版本正则表达式匹配的方法

NameMatchMethodPointcut (名称匹配器方法切入点):根据一个方法名列表匹配

Perl5RegexpMethodPointcut (Perl5正则表达式切入点):支持Perl5的正则表达式语法

StaticMethodMatcherPointcut (静态方法匹配器切入点):提供静态切入点的基类

Spring AOP提供的几种Advisor (Spring AOP通过Advisor关联Pointcut和Advice)

NameMatchMethodPointcutAdvisor:最基本的PointcutAdvisor,用以提供Spring中静态的 Pointcut实例

RegexpMethodPointcutAdvisor:支持用正则表达式来编写Pointcut表达式

DefaultPointcutAdvisor:典型的最简单组件,结合一个Pointcut和一个Advice的Advisor实例

DefaultIntroductionAdvisor:特别针对引入而提供的Advisor实例

Spring还提供自动代理建立者,比如DefaultAdvisorAutoProxyCreator,只要在定义文件中加上对它的设置,在 Bean配置文件读取完事之后DefaultAdvisorAutoProxyCreator会自动搜索所有的Advisor,自动将Advisor应用至能匹配的Pointcut目标上。

下面举例说明AOP的用法,硬编码的情况下完全可以不通过配置文件实现各种组件的关联,但一般在大工程里都是通过声明式配置文件方式来实现AOP 的。在Spring2.0也引入了<aop>标签和基于Annotationde 的方式使得配置AOP更加便利。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:aop="http://www.springframework.org/schema/aop"
                xsi:schemaLocation="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    <bean id="logAdvisor" class="com.business.aop.advisor.LogAdvisor"/>

    <bean id="sellService" class="com.business.service.sellService"/>

    <bean id="buyService" class="com.business.service.buyService"/>

    <aop:config>
        <aop:aspect id="logAspect" ref="logAdvisor">
            <aop:pointcut id="businessService" expression="execution (*.business.service.*.*(...))"/>

            <aop:after ref="businessService" method="sell"/>
            <aop:before ref="businessService" method="buy"/>
        </aop:aspect>
    </aop:config>
</beans>
    Spring AOP是Spring很强大的功能,如果合理利用,可以对大型工程的代码管理和流程控制上起到非常好的效果。实际上在Spring内部已经大量使用了 AOP技术,比如Spring的远程调用支持里,还有Spring的事务管理框架里。我们学习AOP重在体会这种思想,至少在学习Spring其它方面的特性时能够分辨出哪些是明显的AOP部分,这也能有助于深入理解其它方面的特性。

    Spring AOP只是实现了AOP联盟的全部AOP技术的一小部分,但是根据帕累托法则已经能满足百分之80的需求,这也是Spring的设计思想之一, 力求简单灵活轻量级无侵入,不提倡EJB时代的为小部分需求集成大规模架构。
分享到:
评论

相关推荐

    spring-aop-jar

    "spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...

    spring之AOP(动态代理)

    总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...

    Spring之AOP介绍

    ### Spring之AOP介绍 #### 一、AOP概述 面向方面编程(Aspect-Oriented Programming,简称AOP)作为一种编程范式,旨在通过模块化的方式处理横切关注点(Cross-cutting Concerns)。传统的面向对象编程(OOP)虽然...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...

    springIOC与AOP配置

    依赖注入(Inversion of Control,简称IOC)是Spring框架的核心特性之一,它的主要目标是降低组件之间的耦合度。在传统的Java应用中,对象通常自行创建依赖的对象,而在IOC中,这个责任由一个外部容器(即Spring的...

    spring-aop.rar_aop1270_spring_spring aop

    《深入解析Spring AOP:源码解读与应用实践》 Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP...

    Spring之AOP配置文件详解

    ### Spring之AOP配置文件详解 #### 一、前言 在Java开发中,Spring框架因其强大的功能和灵活的配置而被广泛应用于企业级应用的开发。其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring框架的...

    org.springframework.aop

    在Spring框架中,AOP(Aspect Oriented Programming,面向切面编程)是其核心特性之一,它允许开发者将关注点从主业务逻辑中分离出来,如日志、事务管理等,形成独立的切面,实现代码的解耦和模块化。本篇将深入探讨...

    使用Spring配置文件实现AOP

    在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...

    Spring 应用之AOP

    ### Spring应用中的AOP详解 #### 一、AOP概览 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,提高系统的模块化程度。在...

    Spring基础:AOP编程(4)

    总结来说,Spring的AOP编程为我们提供了一种优雅的方式来处理系统中的横切关注点,通过切面、通知、切点和连接点等概念,我们可以将关注点分离,提高代码的可读性和可维护性。无论是基于代理还是注解,Spring AOP都...

    spring3.0.5的aop使用

    总结来说,Spring 3.0.5的AOP功能使得开发者能够更有效地组织代码,将关注点分离,提高代码的可读性和可维护性。通过理解并熟练运用AOP,你可以构建出更加优雅、易于扩展的Java应用程序。对于开发者而言,熟悉Spring...

    Spring中的AOP不生效

    ### Spring中的AOP不生效的原因及解决方法 在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、...

    spring-aop.jar

    Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的核心部分之一,它为Java开发者提供了强大的面向切面的编程能力。本文将围绕spring-aop.jar这个核心组件,详细探讨Spring AOP的原理、...

    spring aop注解方式、xml方式示例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...

    Spring3.0.5扩展支持AOP获取HttpServletResponse

    总结来说,Spring 3.0.5通过AOP提供对`HttpServletResponse`的扩展支持,允许开发者在不侵入业务逻辑的情况下,灵活地控制HTTP响应。这种能力对于实现诸如日志记录、性能监控、异常处理、安全性控制等跨切面的功能...

    以注解方式模拟Spring IoC AOP

    总结来说,模拟Spring的IoC和AOP主要是通过注解来管理和控制对象的生命周期及行为。虽然这种模拟简化了Spring的复杂性,但其核心思想是一致的:降低耦合,提高可维护性和可扩展性。理解并实践这些概念,对于掌握...

    Spring AOP完整例子

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...

    spring-aop源码

    总结,Spring AOP源码的探索有助于开发者深入理解面向切面编程的实现机制,提升问题解决能力,从而更好地利用AOP技术优化和维护应用程序。通过实践与学习,我们可以更好地驾驭这个强大的工具,提高代码的可维护性和...

    Spring AOP面向方面编程原理:AOP概念

    Spring框架作为Java开发领域的领头羊之一,提供了强大的AOP支持。本文旨在深入探讨Spring AOP的核心概念及其原理。 #### 二、AOP基本概念 AOP是一种编程范式,其目的是提高模块化程度,特别是将那些对很多类都具有...

Global site tag (gtag.js) - Google Analytics