Spring框架核心概念

Spring生于2003年,为应对早期J2EE规范复杂性而生的编程模型,spring编程模型不包含Java EE规范。

Spring规范

Spring集成了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 Boot 的加持下,Spring生态已成为Java应用开发的行业标准。

Spring 5开始WebFlux应用可以不直接使用Servlet API。

Spring设计理念

1、Spring不要求程序设计先行。如,可通过配置切换持久层,无需更改代码。

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

3、向后兼容性, spring演变经过精心设计,可在版本之间执行重大改变。

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

5、为代码质量设定高标准,Spring Framework强调有意义,代码干净结构清晰,包之间没有循环依赖。

若刚开始使用Spring,推荐使用Spring Boot应用构建Spring应用 。

Spring IoC和Bean

Spring框架的IoC容器基础:

org.springframework.beans和org.springframework.context

BeanFactory接口提供高级配置机制用于管理所有类型的对象。

ApplicationContext是BeanFactory子接口。

BeanFactory提供配置框架和基本功能,ApplicationContext为企业级应用添加特定功能。

Spring容器

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

优雅地关闭容器

非Web应用程序环境使用Spring IoC容器(如:富客户端桌面应用),关闭Spring容器的方法:

ConfigurableApplicationContext.registerShutdownHook

Spring表达式

Spring Expression Language(简称“SpEL”)是一种表达式语言,支持运行时查询和对象图操作,语法类似于Unified EL。

Spring AOP/Aspect-oriented Programming 

AOP提供另一种程序结构补充面向对象编程(OOP)。

OOP模块化核心单元是类,AOP模块化单元是方面。

方面实现跨越多种类型和对象关注点(如:事务管理)的模块化。

AOP是Spring关键组件,Spring IoC容器虽不依赖AOP,但AOP补充了Spring IoC,使Spring解决方案更完善。

Spring Null-safety

尽管Java不允许在类型系统中声明null-safety,但Spring在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正好相反:将数据缓冲区的数据流变为对象流。

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