`

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基础知识汇总 Java开发必看

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

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

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

    Spring基础知识详解

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

    Spring基础教学视频

    ### Spring基础教学视频知识点概述 #### 一、Spring框架简介 ...Spring作为Java领域的重要框架之一,在实际项目开发中有着广泛的应用,掌握其基础知识对于提升个人技术能力和职业发展都具有重要意义。

    spring知识点总结

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

    spring基础jar包.zip

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

    spring基础教程 spring基础教程

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

    spring基础开发的jar包

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

    java及spring基础知识pdf

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

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

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

    Spring 基础知识

    标题中的“Spring基础知识”指的是Spring框架的基本概念和核心特性,这是一个广泛使用的Java应用程序开发框架,尤其在企业级应用中非常流行。Spring框架以其依赖注入(Dependency Injection,DI)和面向切面编程...

    Spring的基础知识.pptx

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

    Spring 基础jar包

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

    Spring入门基础知识带jar包

    Spring入门基础知识带jar包

    spring知识框架详解

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

    spring 2.5 开发基础包

    Spring 2.5 开发基础包是针对Spring框架2.5版本的一个重要资源集合,它为开发者提供了在Java环境中构建企业级应用的基础。这个压缩包包含了一系列必要的库和文档,帮助开发者快速上手并深入理解Spring 2.5的核心功能...

    spring的一个适合初学者的项目

    本项目旨在为初学者提供一个基础的Spring项目实例,帮助大家快速上手并熟悉Spring的核心概念。 首先,我们要了解Spring框架的核心特性。Spring是一个开源的Java平台,它简化了Java EE(企业版)应用的开发。它通过...

    java-spring基础学习资源一

    这个"java-spring基础学习资源一"的压缩包包含了一个名为"spring-learning-master"的项目,很显然,这是一个用于学习Spring框架基础知识的教程或者示例集合。下面将详细探讨Spring框架的基础知识,以及如何利用这些...

    SpringCloud基础知识和相关组件介绍

    SpringCloud 基础知识和相关组件介绍 SpringCloud 是一个用于构建微服务开发和治理的框架集合,主要涉及的组件包括服务注册与发现、负载均衡、熔断器、服务网关、服务调用等。下面将详细介绍这些组件的知识点: ...

Global site tag (gtag.js) - Google Analytics