学习Spring的思考框架

简介: 很早之前听同事说:“要开会了。我都知道领导要问什么,就那几板斧。”其实领导之所以为领导,人家问的问题确实很合情合理,甚至可以说一针见血。而之所以能问出来这些合理的问题,就是因为头脑中有自己的思考框架。比如要做一件事情,一个思考框架就是:1,我们现在是什么样的?2,我们要做成什么样(解决什么问题、有什么收益)?3,怎么才能达成(解决路径)?

引子


很早之前听同事说:“要开会了。我都知道领导要问什么,就那几板斧。”其实领导之所以为领导,人家问的问题确实很合情合理,甚至可以说一针见血。而之所以能问出来这些合理的问题,就是因为头脑中有自己的思考框架。比如要做一件事情,一个思考框架就是:


1,我们现在是什么样的?


2,我们要做成什么样(解决什么问题、有什么收益)?


3,怎么才能达成(解决路径)?

 

根据这个思考框架,开会的时候,给领导做汇报,一上来就说我做了什么什么。领导自然要问:“做这件事情有什么收益?” 如果一项任务指标特别好,领导就要问了:“那我们是怎么做到的呢?”


这种框架式自上而下的思考习惯,对做任何事情都会有帮助。比如想学习Spring,就先问自己3个问题:


1,出现Spring之前是什么样子?


2,Spring的目标是什么?


3,Spring是怎么做到的呢?

 

出现Spring之前是什么样子


出现Spring之前,MVC这种设计典范已经开始兴起。在显示层、模型层和控制层都有了一些工具的支持。比如显示层有JQuery+JSON,模型层有ibatis,控制层有Struts。开发人员的主要精力应该放到业务逻辑的开发。但是开发前需要做一件事情:将MVC需要的这些东西组装起来。每个人在新搭建一个工程时都需要进行组装。那有没有一个东西把开发人员需要的东西都弄好了,开发人员只需要将精力用户业务逻辑开发呢?Spring就是为了解决这个问题而生。

 

Spring的目标是什么


Spring就是要最大限度的简化开发工作,让开发人员集中精力于自己的业务逻辑,也是DDD领域驱动开发。


Spring是怎么做到的呢


核心问题解决


1,解耦


开发人员希望聚焦DDD的开发,首先要解决的事情是我修改一个业务代码,不希望显示层、模型层和控制层都要改。不希望改一个类,依赖它的类也需要改。Spring为了应对这个问题使用了控制反转的理念。将所有的依赖都由框架注入到一个上下文环境中(DI)。在这个环境中,Bean之间可以自由的使用。


2,复用


有了DI(依赖注入)的支持,开发人员可以具体聚焦DDD的开发了。一个优秀程序员的最大的美德是懒惰。一些逻辑,比如日志,鉴权,很多地方都需要用到。这个业务逻辑关系又不是很紧密,代码基本上就是拷贝一下。那怎么能将这些业务特点不强的逻辑从开发人员的工作中剔除掉呢?这就用到了AOP(面向切面)编程。以上Spring要解决的核心问题解耦和复用的解决方案就是Spring的核心:控制反转、依赖注入和AOP。


核心功能实现


为了将Spring的核心功能实现出来,就需要用到Robert Martin提出的SOLID原则。分别是单一职责、开放封闭、里氏替换、接口隔离和依赖倒置。控制反转、依赖注入和AOP,分别对应了三个spring的jar包:spring-beans、spring-context、spring-aop。每个包单一的负责一个核心功能的实现。这些都需要先做对象的实例化,这个功能由spring-core这个jar包来实现。在Spring-beans中,Spring使用工厂模式来管理程序中使用的对象Bean。每个Bean实例以BeanDefinition的形式被创建,通过java的反射机制将需要初始化的字段写入,最终保存在BeanDefinitionMap中。这整个过程由容器来实现,完成了控制反转。有了控制反转,开发者可以通过调用getBean获取到所需要的对象。spring-context提供文件列表的读入,将所有依赖的Bean放到一个Context中,就是常说的依赖注入。AOP的主要作用是不通过修改源代码的方式将功能代码织入来实现对方法的增强。实现的关键在于使用了代理模式。代理主要分为静态代理和动态代理。静态代理最简单的实现就是创建一个代理类,将对象new出来之后,在调用方法前后都加上代码。调用方调用代理类而不直接调用原始类。动态代理主要是JDK动态代理和Cglib动态代理,这里就不详细展开了。

 

总结


本文从技术上,只介绍了Spring框架部分的核心功能。大家可以按照这个思路继续将其他部分纳入体系。当然,本文用的思考框架也只是思考框架的一种,是偏产品化的一个视角。完全可以用偏技术化的视角比如:「是什么、为什么、怎么办」的思考框架,只要保持一个风格、梳理成体系就好。以上Spring相关的部分,用一张图总结如下


1112728-20191027090000855-1920574863.png


相关文章
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
3月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
319 2
|
2月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
5月前
|
Java Spring
聊聊你对SpringBoot框架的理解 ?
SpringBoot是Spring家族中流行的子项目,旨在简化Spring框架开发的繁琐配置。它主要提供三大功能:starter起步依赖简化依赖管理,自动配置根据条件创建Bean,以及内嵌Web服务器支持Jar包运行,极大提升了开发效率。
188 0
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
157 8
|
3月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
482 1
|
5月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
673 1
|
4月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
973 0
|
5月前
|
NoSQL Java 数据库连接
SpringBoot框架
Spring Boot 是 Spring 家族中最流行的框架,旨在简化 Spring 应用的初始搭建与开发。它通过自动配置、起步依赖和内嵌服务器三大核心功能,大幅减少配置复杂度,提升开发效率。开发者可快速构建独立运行的 Web 应用,并支持多种数据访问技术和第三方集成。

热门文章

最新文章