- 近几年java开发人员最经常接触的框架莫过于spring了。
- 发展至今spring已经将所有功能都模块化,除了几个核心模块其他的都可以按照自己的需要自行增删。
- 而不变的是,最开始并且至今最核心的功能都是其基于控制反转(IOC)、依赖注入(DI)的作为容器,对象管理的功能,无论是用户分布式开发的spring-cloud还是帮助快速开发的spring-boot都是离不开它的。
- 官方文档对于核心框架的图解是这样的:
- 而我理解spring的核心应该是只包含下半部分图的:
- | - |
---|---|
|
|
|
|
|
|
|
Core Container
- spring本身是作为一个对象管理容器而生,管理所有对象自生成至销毁这整个生命周期。Core Container只是一个概念,它是由几个基础功能模块构成,也就是Beans、Core、Context、SpEL这四个模块。
Core
- Core模块提供了spring最基础功能的工具类
Beans
- Beans模块,控制反转、依赖注入都是需要先理解对象之间的依赖关系才能进行的,而spring就是通过bean这个模块来表示对象的描述的
- Bean类表示的是java中对象元数据的描述,一个bean包含了对象所归属的class、成员变量的值(value)/引用(referent to another bean)。
Context
- Context模块作为类似于JNDI(Java Naming and Directory Interface) registry的角色,它告诉开发人员应该如何去定义一个对象。
- 定义对象的途径,主要是通过xml文件中定义Bean标签,在java程序中使用@Bean、@Component等注解来标注类和函数。
Context-Support
- Context模块提供的是spring容器原生使用的接口,而Context-Support则是提供了一系列接口,可以让其他的第三方框架能够无缝的接入到spring框架容器中。
SpEL
- 由于spring需要去解析xml这样的文本配置文件,所以需要提供SpEL这样的表达式解析引擎,让开发人员可以直接在文本文件中直接使用字符串来定义出具有一定功能的对象(最简单的莫过于数学表达式:#{1 * 1}和对象成员的表示:#{beanName.name})。
Container Extension Points
- Spring容器管理了java对象整个生命周期,但实际开发过程中常常是需要根据不同的场景在对象的不同生命阶段做不同的是,spring提供了几个对于对象生命周期的管理
- BeanPostProcessors: 在生成java对象时修改java对象
- BeanFactoryPostProcessor: 在生成bean对象是修改bean里面的元数据
- 对象生命周期函数: spring容器在不同生命周期会调用不同的生命周期函数,只是需要java类去实现这些不同的生命周期接口
- Aware: 让java对象可以获取到spring的上下文。不同的Aware接口提供不同上下文的获取,但都是基于org.springframework.beans.factory.Aware
AOP
- 面向切面编程近几年也比较火,主要是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。spring也提供了AOP模块,让开发人员无侵入的扩展程序功能。
Aspects
- 切面则是AOP编程中的最重要的组成部分
Test
- spring提供给开发人员做单元测试的测试框架,最常用的莫过于junit了