查看原文
其他

Spring 源码分析(一)从基本介绍开始(系列文章基于Spring 5.0)

Java精选 2022-08-09

摘要:本文结合《Spring源码深度解析》来分析Spring 5.0.6版本的源代码。若有描述错误之处,欢迎指正。

前言

作为一名开发人员,阅读源码是一个很好的学习方式。本文将结合《Spring源码深度解析》来分析Spring 5.0.6版本的源代码,若有描述错误之处,欢迎指正。

Spring是2003年兴起的一个轻量级Java开源框架,旨在解决企业应用开发的复杂性。Spring发展至今,衍生出非常丰富的模块,并应用在多种场景,比如:桌面应用,Web应用等。Spring的模块化可以允许你只使用需要的模块,而不必全部引入。

一、整体架构

Spring框架是一个分层架构,他包含一系列的功能要素,并被分为大约20个模块,如下图所示(很遗憾,并没有找到Spring5的架构图,下图是Spring4的,但结合Spring5的源码来看,该图还是能够体现Spring5的核心模块)

这些模块被总结为以下几部分。

1. 核心容器

Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块。Core和Beans模块是框架的基础部分,提供IoC(控制反转)和DI(依赖注入)特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

2. 数据访问/集成

3. Web

4. AOP

5. Test

Test模块支持使用JUnit和TestNG对Spring组件进行测试。

二、设计理念

Spring是面向Bean的编程(BOP:Bean Oriented Programming),Bean在Spring中才是真正的主角。Bean在Spring中作用就像Object对OOP的意义一样,没有对象的概念就像没有面向对象编程,Spring中没有Bean也就没有Spring存在的意义。Spring提供了IoC 容器通过配置文件或者注解的方式来管理对象之间的依赖关系。
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

三、使用场景

前面描述的模块使得Spring成为许多场景中的合理选择,从在资源受限设备上运行的嵌入式应用程序到使用Spring事务管理功能和Web框架集成的全面的企业应用程序。

1. 典型的Spring web应用程序

Spring的声明式事务管理功能支持web应用程序全事务化,就同你使用EJB容器管理的事务一样。所有你的定制业务逻辑都可以由简单的POJOs实现,并由Spring IoC容器管理。其他服务包括发送email和独立于web层的校验,而你可以选择何处去执行校验规则。Spring的ORM支持同JPA和Hibernate的整合,比如,当你使用Hibernate时,可以保持原有的映射文件及标准Hibernate SessionFactory配置。表单控制器无缝整合了web层和域模型,无需那些转换HTTP参数到域模型的ActionForms或其他类。

2. Spring中间层使用第三方web框架

有时情况并不允许你完全切换到一个不同的框架。Spring框架不是一个要么使用全部特性要么什么都用不了的解决方案,不强制使用其中的每个功能。现存的前端如Struts,Tapestry,JSF或其他UI框架都可以同基于Spring的中间层整合在一起,从而使你能够使用Spring事务功能。你只需要使用ApplicationContext连接你的业务逻辑以及通过WebApplicationContext整合你的web层。

 3. 远程调用

你可以使用Spring的Hessian-,Rmi-或HttpInvokerProxyFactoryBean类来通过web服务访问现存的代码。远程访问现存应用程序并不困难。

 4. EJBs-包装现存POJOs

Spring框架还为企业JavaBeans提供了一个访问抽象层,使你能够重用现有的POJO,并将其包装在无状态会话bean中,以便在可能需要声名式安全的可扩展,故障安全的web应用程序中使用。

作者:写出高级BUG

cnblogs.com/warehouse/p/9372260.html

往期精选  点击标题可跳转

微软公司将不兼容 IE 的网站自动重定向至 Edge 浏览器

面试官问:MyBatis 日志如何做到兼容所有常用的日志框架?

为什么很多公司强制弃坑 Fastjson 了?主推 Jackson

MySQL 中 delete、truncate、drop 关键字的区别有哪些,该如何选择?

Spring 最常用的 7 大类注解,哪些你还不知道?

Spring Boot 项目中如何更规范的使用 PageHelper 分页插件?

如何实现 MySQL 中通过SQL语句删除重复记录并且只保留一条记录

面试必问:Redis 持久化是如何做的?RDB 和 AOF 对比分析

Spring Boot 集成 Quartz 实现定时任务的动态创建、启动、暂停、恢复、删除等操作

IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

点个赞,就知道你“在看”!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存