Spring基础知识(一)

http://book.csdn.net/bookfiles/250/

  
第一部分:Spring基础概念

1、反向控制(IoC)
       单从字面上,其实很难理解“反向控制”所要表达的含义。其实在编程时,开发人员常说的“实现必须依赖抽象,而不是抽象依赖实现”就是“反向控制”的一种表现方式。

 
2、依赖注入(DI)

       Spring就是使用Dependency Injection来实现IoC功能

       依赖注入的意义:让组件依赖于抽象,当组件要与其他实际对象发生依赖关系时,通过抽象来注入依赖的实际对象。

 
       应用DI原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系(以及在何时何地指定这种依赖关系和依赖的实际类是什么)之后,实现更高层次的松耦合将易如反掌。

  
3、Dependency Injection的3种实现方式

       接口注入(interface injection)、Set注入(setter injection)和构造注入(constructor injection)。

 
至于要使用构造注入或Set注入来完成依赖注入这个问题,其实就是在讨论:要在对象建立时就准备好所有的资源,或是在对象建立好后,使用Set注入来进行设定。

使用构造注入可以在建构对象的同时一并完成依赖关系的建立,对象一建立则所有的一切也就准备好了,但如果要建立的对象关系很多,使用构造注入会在建构函式上留下一长串的参数,且不易记忆,这时使用Set注入会是个不错的选择。

使用Set注入可以有明确的名称,可以了解注入的对象会是什么,像setXXX()这样的名称会比记忆Constructor上某个参数位置代表某个对象更好。

然而使用Set注入由于提供了setXXX()方法,所以不能保证相关的数据成员或资源在执行时不会被更改设定,所以如果开发人员想要让一些数据成员或资源变为只读或是私有,使用构造注入会是个简单的选择。

 
小结:

Spring的核心是个IoC容器,用户可以用Setter或Constructor的方式来实现自己的业务对象。至于对象与对象之间的关系建立,则通过组态设定,让Spring在执行时根据组态的设定来建立对象之间的依赖关系,开发人员就不必特地撰写一些Helper来自行建立这些对象之间的依赖关系,这不仅减少了大量的程序撰写,也降低了对象之间的耦合程度。

   
第二部分:Spring的AOP

一、AOP基本思想

AOP的意思是面向方面编程,英文全称是Aspect Oriented Programming,它使开发人员可以更好地将本不该彼此粘合在一起的功能分离开。

 
1、认识AOP

开发人员在编写应用程序时,通常包含两种代码:一种是和业务系统有关的代码,一是和业务系统关系不大的代码,例如日志、权限、异常处理、事务处理等。以前编写代码时,这两种代码基本是写在一起的,这样在程序中,到处充满着相同或类似的代码,例如日志信息的输出,每个方法都要写日志的输出,不利于程序的维护。而AOP就是使这两种代码分离的思想。使用AOP,就不用在业务逻辑中实现与业务功能关系不大的代码,从而降低了两种代码的耦合性,达到易于维护和重用的目的。

 
2、AOP与OOP对比分析

在AOP里,每个关注点的实现并不知道是否有其他关注点关注它,这是AOP和OOP的主要区别。在AOP里,组合的流向是从横切关注点到主关注点,而OOP中组合的流向则是从主关注点到横切关注点。从这点可以看出AOP和OOP它们所关注的对象是不同的,所以AOP可以和OOP很好地共存,AOP是OOP的有益补充,而不是其对立面。

面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。 除了类(classes)以外,AOP提供了 切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。 (这些关注点术语通常称作 横切(crosscutting) 关注点。)  
3、AOP与Java的代理机制

AOP是一种思想,它和具体的实现技术无关。任何一种符合AOP思想的技术实现,都可以看作是AOP的实现。JDK 1.3以后,Java提供了动态代理的机制。通过Java的动态代理机制,就可以很容易地实现AOP的思想。实际上Spring的AOP也是建立在Java的代理机制之上的。要理解Spring的AOP,先来了解Java的代理机制。  
二、从一个输出日志的实例分析Java的代理机制

1、通用的日志输出方法(日志和业务代码在一起)

2、通过面向接口编程实现日志输出(通过一个代理类来进行日志输出,自己封装代理方法)

3、使用Java的代理机制进行日志输出

第一种方式,需要在每个类里都增加对输出日志信息的代码;第二种方式,虽然实现了业务逻辑与输出日志信息代码的分离,但还是必须依赖于固定的接口;第三种方式,真正实现了对输出日志信息代码的重用,并且不依赖于固定的接口实现。

  
三、AOP的3个关键概念

       学习AOP,关键在于理解AOP的思想,能够使用AOP。只要理解3个重要的概念即可。这3个概念是Pointcut、Advice和Advisor。

1、  切入点(Pointcut)
在介绍Pointcut前,有必要先介绍一下Join Point(连接点)的概念。Join Point指的是程序运行中的某个阶段点,如某个方法调用、异常抛出等。

 
Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发。org.springframework.aop.Pointcut 接口用来指定通知到特定的类和方法。

 
2、通知(Advice)

       Advice是某个连接点所采用的处理逻辑,也就是向连接点注入的代码。表示要在Join Point加入这段代码。

 
3、Advisor

       Advisor是Pointcut和Advice的配置器,它包括Pointcut和Advice,是将Advice注入程序中Pointcut位置的代码。

  
四、Spring的3种切入点(Pointcut)实现

       Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合。Spring主要提供了3种切入点(Pointcut)的实现:静态切入点、动态切入点和自定义切入点。

  
五、Spring的通知(Advice)

       Spring提供了5种Advice类型:Interception Around、Before、After Returning、Throw和Introduction。它们分别在以下情况下被调用:在JointPoint前后、JointPoint前、JointPoint后、JointPoint抛出异常时、JointPoint调用完毕后。

  
六、Spring的Advisor

Advisor是Pointcut和Advice的配置器,它是将Advice注入程序中Pointcut位置的代码。org.springframework.aop.support.DefaultPointcutAdvisor是最通用的Advisor类。在Spring中,主要通过XML的方式来配置Pointcut和Advice。

  
七、用ProxyFactoryBean创建AOP代理

       使用Spring提供的类org.springframework.aop.framework.ProxyFactoryBean是创建AOP的最基本的方式。

 
1、使用ProxyFactoryBean代理目标类的所有方法

2、使用ProxyFactoryBean代理目标类的指定方法(<property name="patterns">)

3、正则表达式简介

  
八、Spring中AOP的两种代理方式

       Spring支持的Java动态代理,其实Spring也支持CGLIB代理。

 
1、Java动态代理

       Spring支持的Java动态代理,也就是说代理的是接口,Spring默认使用的是Java的动态代理。

 
2、CGLIB代理

       Spring也提供了对CGLIB代理的支持,主要改变就是设定ProxyFactoryBean的proxyTargetClass属性,将该属性值设定为true即可。因为要使用CGLIB代理,所以要将cglib-nodep-2.1_3.jar加入到CLASSPATH中。

 
       使用CGLIB代理的好处就是不用再像使用Java动态代理那样去实现特定的接口,一个普通的Java类就可以了。

  
九、Spring中的自动代理

       不管是使用Java的动态代理还是使用CGLIB代理,虽然功能很强大,但是对于每一个类,都要在Spring的配置文档中建立相应的代理,如果只是一个很小的应用系统,还看不出来工作量有多大,但对于一个大型的企业应用来说,工作量就太大了,而且重复性的工作很多,幸好Spring提供了一种自动代理的方式,可以减轻这部分工作。要使用Spring中的动态代理,org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator包是必需的。

  
十、一个用Spring AOP实现异常处理和记录程序执行时间的实例

实例主要用于在一个系统的所有方法执行过程中出现异常时,把异常信息都记录下来,另外记录每个方法的执行时间。用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动代理功能,然后一个用Java的动态代理,一个用CGLIB代理。实现思路是:仍然使用前面所建的Java工程myApp,首先定义负责异常处理的Advice为ExceptionHandler.java,定义记录程序执行时间的Advice为TimeHandler.java,接着定义业务逻辑接口LogicInterface.java,编写实现业务逻辑接口的类Logic1.java,该业务逻辑在Spring AOP中使用Java的动态代理,编写另一个业务逻辑Logic2.java不实现业务逻辑接口,该业务逻辑在Spring AOP中使用CGLIB代理,然后使用自动代理定义配置文件config.xml,最后编写测试程序TestAop.java,执行它并查看输出结果。  
小结:

因为AOP在技术和思想上都还没有完全成熟,如果大量地应用AOP可能会有一定的负面作用,可能会达不到开发者的初衷,使得代码更难以理解。因此,要适度地使用AOP。总的来说,AOP编程的实质就是:业务逻辑不再实现横切关注点,而是由单独的类来封装。当业务逻辑需要用到封装的横切关注点时,AOP会自动把封装的横切关注点插入到具体的业务逻辑中。


随机文章:
Spring宠物商店学习笔记(二) 2008-06-17
Spring宠物商店学习笔记(一) 2008-06-16
Spring精髓 2008-06-03
在项目中应用Spring的Acegi安全框架的步骤 2008-05-04
Spring基础知识(三) 2008-05-04

收藏到:Del.icio.us






Tag:Spring Ioc AOP
引用地址:
aumy2008 发表于23:20:07 | 编辑 | 继续话题 | 转发 | 分享
评论在spring中,某些概念是很容易混淆的。最核心的是Advice(Advice是Aspect的组成部分,它表示具体的关注点实现。但它并不是一个接口,而是一组的接口)、Advisor、Pointcut。
在Spring中,AOP的实现是采用代理子类来实现,在Spring中,代理类的产生有两种:JDK动态代理和CGLIB代理。JDK动态代理是对于接口来说的,而CGLIB是对于类来说的。
在Spring中,一般使用ProxyFactoryBean及其子类来产生代理类。
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。

你可能感兴趣的:(spring,AOP,编程,IOC,oop)