Spring基础入门详解与实践
【1】基础概念
Spring是轻量级的开源的JavaEE框架,它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层,可以和其他的框架无缝整合。
这里Spring框架其实我们指的是spring-framework,此外其projects还有SpringBoot、SpringData等。
如下所示,目前稳定可用的是5.3.15版本(General Availability,正式发布的版本,官方推荐使用此版本。)
① Spring特征
轻量
Spring 是非侵入性的, 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API。其完整框架大小jar只有1M多,且其所需要的处理开销很小。
控制反转(依赖注入)
Spring通过一种称作控制反转的IOC技术促进了低耦合。当应用了IOC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或查找需要的对象。
面向切片(AOP-aspect oriented programming)
Spring支持面向切片编程,把应用业务逻辑和系统服务分离开来。典型应用比如系统日志采集。
容器
Spring 是一个容器, 因为它包含并且管理应用对象的生命周期。Spring 提供了两种类型的 IOC 容器实现:BeanFactory-IOC 容器的基本实现 和 ApplicationContext-提供了更多的高级特性,是 BeanFactory 的子接口。
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身。ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory。
框架
Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象,Spring也提供了很多基础功能(事务管理、持久化框集成等),将应用逻辑的开发留给程序员。
主要包说明如下表
包 | 说明 |
org.springframework.core | spring和核心包负责IOC基本实现 |
org.springframework.beans | 顾名思义,bean的管理 |
rg.springframework.aop | SpringAOP面向切面编程实现 |
org.springframework.context | 提供在基础IOC功能上的扩展服务,比如邮件服务、任务调度、JNDI定位等 |
org.springframework.context.support | spring context的扩展支持,用于MVC方面 |
org.springframework.web | web应用开发时需要的核心类 |
org.springframework.web.mvc | springMVC应用开发时的核心类 |
org.springframework.transaction | 为JDBC、JPA等提供的一套事务管理 |
org.springframework.test | 对junit等测试框架的封装 |
org.springframework.expression | SpringEL表达式语言 |
org.springframework.jdbc | 对JDBC的简单封装 |
org.springframework.jms | 为简化JSM简单实用做的封装 |
org.springframework.orm | 整合第三方ORM实现比如hibernate、jpa |
org.springframework.oxm | Spring对object/xml的支持,可以让对象与xml相互转换 |
org.springframework.web.portlet | SpringMVC 的增强 |
org.springframework.web.servlet | 对servlet3.0的支持 |
org.springframework.instrument | Spring对服务器的代理接口 |
org.springframework.instrument.tomcat | Spring对Tomcat的集成 |
org.org.springframework.asm | Spring3.0开始提供自己独立的asm包 |
② Spring功能模块
① Core Container核心容器
Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成。
核心容器提供Spring框架的基础功能,其核心组件是BeanFactory,是工厂模式的实现。BeanFactory使用控制反转(依赖注入)IOC模式将程序需要的bean的配置与依赖规范与实际的应用程序解耦。IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。
Beans:负责Bean工厂中Bean的装配,所谓Bean工厂即是创建对象的工厂,Bean的装配也就是对象的创建工作;
Core:这个模块即是负责IOC(控制反转)最基本的实现;
Context:Spring的IOC容器,因大量调用Spring Core中的函数,整合了Spring的大部分功能。Bean创建好对象后,由Context负责建立Bean与Bean之间的关系并维护。所以也可以把Context看成是Bean关系的集合;
SpEl:即Spring Expression Language(Spring表达式语言);
IoC文英全称Inversion of Control,即控制反转,可以这么理解IoC容器:“把某些业务对 象的控制权交给一个平台或者框架来统一管理,这个统一管理的平台可以称为IoC容器。”
IOC的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理, 这可以带来很多好处:
1)资源集中管理,实现资源的可配置和易管理
2)降低了使用资源双方的依赖程度,也就是我们说的耦合度
② Data Access/Integration(数据访问/集成)
JDBC:对JDBC的简单封装,提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。
ORM:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务
OXM:提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。
JMS:指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Transations:事务管理,支持编程和声明式事务管理。具体实现交由不同的ORM框架处理。
③ Spring AOP
提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。
Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
Spring AOP 其余IOC一样是spring的核心模块,围绕着AOP的增强功能,Spring集成了AspectJ作为AOP的一个特定实现,同时还在JVM动态代理/CGLIB的基础上,实现了一个AOP框架作为spring集成其他模块的工具,比如TransactionProxyFactoryBean声明式事务处理,就是通过AOP集成到Spring中的。在这个模块中,Spring AOP实现了一个完整的建立AOP代理对象,实现AOP拦截器,直至实现各种Advice通知的过程。
④ Spring Web
Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。Web层使用Web层框架,可选的,可以是Spring自己的MVC框架,或者提供的Web框架,如Struts、Webwork、tapestry和jsf。
Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:
Web 模块提供了基本的面向 web 的集成功能,例如多个文件上传的功能和使用 servlet 监听器和面向 web 应用程序的上下文来初始化 IoC 容器。
Web-MVC 模块包含 Spring 的模型-视图-控制器(MVC),实现了 web 应用程序。
Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。
Web-Portlet 模块提供了在 portlet 环境中实现 MVC,并且反映了 Web-Servlet 模块的功能。
⑤ 其他模块
Instrumentation(设备):在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。
Messaging(消息):Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。
Test(测试):我们在做单元测试时,Spring会帮我们初始化一些测试过程当中需要用到的资源对象;支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。
③ IOC容器与依赖反转模式
依赖反转是指依赖对象的获得这种行为被反转了。依赖控制反转的实现有很多方式,Spring中IOC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。
通过使用IOC容器,对象依赖关系的管理被反转了,转到IOC容器中来了,对象之间的相互依赖关系由IOC容器进行管理,并由IOC容器完成对象的注入。
这里的“反转”还可以认为是“责任”的反转,把责任交给了容器。
在Spring中,Spring IOC提供了一个基本的JavaBean容器,通过IOC模式管理依赖关系,并通过依赖注入和AOP切面增强了为JavaBean这样的POJO对象赋予事务管理、生命周期管理等基本功能。
在Spring IOC容器的设计中,我们可以看到两个主要的容器系列。一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境作了许多适配。
BeanFactory体现了Spring为提供给用户使用的IOC容器所设定的最基本的功能规范。在这些Spring提供的基本IOC容器的接口定义和实现的基础上,Spring通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及它们之间的相互依赖关系。
BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。我们都知道,在计算机世界里,所有的功能都是建立在通过数据对现实进行抽象的基础上的。IOC容器是用来管理对象依赖关系的,对IOC容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构,依赖反转功能都是围绕对整个BeanDefinition的处理来完成的。这些BeanDefinition就像是容器里装的水,有了这些基本数据,容器才能够发挥作用。
【2】常见配置
① 整合多个配置文件
Spring 允许通过 将多个配置文件引入到一个文件中,进行配置文件的集成。这样在启动 Spring 容器时,仅需要指定这个合并好的配置文件就可以。
import 元素的 resource 属性支持 Spring 的标准的路径资源。
类型 | 实例 | 说明 |
classpath: | classpath:applicationContext-*.xml | 从类路径下加载资源 |
file: | file:/conf/shirt.xml | 从文件目录中读取文件,可以是相对或绝对路径 |
http:// |
http://yun.janeyuekeji.com/resources/beas.xml |
从web服务器加载资源 |
ftp:// | ftp://yun.janeyuekeji.com/resources/beas.xml | 从FTP服务器加载资源 |
【3】Spring5
① Spring 5.0框架自带了通用的日志封装
Spring5已经移除Log4jConfigListener,官方建议使用Log4j2。Spring5整合Log4j2需要引入:log4j-api-2.11.2.jar、log4j-core-2.11.2.jar、log4j-slf4j-impl-2.11.2.jar、slf4j-api-1.7.30.jar。由于log4j的,建议使用log4j-api-2.16.0jar、log4j-core-2.16.0.jar。
② Spring5框架核心容器支持@Nullable
注解
@Nullable
注解可以使用在方法上面,属性上面,参数上面。表示方法返回可以为空,属性值可以为空,参数值可以为空。
- 注解用在方法上面,方法返回值可以为空
- 注解使用在方法参数里面,方法参数可以为空
- 注解使用在属性上面,属性值可以为空
③ Spring5核心容器支持函数式风格GenericApplicationContext
//函数式风格创建对象,交给spring进行管理 public void testGenericApplicationContext() { //1 创建GenericApplicationContext对象 GenericApplicationContext context = new GenericApplicationContext(); //2 调用context的方法对象注册 context.refresh(); context.registerBean("user1",User.class,() -> new User()); //3 获取在spring注册的对象 User user = (User)context.getBean("user1"); System.out.println(user); }
④ Spring5支持整合JUnit5
⑤ Spring5框架 新功能 Webflux
SpringWebflux是Spring5添加新的模块,用于web开发的,功能和SpringMVC类似的。Webflux使用当前一种比较流程响应式编程出现的框架。
使用传统web框架,比如SpringMVC,这些基于Servlet容器,Webflux是一种异步非阻塞的框架,异步非阻塞的框架在Servlet3.1以后才支持,核心是基于Reactor的相关API实现的。
Webflux特点:
- 非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以Reactor为基础实现响应式编程
- 函数式编程:Spring5框架基于java8,Webflux使用Java8函数式编程方式实现路由请求
与SpringMVC对比
两个框架都可以使用注解方式,都运行在Tomet等容器中。SpringMVC采用命令式编程,Webflux采用异步响应式编程。
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。 电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似”=B1+C1″的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。
核心组件对比
发表评论