`

Spring基础知识(三)

阅读更多
参阅:Spring Framework 开发参考手册

(spring2.0-reference_final_zh_cn.chm) 
第四部分:Spring 2.0 AOP

     Spring 2.0 引入了一种更加简单并且更强大的方式来自定义切面,用户可以选择使用基于模式(schema-based)的方式或者使用@AspectJ注解。 这两种风格都完全支持通知(Advice)类型和AspectJ的切入点语言,虽然实际上仍然使用Spring AOP进行织入(Weaving)。  
一、简介

1、AOP概念

·         切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。

·         连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。

·         通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。

·         切入点(Pointcut): 匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

·         引入(Introduction): (也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

·         目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。

·         AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。

·         织入(Weaving): 把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。

通知的类型:

·         前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

·         返回后通知(After returning advice): 在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。

·         抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。

·         后通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

·         环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。  

Spring目前仅支持使用方法调用作为连接点(join point)(在Spring bean上通知方法的执行)。 虽然可以在不影响到Spring AOP核心API的情况下加入对成员变量拦截器支持,但Spring并没有实现成员变量拦截器。 如果你需要把对成员变量的访问和更新也作为通知的连接点,可以考虑其它语法的Java语言,例如AspectJ。

 
2、Spring AOP的功能和目标

3、Spring的AOP代理

Spring缺省使用J2SE 动态代理(dynamic proxies)来作为AOP的代理。这样任何接口都可以被代理。Spring也支持使用CGLIB代理. 对于需要代理类而不是代理接口的时候CGLIB代理是很有必要的。 如果一个业务对象并没有实现一个接口,默认就会使用CGLIB。 作为面向接口编程的最佳实践,业务对象通常都会实现一个或多个接口。但也有可能会 强制使用CGLIB, 在这种情况(希望不常有)下,你可能需要通知一个没有在接口中声明的方法,或者需要传入一个代理对象给方法作为具体类型在Spring 2.0之后,Spring可能会提供多种其他类型的AOP代理,包括了完整的生成类。这不会影响到编程模型。

二、@AspectJ支持

"@AspectJ"使用了Java 5的注解,可以将切面声明为普通的Java类。

l         启用@AspectJ支持

<aop:aspectj-autoproxy/>

需要在应用程序的classpath中引入两个AspectJ库:aspectjweaver.jar 和 aspectjrt.jar。

l         声明一个切面

l         声明一个切入点(pointcut)

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

 
l         声明通知

l         引入(Introductions)

l         切面实例化模型

  三、Schema-based AOP support

如果你无法使用Java 5,或者你比较喜欢使用XML格式,Spring2.0也提供了使用新的"aop"命名空间来定义一个切面。 和使用@AspectJ风格完全一样,切入点表达式和通知类型同样得到了支持在Spring的配置文件中,所有的切面和通知器都必须定义在 <aop:config> 元素内部。 一个application context可以包含多个 <aop:config>。 一个 <aop:config> 可以包含pointcut,advisor和aspect元素(注意它们必须按照这样的顺序进行声明)。

警告<aop:config>风格的配置使得对Spring auto-proxying 机制的使用变得很笨重。如果你已经通过BeanNameAutoProxyCreator或类似的东西使用显式的auto-proxying将会引发问题 (例如通知没有被织入)。推荐的使用模式是只使用<aop:config>风格或只使用 AutoProxyCreator风格

1.         声明一个切面

2.         声明一个切入点

3.         声明通知

4.         引入

Intrduction (在AspectJ中成为inter-type声明)允许一个切面声明一个通知对象实现指定接口,并且提供了一个接口实现类来代表这些对象。

在 aop:aspect 内部使用 aop:declare-parents 元素定义Introduction。 该元素用于用来声明所匹配的类型有了一个新的父类型(所以有了这个名字)。 

5.         切面实例化模型

Schema-defined切面仅支持一种实例化模型就是singlton模型。其他的实例化模型或许在未来版本中将得到支持

6.         Advisors
"advisors"这个概念来自Spring1.2对AOP的支持,在AspectJ中是没有等价的概念。 advisor就像一个小的自包含的切面,这个切面只有一个通知。

Spring 2.0 通过 <aop:advisor> 元素来支持advisor 概念。 你将会发现它大多数情况下会和transactional advice一起使用,transactional advice在Spring 2.0中有自己的命名空间。格式如下:

<aop:config>  <aop:pointcut id="businessService"    expression="execution(* com.xyz.myapp.service.*.*(..))"/>   <aop:advisor            pointcut-ref="businessService"              advice-ref="tx-advice"/> </aop:config> <tx:advice id="tx-advice"><tx:attributes>               <tx:method name="*" propagation="REQUIRED"/>  </tx:attributes></tx:advice>和在上面使用的 pointcut-ref 属性一样,你还可以使用 pointcut 属性来定义一个内联的切入点表达式。为了定义一个advisord的优先级以便让通知可以有序,使用 order 属性来定义 advisor的值 Ordered 。 
AOP声明风格的选择

如果你选择使用Spring AOP,那么你可以选择@AspectJ或者XML风格。总的来说,如果你使用Java 5, 我们建议使用@AspectJ风格。显然如果你不是运行在Java 5上,XML风格是最佳选择。

 
四、其他部分

1、全局事务    本地事务

2、一般来说,只有当你需要支持多个事务性资源时,你才需要应用服务器的JTA功能。而大多数应用并不需要能够处理跨越多种资源。许多高端应用使用单一的、高伸缩性的数据库,比如Oracle 9i RAC。 
3、关键抽象

TransactionDefinition接口指定:

·         事务隔离:当前事务和其它事务的隔离的程度。例如,这个事务能否看到其他事务未提交的写数据?·         事务传播:通常在一个事务中执行的所有代码都会在这个事务中运行。但是,如果一个事务上下文已经存在,有几个选项可以指定一个事务性方法的执行行为:例如,简单地在现有的事务中继续运行(大多数情况);或者挂起现有事务,创建一个新的事务。Spring提供EJB CMT中常见的事务传播选项。

·         事务超时: 事务在超时前能运行多久(自动被底层的事务基础设施回滚)。

·         只读状态: 只读事务不修改任何数据。只读事务在某些情况下(例如当使用Hibernate时),是一种非常有用的优化。这些设置反映了标准概念。如果需要,请查阅讨论事务隔离层次和其他核心事务概念的资源:理解这些概念在使用Spring框架和其他事务管理解决方案时是非常关键的。 

4、当你只有很少的事务操作时,编程式事务管理通常比较合适。

另一方面,如果你的应用中存在大量事务操作,那么声明式事务管理通常是值得的。

  
5、HibernateTemplate

HibernateTemplate ht = new HibernateTemplate(this.sessionFactory); 
不仅如此,Spring还提供了一个简便的 HibernateDaoSupport 基类,这个类提供了 setSessionFactory(..) 方法来接受一个 SessionFactory 对象,同时提供了 getSessionFactory() 和 getHibernateTemplate() 方法给子类使用。 综合了这些,对于那些典型的业务需求,就有了一个非常简单的DAO实现



分享到:
评论

相关推荐

    Spring基础知识汇总 Java开发必看

    Spring基础知识汇总 Java开发必看

    Spring基础知识汇总Java开发必看

    以下是对Spring基础知识的详细讲解: 1. **依赖注入(Dependency Injection, DI)** 依赖注入是Spring的核心特性,它允许组件之间松耦合。通过容器管理对象的创建和对象之间的依赖关系,而不是在代码中硬编码依赖。...

    Spring基础知识详解

    下面将对Spring的基础知识进行详细的解释。 1. **依赖注入(Dependency Injection,DI)**:Spring的核心特性,它允许开发者通过外部配置来管理对象及其依赖关系,而不是在代码中硬编码这些依赖。这样可以提高代码...

    Spring基础教学视频

    ### Spring基础教学视频知识点概述 #### 一、Spring框架简介 - **定义**:Spring框架是一种轻量级的Java开发框架,它通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP...

    java及spring基础知识pdf

    资源包含如下: 1,JAVA_IO详解_包括讲解IO中各种流及其用法.pdf 2,Java集合排序及java集合类详解.pdf 3,JDBC入门电子书.pdf 4,Spring源代码解析.pdf 5,第三章 Servlet 最佳实践.pdf

    spring基础jar包.zip

    本文将深入探讨"spring基础jar包.zip"中的关键知识点,并解析这些jar包在Spring框架中的作用。 首先,我们要明确的是,"spring基础jar包.zip"主要是为了快速搭建Spring框架环境而准备的,其中包含了一系列Spring的...

    学习Spring必学的Java基础知识(含数据库事务基础知识)

    学习Spring必学的Java基础知识(含数据库事务基础知识)

    spring知识点总结

    “知识点总结.xls”可能是一个整理好的Spring框架关键知识点的表格,可能包含了Spring的主要模块(如Core Container、Data Access/Integration、Web、AOP、Test等)、关键概念(如Bean、ApplicationContext、IoC容器...

    spring基础教程 spring基础教程

    本教程将深入探讨Spring的基础知识,帮助初学者快速掌握这一强大的框架。 一、Spring框架简介 Spring框架是于2003年推出的,由Rod Johnson发起,旨在简化企业级Java应用的开发。它是一个开源的Java平台,主要关注于...

    Spring的基础知识.pptx

    【Spring基础知识】 Spring是一个广泛使用的Java企业级应用程序框架,主要设计目的是降低模块间的耦合度,提供一种轻量级的开发方式。Spring的核心特性包括依赖注入(IoC)和面向切面编程(AOP)。它不仅关注业务层...

    Spring 基础知识

    **Spring 框架基础知识** Spring 是一个开源的 Java 应用框架,它以其轻量级、模块化和依赖注入特性而闻名。Spring 框架是开发企业级 Java 应用程序的重要工具,尤其在现代微服务架构中占据着核心地位。本篇文章将...

    Spring入门基础知识带jar包

    Spring入门基础知识带jar包

    spring基础开发的jar包

    这个"spring基础开发的jar包"是专门为Spring Web开发准备的,包含了一系列核心组件和依赖,使得开发者可以快速搭建一个功能完备的Spring MVC应用程序。在本文中,我们将深入探讨这些jar包中的关键知识点。 1. **...

    Spring 基础jar包

    下面我们将深入探讨Spring框架的一些核心知识点。 1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一是依赖注入,它允许对象之间的关系在运行时被定义和管理,而不是在代码中硬编码。通过XML配置...

    spring知识框架详解

    2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。 很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。 Spring理念 : 使现有技术更加实用 ....

    SpringBootDemo:Spring Boot 框架前三章基础知识的案例

    在这个"SpringBootDemo"项目中,我们将探讨Spring Boot框架的基础知识,包括如何创建项目、基础配置以及Web开发中的核心组件。 1. **快速创建 Spring Boot 项目案例**: 使用 IntelliJ IDEA 创建 Spring Boot 项目...

    spring基础进阶技巧200篇.zip

    《Spring基础进阶技巧200篇》是一本关于Spring框架的资源,它提供了200篇文章,涵盖了Spring框架的基础知识和...这本资源适合已经具备一定Spring基础知识的开发人员,希望进一步深入学习和应用Spring框架的技术人员。

    Spring框架的学习路径和关键知识点,可以帮助你在Spring方面成为高手: 学习路径 基础知识 Java基础 Servle

    基础知识 Java基础 Servlet/JSP JDBC Spring核心 IoC容器 依赖注入(DI) Bean的生命周期 Spring配置文件 AOP(面向切面编程) Spring MVC 控制器(Controller) 视图解析器(View Resolver) 数据绑定(Data ...

Global site tag (gtag.js) - Google Analytics