Spring框架学习
一、spring 概述
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件。Spring提供了约20多个组件,开发者可以根据自己需要选择组件。Spring的核心是控制反转(IoC)和面向切面编程(AOP)
上图是Spring的七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。 Spring Core 模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Sprign的所有功能都是借助IOC实现的。
- Spring AOP:面向切面编程(Aspect Orient Programming)支持允许将一些通用的任务入安全、事物、日志、缓存等进行集中式处理,从而提供了更好的复用,AOP通常用来处理一些具有横切性质的系统级服务。在 OOP 中模块化的关键单元是类,而在 AOP 中模块化的关键单元是方面。面向对象编程使系统的实现变得简单,但是当系统过于复杂时,仅仅面向对象就不够了。
- spring ORM:对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
- spring DAO:数据存取对象(Data Access Object)是用于访问数据的对象,虽然在大多数情况下将数据存在数据库中,但这并不是唯一的选择,也可以将数据存储到文件中或LDAP中。DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。提供DAO层的抽象可以带来一些好处:可以很容易地构造模拟对象,方便单元测试的开展;在使用切面时会有更多的选择,既可以使用JDK动态代理,又可以使用 CGLib动态代理。
- spring Web:是一个一站式的框架,提供了表现层(springmvc)到业务层(spring)再到数据层的全bai套解决方案。
- spring MVC:是基于Spring功能之上添加的Web框架,想用spring MVC必须先依赖spring Web,spring MVC仅给spring的表现层提供支持。
- spring Context:可以理解为spring的是上下文,主要包括:DefaultListableBeanFactory,这就是大家常说的 ioc 容器,它里面有很多 map、list,spring 帮我们创建的 singleton 类型的 bean 就存放在其中一个 map 中,我们定义的监听器(ApplicationListener)也被放到一个 Set 集合中;BeanDefinitionRegistry;AnnotatedBeanDefinitionReader;扩展点集合,存放 spring 扩展点(主要是 BeanFactoryPostProcessor、BeanPostProcessor)接口的 list 集合。
- spring Core:spring核心的功能就是一个工厂模式,spring相当于为你的项目专门成立一个工厂,这个工厂负责创建对象,委会对象之间的关系,以前是直接new,现在从spring的工厂里面获取。
二、IOC
IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。
spring中有三种注入方式,一种是set注入,一种是接口注入,另一种是构造方法注入。
IOC,字面理解是控制反转,即对象的控制权被反转了(是什么)。之前一个对象中依赖另一个对象,需要自己new出来,当对象间的依赖关系非常复杂时,这个过程就变得很繁琐,并且代码间的耦合会很高。现在可以通过Ioc容器来管理控制对象的生成,可以把对象的实例化过程简单化,代码间解耦(为什么)。具体可以从DI(Dependency Injection) DL(Dependency Lookup)两个角度理解Ioc。DI中注入的方式包括属性,构造器,setter注入,DL含义是通过容器的API来查找所依赖的资源和协作对象,从Ioc容器维护的bean map中取出来(怎么做)
三、AOP
Aop就是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
为什么?
利用Aop可以对业务逻辑的各部分进行隔离,从而降低各部分耦合度,提高程序的可重用性,提高开发效率
怎么做?
spring中面向切面变成的实现有两种方式,一种是动态代理,一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是有继承,即,
- 接口+实现类,spring采用jdk的动态代理实现,
- 实现类,spring采用cglib字节码增强实现。
当然也可以通过集成AspectJ可以更方便的实现自定义切面。Spring Aop支持前/后/环绕等多种类型的通知机制:
- before(前置通知):在一个方法之前执行的通知。
- after(最终通知):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
- after-returning(后置通知):在某连接点正常完成后执行的通知。
- after-throwing(异常通知):在方法抛出异常退出时执行的通知。
- around(环绕通知):在方法调用前后触发的通知。
好处?
- 轻量级的容器框架没有侵入性
- 使用IoC容器更加容易组合对象直接间关系,面向接口编程,降低耦合
- Aop可以更加容易的进行功能扩展,遵循ocp开发原则
- 创建对象默认是单例的,不需要再使用单例模式进行处理
- 基于Ioc Aop,Spring提供了事务管理,Spring Web,日志等一系列经典应用
缺点?
业务功能依赖spring特有的功能,依赖与spring环境。
四、依赖注入(DI)
Spring 最认同的技术是控制反转的依赖注入(DI)模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。
当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类粘合在一起,并且在同一时间让它们保持独立。
到底什么是依赖注入?让我们将这两个词分开来看一看。这里将依赖关系部分转化为两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都意味着类 B 将通过 IoC 被注入到类 A 中。
依赖注入可以以向构造函数传递参数的方式发生,或者通过使用 setter 方法 post-construction。
五、spring 实例