Spring简介
Spring是一个开源框架,它由RodJohnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
IOC和AOP
控制反转模式(也称作依赖性注入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。
在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。
面向切面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。
Spring AOP及基本原理
在面向对象编程中(OOP)中,我们编程的关注点在于某个对象实体有哪些具体功能及其子类功能实现的不同。不同于OOP,面向切面编程(AOP)更多关注的业务流程。在不侵入业务代码的前提下,我们可以通过AOP编程,为业务流程某个具体环节(连接点)增加业务逻辑(通知),这些业务逻辑可能是打印日志、安全控制、事务控制等等。
使用AOP之前必须理解清楚AOP相关的几个概念:通知(Advice)、切点(pointcut)、切面(Aspect)。
- 通知(Advice):通知要解决的是通知什么和什么时候通知的问题。通知什么指的是我们增加的功能,比如日志打印、事务控制等。什么时候通知指的是我们在什么时候调用我们增加的功能。我们可以在方法调用前调用通知(Before)、方法调用后调用通知(After)、方法调用成功后调用通知(After-returning)、方法调用异常后调用通知(After-throwing)、在方法调用前和调用后调用通知(Around)。
- 切点(Pointcut):切点主要定义在什么位置上应用通知,Spring AOP 仅支持方法级别的切面编程(这各其应用动态代理实现有关)。一般我们会指定某个类的某个方法为切点,或者匹配某一通配符的一个或多个方法为切点,还可以指定由某一注解修饰的方法为切点等。
- 切面(Aspect):切面是通知和切点定义的结合,切面定义了在什么时候,什么位置执行什么操作(何时何地执行何种操作)
- 接入点(Join point):程序运行中的一个点,例如方法的执行与异常的处理,在Spring AOP中,一个接入点表示方法的执行。
- 织入(Weaving):织放是将切面加入目标类的过程。在Spring AOP中,织入指的是将切面逻辑应用到目标类中并生成代理类的过程。
AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
在Spring中有两种方式使用 AOP:一是在.xml文件中声明切面 ,二是使用AspectJ注解的方式。
参考来源: