✎SSH框架整合实战教程第14章面向切面编程(SpringAOP)•手动代理—JDK动态代理•手动代理—CGLIB代理•声明式工厂Bean•基于XML的声明式AspectJ•基于Annotation的声明式AspectJ✎✎1了解AOP的执行过程2熟悉AOP的作用和相关概念掌握掌握ApplicationContext容器的使用以及IoC和DI的思想3学习目标✎✎☞点击查看本小节知识架构SpringAOP简介手动代理☞点击查看本小节知识架构☞点击查看本小节知识架构AspectJ开发声明式工厂Bean☞点击查看本小节知识架构目录✎✎什么是AOP?为了将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,Spring提供了面向切面的编程方式,也称SpringAOP,AOP的全称是AspectOrientedPrograming,即面向切面编程。AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码,主要体现在事务处理、日志管理、权限控制、异常处理等方面,使开发人员在编写业务逻辑时可以专心于核心业务,提高了代码的可维护性。14.1SpringAOP简介✎✎AOP的专业术语包括Joinpoint、Pointcut、Advice、Target、Weaving、Proxy和Aspect,对于专业术语的解释,具体如下:Pointcut(切入点):是指要对哪些Joinpoint进行拦截,即被拦截的连接点。Joinpoint(连接点):是指那些被拦截到的点,在Spring中,可以被动态代理拦截目标类的方法。Advice(通知):是指拦截到Joinpoint之后要做的事情,即对切入点增强的内容。Target(目标):是指代理的目标对象。Weaving(织入):是指把增强代码应用到目标上,生成代理对象的过程。Proxy(代理):是指生成的代理对象。Aspect(切面):是切入点和通知的结合。AOP术语14.1SpringAOP简介✎✎代理模式是Java中的常用设计模式,代理类通过调用被代理类的相关方法,提供预处理、过滤、事后处理等服务。AOP手动使用代理模式有两个典型的例子,分别为JDK动态代理和CGLIB代理。为了让读者了解AOP的执行过程,本小节将通过这两种手动代理的实现方式,结合相关案例,模拟AOP的执行过程。概述14.2手动代理✎✎JDK动态代理是通过JDK中的java.lang.reflect.Proxy类来实现的。案例代码接下来,通过一个案例来演示JDK动态代理具体的实现步骤,如文件14-1~14-5所示。JDK动态代理14.2手动代理✎✎通过前面的学习可知,JDK的动态代理用起来非常简单,但它是有局限性的,使用动态代理的对象必须实现一个或多个接口。那么,如何代理没有实现接口的类?14.2手动代理✎✎CGLIB代理如果想代理没有实现接口的类,那么可以使用CGLIB代理。CGLIB(CodeGenerationLibrary)是一个高性能开源的代码生成包,它的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架)来转换字节码,为一个类创建子类,然后对子类进行增强,解决无接口代理问题。所以CGLIB要依赖于ASM的包,解压Spring的核心包spring-core-3.2.2.RELEASE.jar,文件目录如图所示。14.2手动代理✎✎Hibernate的二级缓存举个例子Forexample案例代码接下来,通过一个案例来演示实现CGLIB的代理过程,如文件14-6~14-8所示。14.2手动代理✎✎在14.2小节中,讲解了AOP手动代理,接下来通过讲解Spring的通知来介绍Spring是怎样创建AOP代理的。概述14.3声明式工厂Bean✎✎Spring按照通知在目标类方法的连接点位置,可以分为5种类型,具体如下:•org.springframework.aop.MethodBeforeAdvice(前置通知)在目标方法执行前实施增强,可以应用于权限管理等功能。•org.springframework.aop.AfterReturningAdvice(后置通知)在目标方法执行后实施增强,可以应用于关闭流、上传文件、删除临时文件等功能。•org.aopalliance.intercept.MethodInterceptor(环绕通知)在目标方法执行前后实施增强,可以应用于日志、事务管理等功能。•org.springframework.aop.ThrowsAdvice(异常抛出通知)在方法抛出异常后实施增强,可以应用于处理异常记录日志等功能。•org.springframework.aop.IntroductionInterceptor(引介通知)在目标类中添加一些新的方法和属性,可以应用于修改老版本程序(增强类)。Spring通知类型14.3声明式工厂Bean✎✎通过在Spring中创建一个AOP代理的基本方法是,使用org.springframework.aop.framework.ProxyFactoryBean,这个类对应的切入点和通知提供了完整的控制能力,生成指定的内容。该类的常用属性如下。声明式SpringAOP14.3声明式工厂Bean✎✎在Spring通知中,环绕通知是一个非常典型的应用。1、环绕通知案例代码接下来,通过一个环绕通知的案例,来演示Spring创建AOP代理的步骤,如文件14-9~14-11所示。14.3声明式工厂Bean✎✎AspectJ是一个基于Java语言的AOP框架,Spring2.0以后新增了对AspectJ切点表达式的支持。@AspectJ是AspectJ1.5新增功能,通过JDK5.0注解技术,允许直接在Bean类中定义切面,新版本Spring框架,建议使用AspectJ方式来开发AOP,接下来对两种AspectJ的开发方式进行讲解。概述14.4AspectJ开发✎✎基于XML的声明式AspectJ是指,通过在XML文件中进行配置,来定义切面、切入点及声明通知,所有的切面和通知都必须定义在aop:config元素内。案例代码接下来,通过案例来演示在Spring中使用基于XML的声明式AspectJ的方式,实现AOP的开发,如文件14-12~14-14所示。基于XML的声明式AspectJ14.4AspectJ开发✎✎基于XML的声明式ApectJ有一个缺点就是要在Spring文件中配置大量的信息。为了解决这个问题,AspectJ框架为AOP提供了一套Annotation注解,用以取代Spring配置文件中为实现AOP功能所配置的臃肿的代码。基于Annotation的声明式AspectJ@AspectJ用于定义一个切面。@Before用于定义前置通知,相当于BeforeAdvice。@AfterReturning用于定义后置通知,相当于AfterReturningAdvice。@Around用于定义环绕通知,相当于MethodInterceptor。@AfterThrowing用于定义抛出通知,相当于ThrowAdvice。@After用于定义最终final通知,不管是否异常,该通知都会执行。@DeclareParents用于定义引介通知,相当于IntroductionInterceptor(不要求掌握)。14.4AspectJ开发✎✎Hibernate的二级缓存举个例子Forexample案例代码接下来,通过一个案例来演示在项目中如何基于注解进行AOP开发,重新上一小节的功能,如文件14-15~14-17所示。14.4AspectJ开发✎✎本章主要讲解了面向切面编程(AOP)思想,首先对AOP进行了简单的介绍,通过手动代理模拟了AOP的执行过程,然后通过案例演示了如何使用Spring工厂进行底层开发,最后讲解了使用AspectJ框架的开发过程。通过本章的学习,读者可以熟悉AOP的作用和相关概念、了解AOP的执行过程、掌握使用AspectJ框架进行开发的两种方式。本章小结✎