前言

现在Spring几乎成为了Java在企业级复杂应用开发的代名词,得益于Spring简单的设计哲学和其完善的生态圈,确实为廉颇老矣,尚能饭否的 Java 带来了“春天”,有很多同学刚接触Java就直接从Spring框架开始学习,导致产生了很多疑惑,甚至有很多同学只知道用Spring,并不了解其中的原理,例如:

  1. Spring框架为我们做了什么,没有Spring框架前我们的程序是什么样的?
  2. 为什么要把对象放在Spring容器里面,为什么我不能直接new对象?
  3. 为什么要把Sevlet交给Spring MVC管理,我自己写Sevlet处理HTTP请求不行吗?
  4. Spring为什么要封装这么多的 Template(JDBCTemplate,RestTemplate等……)它想要干什么?

Spring 生态遍地开发(SpringBoot,SpringCloud 等等),本篇文章不会深入探讨Spring 每个框架的实现细节,只会大概讲Spring Framework背后的设计理念和它为我们所做的事情,让大家知其然并知其所以然,可以在用 Spring 的时候能知悉底层和内部细节发生的事情,如果是对于 Spring Frameword 和其生态框架的细节有兴趣的同学可以在详尽的阅读官方的文档,https://spring.io/projects(这应该是我见过写的最好的技术文档之一)

Spring 为我们做了哪些事情?

Spring 全家桶框架众多,但主要的设计原则简单来说,离不开这几点:

  • 通过代码解耦,提高代码灵活性(依赖注入 DI)
  • 简化开发,用最少的代码,做最多的事情(AOP,Template)
  • 提供公共抽象,屏蔽底层,开箱即用,替换方便(Spring Cache,框架,中间件集成)
  • MVC模型的快速实现(视图解析,数据转换)

下面拆开来说说这几点,为我们带来什么好处,最后探讨下,如果没有 Spring 用原生的 J2EE 我们的程序会变成什么样

先说说 Spring Framework 的核心功能,DI 依赖注入,AOP 面向切面编程

依赖注入也叫 IOC 控制反转,依赖注入是编程大师 Martin Fowler 提出来的,我个人比较喜欢依赖注入这个名词,感觉比控制反转更具有表达性,也更容易理解

那么依赖注入为我们做了什么 ?

  • 灵活:依提供的面向接口的编程方法,为类和类之间建立更灵活的关系
  • 解耦:移除了直接在程序中 new 实例的高耦合做法
  • 方便:要替换类的实现,只需要在 Spring 容器中更换声明,无需改动代码

那么 AOP 面向切面又为我们做了什么?

  • 消除重复的模板代码(性能监控,异常封装,参数跟踪等……)
  • 更代码结构更加整洁,通用的逻辑基本都可以用 AOP 来处理
  • Spring 的声明式事务就是 Spring AOP 的优秀实现案例

还为我们做了什么其他的事情?

  • Spring JdbcTemplate 消除了JDBC API令人诟病的模板代码
  • Spring Cache 提供缓存功能,并且无需关心底层缓存组件细节(Ehcache,Guava,JSR-107 Cache等……)
  • Spring DAO 提供连接池功能,并且无需关心底层连接池组件细节(C3P0,DBCP等……)
  • 提供 定时任务功能 集成(Quartz,JDK Timer,Executor)
  • 整合ORM框架,测试框架集成
  • 快速实现MVC模型,并且集成Sring,数据处理,视图解析等都由Spring处理

以上等等功能,都是 Spring 框架为我们做处理的事情

当然 Spring 生态里还有非常多的框架来简化我们的日常开发,提高开发效率,常用的例如:

  • Spring Boot (无需配置,快速开发,启动,集成生产级的监控指标)
  • Spring Cloud(快速实现微服务的框架,提供系列微服务的组件框架)
  • Spring Shrio(基于角色资源的安全框架,利用AOP实现鉴权等安全访问的功能)
  • Spring Data(提供数据访问实现,包括非关系数据库,关系数据库,云数据服务等)

假如没有 Spring ?

让我们想象一下,假如没有 Spring,我们在做企业级应用开发会大概会发生什么事情?

  • 类和类之间通过 new 建立关系,充满耦合,小处改动都要修改大量代码
  • 充满和业务无关的模板代码,10行代码可能只有1行是业务逻辑
  • 大量的事务,异常,JDBC的模板处理代码,不仅代码极度脆弱,容易出错,而且可读性极差,基本不可维护
  • 你要为每个请求写一个 Servlet 处理,并且自己处理 request/response,Servlet 也充斥着大量重复的模板代码
  • 你项目的代码量可能会比现在多很多

以上,你是如何看待 Spring 带来的复杂性和提供的便利性?现在 Spring 体系也越来越庞大,貌似与它刚开始对抗 EJB 的时候所提出的轻量级,简单的设计原则开始背道而驰,关于这点你又是怎么评价呢?个人知识有限,不喜勿喷,欢迎发表评论和分享你的观点和看法。

为什么你要用 Spring?的更多相关文章

  1. 阅读spring源码

    读Spring源码之前,你要先清楚,为什么你要用Spring... Spring最基本的功能是做为管理bean的容器,所以我以为应该先从org.springframework.context包了解咯, ...

  2. 五分钟学Java:一篇文章搞懂spring和springMVC

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在什么时候?相信很多人和我一样,第一次了 ...

  3. 五分钟学Java:一篇文章带你搞懂spring全家桶套餐

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在 ...

  4. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  5. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  6. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  7. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  8. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  9. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

随机推荐

  1. AJAX异步提交form表单

    记录: 网上有说怎么做,没说怎么接收,打印了一下数据,记录一下取值: 比如说有如下form: <form id="form1" name="form1" ...

  2. Java:Web Service初入门

    前言 Web Service技术在我第一次接触,又没有实际使用时完全不理解这是什么.以为是一种类似Spring,Shiro的编程框架.后来渐渐理解,WS(即Web Service缩写)是一种通用的接口 ...

  3. mysql 正确清理binlog日志的两种方法

    前言: MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉 ...

  4. HDU 4283:You Are the One(区间DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:有n个数字,不操作的情况下从左到右按顺序输出,但是可以先让前面的数字进栈,让后面的数字输出,然后栈里 ...

  5. 【搜索引擎】 PostgreSQL 10 实时全文检索和分词、相似搜索、模糊匹配实现类似Google搜索自动提示

    需求分析 要通过PostgreSQL实现类似Google搜索自动提示的功能,例如要实现一个查询海量数据中的商品名字,每次输入就提示用户各种相关搜索选项,例如淘宝.京东等电商查询 思路 这个功能可以用 ...

  6. Oracle Goldengate是如何保证数据有序和确保数据不丢失的?

    工作中一直在用Oracle 的中间件Oracle GondenGate 是如何保证消息的有序和不丢失呢? Oracle GoldenGate逻辑架构 首先,先看一下Oracle GoldenGate ...

  7. 02(b)多元无约束优化问题-最速下降法

    此部分内容接02(a)多元无约束优化问题的内容! 第一类:最速下降法(Steepest descent method) \[f({{\mathbf{x}}_{k}}+\mathbf{\delta }) ...

  8. 走近Java之HashMap In JDK8

    HashMap,继承AbstractMap类,实现了Map接口,特性是无序不可重复,其本身的数据结构是数组加链表和红黑树.今天我们就一起来详细了解一下. 首先,需要知道,HashMap中几个关键词的含 ...

  9. 20140115-SqlHelper为什么是静态的

    为什么SqlHelper(或工具类)是静态的? 静态构造函数仅调用一次(即只是在程序生命周期中实例一次),在程序驻留的应用程序域的生存期内,静态类一直保留在内存中 这样可以减少每次使用的实例过程,就是 ...

  10. 【DFS例题】等式

    题目如下: 这道题依然是一道dfs(要求输出方案数很明显用dfs呐) 首先一个模板贴上来: void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return ...