collect的功能是什么?其底层如何实现的?_为什么你要用 Spring ?

bc1f103451921c7ed256f3304dbe5774.png

前言

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

  • Spring框架为我们做了什么,没有Spring框架前我们的程序是什么样的?
  • 为什么要把对象放在Spring容器里面,为什么我不能直接new对象?
  • 为什么要把Sevlet交给Spring MVC管理,我自己写Sevlet处理HTTP请求不行吗?

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 的时候所提出的轻量级,简单的设计原则开始背道而驰,关于这点你又是怎么评价呢?个人知识有限,不喜勿喷,欢迎发表评论和分享你的观点和看法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.3.0配置 spark_配置scala 2.11.12的spark-2.3.0 maven依赖项的问题

我在尝试在POM.xml中为spark-scala应用程序设置maven denpendency时遇到问题 .我在用 :SCALA版本$ scalaWelcome to Scala 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_162).SPARK版本:$ ./spark-shellWelcome to SPARK version 2.3.0Using Scala ver…

m3u8合并mp4软件_m3u8格式转mp4究极办法!

你们来这个号这么久了!还没给你们分享过一些实用的干货。打今天起这个公众号将给大家推荐一些APP和实用的小软件和一些小教程。生命太短,没时间留给遗憾。若不是终点,都不要把自己留在原地,请一直微笑向前!我是帮忙坏哥…

android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...

先上效果图:制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面,点击Rec的new先,然后点击Rec,然后就save到本地成gif文件这里做一个左右旋转,上下旋转,和左右移动的动画,先自己建立一个View的类&…

vm虚拟机安装包_一次Miniconda虚拟机安装的神奇踩坑记录

本人一直都是在物理机环境下使用Anaconda,好处是提供了比较完全的机器学习包,还有方便的虚拟环境,缺点是体积太大。但如果直接用Anaconda中的根目录环境作为pycharm中的Python解释器,因为在运行程序前会不断加载根目录中的Python包…

css3弧形跑道效果_Css 实现漂亮弧形

在实现页面五花八门的有特色的ui时,我们有时会遇到要用实现一个弧形,而这样的弧形要怎么实现呢?用图片?好像不大现实,因为这样就要无故多加载一张图片了,这里我们来说说怎么用css的after伪类来实现弧形。先…

python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...

插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进、后退、左转、右转,乌龟的尾巴朝下,它移动时就会画一条线。并且为了增加乌龟画图的艺术价值…

教室信息管理系统mysql_教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)...

方式一:运行截图数据库的sql语句:/*Navicat Oracle Data TransferOracle Client Version : 12.1.0.2.0Source Server : ORCZYTSource Server Version : 120100Source Host : localhost:1521Source Schema : C##ZYTTarget Server Type : ORACLETarget Ser…

mysql having ct_mysql中where和having子句的区别和具体用法

1.mysql中的where和having子句的区别having的用法having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。SQL实例:1.1.显示每个地区的总人口…

Linux rcp命令教程:如何在远程主机和本地之间复制文件(附实例详解和注意事项)

Linux rcp命令介绍 rcp是remote copy的缩写,它是Linux系统中用于在本地主机和远程主机之间复制文件或目录的命令。虽然有更安全的方法(如scp或rsync)可以完成这项任务,但rcp命令让你以简单的方式在两台计算机之间复制文件&#x…

python圆形_Python中的圆形范围

非常感谢大家。在 我实现了我想要的crange(参考Ni和J.F.Sebastian)。在import math class crange: def __init__(self, start, stop, stepNone, moduloNone): if step 0: raise ValueError(crange() arg 3 must not be zero) if step is None and modul…

python实例化对象有new吗_PHP new:实例化对象

前面我们介绍了怎么定义一个类,但是我们要使用类中的属性和方法并不像使用变量和函数那样简单,首先要对类进行实例化才行,下面就来详细介绍一下。 实例化对象 将类实例化成对象非常容易,只需要使用new关键字并在后面加上一个和类名…

note.js和mysql的优劣_nginx与Node.js的优缺点是什么?

ngx相对node有这么几个较大的优点:1.性能更高,毕竟C写的,而且ngx的epoll是裸的,node的epoll是libuv封装的。2.完备的静态资源支持……这个就不说了,你用node写一个和ngx工作完全一致的静态资源库试试……当然npm上有现…

python实现xmind_Python xmind库(生成框架图)

小编在测试日常工作中遇到一个费时的问题,如何将excel中的测试用例,生成测试框架图?经过查阅发现的python xmind库 将excel中的测试用例,生成测试框架图,分为2步 1.解析excel,取出excel中数据(此…

pythondistutils安装_python – 与distutils / pip一起安装Bash完成

我创建了一个简单的Python模块,并希望用pip进行分发.我还想与模块一起安装Bash完成文件.我正在使用Python 2.7.1和pip 0.8.2安装模块.我有这个setup.py:setup(namejenkinsmon,version0.0.1,descriptionJenkins Job Monitor,long_descriptionopen(README.txt).read()…

python代码解读软件_5种带你轻松分析Python代码的软件库

通常,人们会使用两种速度来衡量某种编程语言的优劣,即:开发速度和执行速度。对于Python而言,大家往往受益的是它能够快速地编写代码,而忽略了它是否能够快速地运行,并及时完成既定的任务。因此,…

python try else_python try/except/else与递归

Python版本:2.7。操作系统:Windows 10 64位。在 注意:我找到了一种方法来解决下面描述的问题,它不使用try/except/else语句。我问下面的问题仅仅是因为我很好奇为什么代码的行为方式是这样的,以及是否有一种方法可以使…

python闭包怎么理解_Python:闭包的理解

很多函数型的语言都有闭包这一概念,比如python的兄弟js。人们刚听到闭包这一概念总会觉得它很晦涩,难以理解。其实不然,主要是他的名字起得太抽象了,让人误以为很难。下面举一个例子:#coding:utf-8def foo():nums [0]…

mac ssh客户端_Electerm for Mac(ssh客户端)

Electerm for Mac是一款功能强大的,作为终端或ssh / sftp客户端(类似于xshell)为一体的工具,支持多平台(linux,mac,win),还有自定义终端样式,全局/会话代理,将书签/主题/快速命令同步到github s…

alpine登陆mysql_如何构建一个php7-alpine的docker镜像

我花了大概一周的时间进行了各种踩坑及实验,最终得出了一份可以使用的dockerfile及compose内含如下支持php7mysql_pdopostgre_pdophpredisswoole(可选,如应用swoole,dockerfile及nginx的配置会有所变化)dockerfile分为两部分,一部…

armbian nginx 部署博客_通过Git将Hexo博客部署到服务器

本文首发于我的个人博客https://orxing.top,欢迎来访服务器是用的阿里云ECS CentOS,本来是用来部署WordPress的,后来接触了Hexo,就把Hexo直接部署到了GitHub pages和Coding Pages上,但是最近发现Coding pages经常抽风&…