Spring框架核心概念一览

Spring成立于2003年,当时为了应对早期J2EE规范的复杂性应运而生的编程模型,Spring编程模型不包含Java EE平台规范。

它集成了JAVA EE规范中的一些内容,Servlet API (JSR 340)、WebSocket API (JSR 356)、Concurrency Utilities (JSR 236)、JSON Binding API (JSR 367)、Bean Validation (JSR 303)、JPA (JSR 338)、JMS (JSR 914),以及必要时用于事务协调的JTA / JCA设置。

Spring Framework除了自身提供了的依赖注入机制的规范,还支持(JSR 330)和Common Annotations(JSR 250)的规范,可以选择使用这些规范进行依赖注入。

今天的Spring Framework,在Spring Boot的帮助下,应用程序以devops和cloud-friendly的方式创建,支持Servlet容器的嵌入和一些细微变化。

从Spring Framework 5开始,WebFlux应用程序甚至不直接使用Servlet API,并且可以不在Servlet容器的里运行(例如Netty)。

除了Spring Framework之外,还有其他项目,例如Spring Boot,Spring Security,Spring Data,Spring Cloud,Spring Batch等。
重要的是要记住每个项目都有自己的源代码存储库,问题跟踪器和发布节奏。有关Spring项目的完整列表,请参见spring.io/projects。

Spring Framework设计理念

1、提供各个层面的选择。Spring并不要求程序设计先行。例如,可以通过配置切换持久层的程序,而无需更改代码。许多其他基础架构问题以及与第三方API的集成也是如此。

2、适应不同的设计理念,Spring拥抱灵活性,并不武断的认为设计就应该如何做,它以不同的视角支持广泛的应用需求。

3、尽可能的保持向后兼容性, Spring的演变经过精心设计,可以在版本之间进行一些重大改变。

4、重视API设计,Spring团队投入了大量的思考和时间来制作直观的API,这些API可以在多个版本和多年中保持不变。

5、为代码质量设定高标准,Spring Framework强调有意义,最新且准确的Javadoc。 它是极少数可以称得上代码干净结构清晰的项目之一,包之间没有循环依赖。

如果刚开始使用Spring,通过创建基于Spring Boot的应用程序来使用Spring Framework是最容易的 。

Spring IoC容器和Bean简介

在org.springframework.beans和org.springframework.context包是Spring框架的IoC容器的基础。BeanFactory接口提供的高级配置机制用于管理所有类型的对象。ApplicationContext 是BeanFactory的子接口。BeanFactory提供了配置框架和基本功能,而ApplicationContext为企业级应用添加了特定的功能。

Spring容器概览

ApplicationContext接口用于表示Spring IoC容器,负责实例化,配置和组装bean。

非Web应用程序中优雅地关闭Spring IoC容器

如果在非Web应用程序环境中使用Spring的IoC容器(例如,在富客户端桌面环境中),ConfigurableApplicationContext接口的registerShutdownHook方法可以释放所有资源。

Spring表达式

Spring Expression Language(简称“SpEL”)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于Unified EL,但提供了其他功能,最着名的是方法调用和基本字符串模板功能。

Spring面向方面编程Aspect-oriented Programming (AOP) 

面向方面编程(AOP)通过提供另一种程序结构的方式来补充面向对象编程(OOP)。OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面。方面实现了跨越多种类型和对象的关注点(例如事务管理)的模块化。

Spring的一个关键组件是AOP框架。虽然Spring IoC容器不依赖于AOP(意味着如果不想使用AOP,则不需要使用AOP),AOP补充了Spring IoC,以提供非常强大的中间件解决方案。

Spring Null-safety

尽管Java不允许在类型系统中声明null-safety,但Spring Framework在org.springframework.lang包中提供以下注释,以便声明API和字段的可空性:

@NonNull:规定的参数、返回值或字段不能为null

@Nullable:规定的参数,返回值或字段可以为null。

@NonNullApi:包级别的注释,非null作为参数和返回值的默认行为。

@NonNullFields:包级别的注释,非null作为字段的默认行为。

Spring数据缓冲区和编解码器

DataBuffer接口定义了字节缓冲器的抽象行为。引入它(而不是使用标准java.nio.ByteBuffer)的主要原因是Netty。Netty不使用ByteBuffer,而是使用ByteBuf作为替代品。

Spring DataBuffer是对ByteBuf简单的抽象,也可以在非Netty平台上使用(即Servlet 3.1+)。

Spring编解码器

org.springframework.core.codec的包下面主要包含两个抽象,用于将字节流转换为对象流,反之亦然。

Encoder是一个策略接口,它将对象流编码为数据缓冲区的输出流。

Decoder正好相反:原来的数据缓冲区的一个流变为对象流。

注意,解码器实例需要考虑引用计数。