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

Spring参考手册 AOP

阅读更多
Spring参考手册 AOP
概述

        Spring 2.0引入了一个简单而强大的机制,使用基于模式和@AspectJ注记样式实现自定义方面。Spring当前仅支持方法执行连接点而不支持字段拦截。 Spring AOP框架的目标并不是实现完整的AOP实现,主要目的是帮助IOC容器解决一些企业应用的常见问题。Spring AOP框架通常需要和Spring IOC容器一起使用,方面使用通常的Bean定义语法。如果需要一个全面的AOP解决方案,AspectJ是更好的选择。

        Spring AOP框架是基于代理的,Spring缺省使用JDK的动态代理,JDK代理可以代理任何接口。而CGLIB代理主要用来代理类,如果一个Bean没有实现一个接口,Spring将使用CGLIB进行代理。

基本概念

        Aspect……横切多个对象的关注点。事务管理是J2EE应用的一个横切关注点的极好事例。
        Join Point……程序执行中的一个点,例如一个方法的执行或者异常处理,Spring中连接点总是指方法执行。
        Advice……方面在一个特定的连接点执行的动作,许多AOP框架,包括Spring都将advice模型为一个拦截器,基于一个连接点维持一个拦截器堆栈。
        Pointcut……用来匹配连接点的语法。 Advice和一个Pointcut关联,并且运行在Pointcut匹配的连接点处(比如具有指定名称的方法)。Spring使用AspectJ的 Pointcut语法。
        Introduction……针对某个类型声明额外的方法和字段,Spring AOP允许针对任何代理的对象引入新的接口。比如可以使用introduction让一个Bean实例实现IsModified接口。
        Target Object……被方面拦截的对象,Spring AOP使用运行时代理实现方面拦截机制,因此这些对象都是代理对象。
        Aop Proxy……AOP框架为了实现方面规约而创建的代理对象。Spring框架中,AOP代理是一个JDK动态代理或者CGLIB代理。
        Weave……将方面和其他对象类型进行关联创建Advice的方式,织入可以在编译时,加载时或运行时进行,Spring AOP使用运行时织入的方式。
Advice类型

        Before Advice……连接点之前执行,除非抛出异常将无法阻止执行连接点。
        After Return Advice……在连接点正常返回后执行。
        After throwing advice……连接点抛出异常后执行。
        After (finally) advice……不管连接点正常退出还是抛出异常都会执行。
        Around advice……在连接点之前和之后执行,可以在方法执行前后添加自定义逻辑,可以终止连接点的继续执行,返回值或抛出异常。
@AspectJ支持
启用AspectJ

        启用@AspectJ方面时,如果Spring检测到一个实例需要被一个或多个代理拦截,Spring 将自动为这个实例生成一个代理,拦截方法执行,启用AspectJ需要添加如下配置:
xml 代码

   1. <aop:aspectj-autoproxy/>  

声明方面

        AspectJ 对方面的支持是使用Annotation实现的,Spring将自动检测使用过@Aspect注记的Bean实例,配置AOP代理。AspectJ的方面 就是一个使用了@Aspect注记的类,和普通类一样,可以包含方法,字段,另外也可以包含pointcut,advice,introduction 等。
声明Pointcut

        Pointcut 用来决定哪些方法需要应用方面,其声明包括两部分,一部分是返回值为void的方法签名,一部分是@Pointcut注记,@Pointcut注记的语法 可以参见AspectJ参考指南。下面的示例定义了名称为anyOldTransfer的Pointcut,匹配任何方法名称为transfer:
java 代码

   1. @Pointcut("execution(* transfer(..))")// the pointcut expression   
   2. private void anyOldTransfer() {}// the pointcut signature  

Spring的Pointcut支持如下形式的限定方式:
       Within…..限制在指定的类型范围。 
       This……限制匹配的连接点所在的Bean实例的Spring AOP代理是指定的类型。
       Target……限制匹配的连接点所在的Bean实例是指定的类型。
       Args……限制匹配的连接点的参数是指定类型的实例。
       @target……限制连接点所在的类有一个指定类型的注记。
       @args……限制传递给连接点的参数的运行期类型有指定类型的注记。
       @within……限制连接点在有特定注记的类型范围。
       @annotation……限制连接点所在的 Bean实例的Spring AOP代理有指定的注记。

       Pointcut表达式可以使用&&,||,!进行组合,也可以使用名称引用pointcut表达式,使用名称引用时,适用通常的java可见性规则,下面是几个示例:
java 代码

   1. @Pointcut("execution(public * *(..))")   
   2. private void anyPublicOperation() {}   
   3. @Pointcut("within(com.xyz.someapp.trading..*")   
   4. private void inTrading() {}   
   5. @Pointcut("anyPublicOperation() && inTrading()")   
   6. private void tradingOperation() {}   

声明Advice

       Advice和一个Pointcut表达式关联,运行在Pointcut表达式匹配的方法执行前后。

       针对几种不同类型的Advice,使用不同的注记来声明,比如使用@Before标记声明 before advice。

       任何Advice方法可以声明一个org.aspectj.lang.JoinPoint 类型的参数,从而获取拦截方法的信息。

       可以在声明Advice时,将拦截方法的参数传递进来,下面的示例想拦截第一个参数为 Account的方法,而且可以在advice方法内访问account对象。
java 代码

   1. @Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" +   
   2. "args(account,..)")   
   3. public void validateAccount(Account account) {   
   4. // ...   
   5. }  

       代理对象,目标对象和注记也可以相同的方式访问,下面的示例拦截使用@Auditable
的方法,而且可以在advice方法内访问auditable对象。
java 代码

   1. @Before("com.xyz.lib.Pointcuts.anyPublicMethod() && " +   
   2. "@annotation(auditable)")   
   3. public void audit(Auditable auditable) {   
   4. AuditCode code = auditable.value();   
   5. // ...   
   6. }  

Introduction

       Introduction使用@DeclareParents注记声明,这个注记用来声明匹配pointcut的类将实现一个新的接口。下面的示例声明所有的服务接口将实现UsageTracked接口:
java 代码

   1. @Aspect  
   2. public class UsageTracking {   
   3. @DeclareParents(value="com.xzy.myapp.service.*+",   
   4. defaultImpl=DefaultUsageTracked.class)   
   5. public static UsageTracked mixin;   
   6. @Before("com.xyz.myapp.SystemArchitecture.businessService() &&" +   
   7. "this(usageTracked)")   
   8. public void recordUsage(UsageTracked usageTracked) {   
   9. usageTracked.incrementUseCount();   
  10. }   
  11. }   

Aspect实例模型

       缺省情况应用上下文中每个方面只有一个单独的实例,Spring支持perthis和pertarget 模型。
基于模式的AOP

       如果不能使用JDK5,可以使用基于XML格式的配置,Spring通过使用aop标记提供对方面定义的支持。在Spring配置中,所有的方面和advisor元素都必须放在一个<aop:config>元素内。</aop:config>

       在基于模式的AOP中,Spring仅支持单例模型。要使用AOP标记,必须在配置文件中引入相应的 XSD文件如下:
xml 代码

   1. xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"  

声明方面

       使用模式支持,一个方面只是Spring应用上下文中的一个Bean实例,状态和行为由这个Bean实例捕获,切入点和advice信息用XML描述。示例如下:
xml 代码

   1. <aop:config>  
   2. <aop:aspect  
   3. ...   
   4. aop:aspect>  
   5. aop:config>  
   6. <bean id="   
   7. ...   
   8. bean>  

声明Pointcut

       Pointcut可以直接声明在方面内部,也可以直接声明在<aop:config>元素内,可以供多个方面使用。</aop:config>
xml 代码

   1. <aop:config>  
   2. <aop:pointcut id="businessService"  
   3. Aspect Oriented Programming with Spring   
   4. Spring Framework (2.0.2) 118   
   5. expression="execution(* com.xyz.myapp.service.*.*(..))"/>  
   6. aop:config>  

声明advice

       下面的示例声明一个before类型的advice
xml 代码

   1. <aop:aspect id="beforeExample" ref="aBean">  
   2. <aop:before  
   3. pointcut-ref="dataAccessOperation"  
   4. method="doAccessCheck"/>  
   5. ...   
   6. aop:aspect>  

声明introduction

       下面的示例声明一个introduction
xml 代码

   1. <aop:aspect id="usageTrackerAspect" ref="usageTracking">  
   2. <aop:declare-parents  
   3. types-matching="com.xzy.myapp.service.*+",   
   4. implement-interface="UsageTracked"  
   5. default-impl="com.xyz.myapp.service.tracking.DefaultUsageTracked"/>  
   6. <aop:before  
   7. pointcut="com.xyz.myapp.SystemArchitecture.businessService()   
   8. and this(usageTracked)"   
   9. method="recordUsage"/>  
  10. aop:aspect>  

Advisor

       Advisor是Spring特有的概念,其实就是Pointcut和Advice的容器。
 @AspectJ/XML

      基于Schema的AOP定义比较清晰明了,而且很容易通过配置文件修改,也有两个缺点:
            Schema方式中关于方面的信息由分布在XML文件和Bean实例中,而@Aspectj方式,所有关于方面的信息都集中在一个模块的所有Bean实例中。
            Schema方式仅支持方面的单例模型,@Aspectj方式支持组合命名的Pointcut。
代理机制

      Spring AOP缺省使用JDK的动态代理机制,只能针对接口代理,如果需要针对类代理,可以使用CGLIB代理,要在AOP中强制使用CGLIB代理,可以设置 proxy-target-class属性如下:
xml 代码

   1. <aop:config proxy-target-class="true">  
   2. <!-- other beans defined here... -->  
   3. aop:config>  

      使用CGLIB代理的一个问题是final方法不能被代理,因为final方法不能重写。
      Spring框架使用代理机制,会导致调用自身方法的方法不能被代理,下面这种情况下,foo方法就不能被代理。 
	  
	  
分享到:
评论

相关推荐

    Springframework开发参考手册chm格式

    资源名称:Spring Framework开发参考手册 chm格式   内容简介:  Spring Framework 开发手册 chm,一份对Spring特性的参考指南,内容涵盖Spring概述、使用场景、Spring2.0新特性、面向切面编程、中间层...

    Spring2中文参考手册

    另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去。 你可以把Spring当作一个潜在的一站式企业应用。或者,把Spring看作一个标准开发组件,根据自己的需要,只取用它的部分组件使用而...

    spring security 参考手册中文版

    Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...

    spring2.5中文参考手册

    spring2.5中文参考手册,AOP,DI,spring webflow等

    Spring 2.0 开发参考手册

    6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个...

    Spring2.5 Framework 开发参考手册中文版

    Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据...Spring提供了全功能的 MVC framework, 以及透明集成AOP到你的软件中的能力。

    spring.net中文手册在线版

    26.4.The Spring.NET AOP Cookbook 26.4.1.缓存 26.4.2.性能监视 26.4.3.重试规则 Spring.NET AOP最佳实践 第二十七章. .NET Remoting快速入门 27.1.简介 27.2.Remoting实例程序 27.3.实现 27.4.运行程序 27.5....

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.4.2. Spring AOP中使用@AspectJ还是XML? 6.5. 混合切面类型 6.6. 代理机制 6.7. 编程方式创建@AspectJ代理 6.8. 在Spring应用中使用AspectJ 6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1....

    Spring Framework 开发参考手册

    另外,必须感谢Christian Bauer(来自Hibernate团队) ,他改写了DocBook-XSL软件来创建Hibernate参考手册,我们才得以创建这份文档。 也需要感谢Russell Healy为本手册的部分内容进行的详细而极富价值的审核。

    spring2.0中文开发参考手册

    另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去。 &lt;br&gt;你可以把Spring当作一个潜在的一站式企业应用。或者,把Spring看作一个标准开发组件,根据自己的需要,只取用它的部分组件...

    Spring2.52 开发手册

    spring2.52 Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。...这份手册提供Spring的功能参考指南。

    Spring2.0开发参考手册

    即使拥有良好的工具和优秀技术,应用软件开发也是困难重重。应用开发往往牵扯到方方面面,每件事情都难以控制,而且,开发周期也很难...另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去。

    spring2.0开发参考手册

    Spring提供了一种轻量级的解决方案,用于建立“快装式企业应用”。在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services...另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去。

    Spring Framework 开发参考 chm 手册.rar

    chm 手册,一份对Spring特性的参考指南,内容涵盖Spring概述、使用场景、Spring2.0新特性、面向切面编程、中间层、WEB层、校验,数据绑定,BeanWrapper,与属性编辑器、使用Spring进行面向切面编程(AOP)、使用ORM...

    开发者突击·精通AOP整合应用开发 源码

    无论是对于Java EE架构设计还是软件开发,《开发者突击:精通AOP整合应用开发(AspectWerkz+Aspectl+Spring)》都是精通开发Java Web应用的必备的实用手册。 《开发者突击:精通AOP整合应用开发(AspectWerkz+Aspectl+...

    spring参考资料

    Spring 是由 Rod Johnson 撰写,并在其著作 Expert One-on-One: J2EE Design and Development 中有提到过,它是个轻量级(Lightweight)容器(Container)、实现 IoC(Inversion of Control)、AOP(Aspect-oriented...

    spring2.5 api 离线版

    Spring2.5-Reference_zh_CN.chm Spring2.5-中文参考手册.chm spring——AOP,IOC.doc Spring框架快速入门之简介.doc spring配置全书.doc Spring中的IOC与AOP详解.ppt

    Sping技术手册 参考手册

    Spring技术手册这本书介绍了spring 2.0的新特性,诸如spring 2.0的新配置、新aop支持、增强的ioc、jdbc和form标签等新功能。它通过实际完成一个完整的spring项目示例,展示了与spring相关api的使用技巧,能够显著...

Global site tag (gtag.js) - Google Analytics