1.Spring简介

Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。

Spring总结起来优点如下:

1.低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦)。

2.声明式事务管理(基于切面和惯例)

3.方便集成其他框架(如MyBatis、Hibernate)

4.降低Java开发难度

5.Spring框架中包括了J2EE三层的每一层的解决方案(一站式)

Spring总结作用如下:

1.Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。

2.Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。

3.Spring 能非常简单的帮我们管理数据库事务。

4.Spring还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板来方便数据库访问。

5.Spring还提供与第三方Web(如Struts1/2、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。

6.Spring 能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。

Spring框架的组成结构图如下所示:

spring spel stream使用 spring shine_AOP

2. Spring的核心机制

2.1.loc: lnverse of Control(控制反转)

读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

  • 正控:若要使用某个对象,需要自己去负责对象的创建
  • 反控:若要使用某个对象,只需要从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架
  • 好莱坞法则:Don’t call me ,I’ll call you

2.1.1 示例

控制反转显然是一个抽象的概念,我们举一个鲜明的例子来说明。在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。

然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。请注意你并没有”主动”去创造橙汁,橙汁是由饮品店创造的,不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。

2.2.DI(依赖注入)

Rod Johnson是第一个高度重视以配置文件来管理Java实例的协作关系的人,他给这种方式起了一个名字:控制反转(Inverse of Control,IoC)。后来Martine Fowler为这种方式起了另一个名称:依赖注入(Dependency Injection),因此不管是依赖注入,还是控制反转,其含义完全相同。当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,在传统模式下通常有两种做法:

  1. 原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。
  2. 简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
    注意上面的主动二字,这必然会导致调用者与被依赖对象实现类的硬编码耦合,非常不利于项目升级的维护。使用Spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可,由此可见,使用Spring后,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受——所以Rod Johnson称之为控制反转。另外从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,因此Martine Fowler称之为依赖注入。
    总结: loC和DI实是同-个概念的不同角度描述,DI相对loC而唁,明确描述了“被注入对象依赖loC容器配置依赖对象”

2.3.Spring AOP(面向切面编程)

AOP即Aspect Oriented Program面向切面编程如果说loC是Spring的核心,那么面向切面编程就是Spring最为重要的功能之一了 ,在数据库事务中切面编程被广泛使用。
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
●所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
●所谓的周边功能,比如性能统计,日志,務管理等等
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面。在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能"编织"在一起,这就叫AOP。

2.3.1Spring的AOP支持

Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。
为了在应用中使用@AspectJ支持,Spring需要添加三个库:
• aspectjweaver.jar
• aspectjrt.jar
• aopalliance.jar
并在Spring配置文件中做如下配置:

<!--启动@AspectJ支持-->
<aop:aspectj-autoproxy/>

<!--指定自动搜索Bean组件、自动搜索切面类-->
<context:component-scan base-package="edu.shu.sprint.service">
    <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>