Spring是一款开源的免费框架,是一个轻量级控制反转(IOC)和面向切面(AOP)的Java EE框架。轻量级指的是不依赖容器就能运行的,Spring最初的作者是Rod Jahnson,现在已经被Pivotal SoftWare公司收购。一般所谓的Spring指的仅仅是Spring旗下的Spring Framework这一款产品,在Spring被Pivotal公司接收后相继研发出了Spring Boot、Spring Cloud等产品。
Spring Boot是一个整合Spring各项功能的中间件,用于快速开发Spring应用。
Spring Cloud是为了应对日益增长的业务需求而开发出的一套完整的基于微服务的分布式解决方案。
Spring Framework、Spring Boot、Spring Cloud这三款框架的依赖是递增的,也就是说Spring Cloud的基础是Spring Boot,Spring Boot的基础是Spring Framework。
Spring框架是应用最广泛地轻量级Java EE框架之一,它已IOC、AOP为主要思想,能够协同Struts2、Hibernate、WebWork、JSF、iBatis等众多框架。
(一)Spring IOC
(1)IOC
(Inverse Of Control,控制反转)是Spring核心功能之一,它将应用程序的配置和依赖性规范与实际的应用程序代码分开。
例如,在开发过程中业务层需要调用数据层的方法,这是我们会选择在业务层中手动创建数据层对象。Spring IOC致力于将对象的创建过程以及对象的依赖性关系通过应用程序开完成,控制权还交给了应用程序,所以被称为控制反转。使用Spring我们还会将数据层对此昂和业务层对象的创建工作交给Spring来负责。
由于业务层中需要调用数据层方法,即业务层对象对数据层对象存在依赖,那么Spring在创建业务层对象的同时还会讲数据层对象注入到业务层对象中,该过程被称为依赖注入(DI)。
(2)DI
(Dependency Injection,依赖注入)组件之间依赖关系有容器在运行期决定。即由容器动态地将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更大功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
(3)自定义IOC框架核心步骤
1)通过XML文件定义需要交给容器来创建的Java类型,以及对象之间的依赖关系。
2)通过XML解析读取信息,使用Java反射来创建所需的Java对象。
3)将创建好的Java对象保存到全局的对象容器中。
4)通过XML配置将A对象中所依赖的其他类型的B对象注入到A对象中。
5)在需要使用对象时从容器中取出对象使用。
(二)Spring IOC使用过程
(1)工厂模式
如果某个对象不能用new的方式来获取,而是通过其他第三方工具使用工厂模式产生的,那么在定义Bean标签时需要把<bean>的class属性配置为工厂类(或者把factory-bean属性配置为工厂类对象),使用属性factoryMethod来定义工厂类中获取此对象的方法。
(2)选择构造函数创建对象
在创建对象时,如果想通过不同的构造方法创建可以在bean标签下使用<constructor-arg>标签来定义构造函数的参数,一个<cinstructor-arg>标签表示一个构造函数,如果有多个构造函数则使用多个标签,前提是类中必须定义对应的带参构造函数。
(3)单例模式
Spring在创建对象时默认采用单例模式,即在Spring容器中同一类型的对象只会保存一个,如果想用非单例模式就需要在bean标签中使用singleton="false"(4.0之前)或者scope="prototype"(4.0之后)进行修改。
scope在Web环境下还可设置为request和session:
request表示每次发送新的请求都会创建一个对象。
session表示在一次会话中使用的是同一个对象。
<property>标签用于向对象中进行属性注入,注入的属性可以是基本数据类型、String、集合、键值对、对象,<property>标签配置在<bean>标签之下。
1)基本数据类型和字符串的注入
基本数据类型和字符串的注入都可使用<property>标签下的<value>子标签完成,如果要给字符串属性注入空串<value>中空着就可以了,如果想要注入null就需要使用<null>标签。
2)对象注入
注入对象的方式有两种:
第一种注入已有的bean对象,使用ref属性ref="bean id"或者<ref bean="bean id">子标签都可。
第二种注入还未通过<bean>标签创建对象,在<property>标签中适用<bean>标签来定义匿名对象。
3)List注入
要为对象注入List集合需要在<property>中适用<list>子标签,在<list>子标签中通过<value>标签配置任意类型对象。如果为Java对象,则使用ref指定,或者使用<bean>定义新势力。如果是普通类型等直接使用字符串。<list>中的元素会按照配置的先后顺序排序。
4)Set注入
要为对象注入Set集合需要在<property>中使用<set>子标签,<set>标签中可通过<value>标签配置任意类型对象。如果为Java对象,则使用ref指定,或者使用<bean>定义新实例。如果是普通类型直接使用字符串。
5)Map注入
要为对象注入Map键值对需要使用<property>的子标签<map>。<entry>配置Map中的元素,key指定键,如果key为对象使用key-ref属性;value指定值,如果为Java对象使用ref指定,或者使用<bean>定义新实例。
(4)在applicationContext.xml文件中使用外界资源文件
有时我们在配置<bean>标签时需要注入一些数据给对象。例如但我们使用Spring来创建JDBC Connection对象或者连接池对象时都需要配置连接数据库的相关信息,可以直接在配置文件中写,但是这样不利于维护。可以将这些信息配置在资源文件中然后通过加载资源文件在XML文件中直接使用资源文件的值。
例如使用Spring创建c3p0连接池对象:
1)首先导入c3p0的jar包以及它的依赖包。创建一个c3p0.properties的资源文件,在该资源文件中定义jdbc的连接信息以及c3p0的各种信息。
2)在XML中使用<bean>标签创建资源文件加载器对象,该对象不需要定义id,Spring会通过类型完成注入。
3)使用<bean>标签创建c3p0数据源对象,适用el表达式获取资源文件中的数据,将该数据注入到c3p0的各项属性中去。
4)在需要该连接池对象的类中定义对应的属性,提供get、set方法,再通过<bean>标签完成依赖注入即可。
(三)Spring中常用的jar包
(1)Spring AOP:Spring面向切面编程,提供AOP(面向切面编程)的实现。
(2)Spring Aspects:Spring提供的对AspectJ框架的整合。
(3)Spring Beans:Spring IOC的基础实现,彪悍访问配置文件、创建和管理Bean等。
(4)Spring Context:在基础IOC上提供扩展服务。
(5)Spring Context Support:Spring Context的扩展支持,用于MVC层面。
(6)Spring Core:Spring的核心工具包。
(7)Spring expression:Spring表达式语言。
(8)Spring Instruction Tomcat:Spring对Tomcat连接池的集成。
(9)Spring JDBC:对JDBC的简单封装。
(10)Spring JMS:为简化jms api的使用而做成的简单封装。
(11)Spring orm:整合第三方的orm实现,比如hiberbate,ibatis,jdo以及Spring的ipa实现。
(12)Spring oxm:Spring对于object/xml映射的支持,可以让Java与XML之间来回切换。
(13)Spring test:对Junit等测试框架的简单封装。
(14)Spring tx:为JDBC、Hibernate、JDO、JPA等提供的一致声明式和编程式事务管理。
(15)Spring web:包含Web应用开发时用到的Spring框架核心类,包括自动载入Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。
(16)Spring webmvc:包含SpringMVC框架相关的所有类。
(四)Spring框架的组成
Spring的七大模块各个模块功能如下:
(1)Core模块:核心容器提供Spring框架的基本功能(Spring Core)。核心容器主要组件是BeanFactory,是工厂模式的实现,BeanFactory使用控制反转(IOC)模式将应用程序配置和依赖性规范与实际的应用程序代码分开。
(2)AOP模块:通过配置管理特性,Spring AOP模块直接将面向切面的编程功能集成到了Spring框架中,使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务,通过使用Spring AOP,不用依赖JB组件就可以将声明性事务管理集成到应用程序中。
(3)ORM模块:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。
(4)DAO模块:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常处理代码量(连接的打开、关闭)。Spring DAO的面相JDBC的异常遵从通用的DAO异常层次结构。
(5)Web模块:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以Spring支持与JakartaStruts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
(6)Context模块:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务(JNDI、EJB、电子邮件、国际化、校验和调度功能)。
(7)Web MVC模块:MVC模块是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架称为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POL。