写在前面
Java基础入门以后,要渡过一个非常关键的提升期,不要再去反复磨基础知识了,要在实践中反过来发现基础知识的漏洞并补缺,同时也不断提升基础知识。只有知道基础知识是用来干什么的,才能真正掌握它。
Spring和Springboot不是java的唯一进阶方向,只不过是非常主流的方向之一。不要认为会Spring和Springboot就是“更厉害的Java程序员”,必须明确认识到——Spring和Springboot是“把非常复杂的Java项目简单化、傻瓜化”的一种东西。更进一步地,Springboot是把Spring简单化、傻瓜化。可以这样理解:用纯粹的Java来做大型项目越来越难以掌控、效率越来越低的时候,Spring像开挂一样出现,解决了很多问题;后来Spring的楼越盖越高,老鸟们都在100层以上,但新来的爬到10几层就累趴了,Springboot像一部直达电梯一样出现了。
学习Springboot,如果你是搞过项目的过来人,它是帮助你解决更复杂问题的;而如果你是菜鸟,它是你开挂的阶梯,让你能快速直达老鸟的脚下看看风景,否则等到你爬到今天老鸟的位置上,老鸟又飞到1000层开外了。本文和本系列针对后者,属于前者类型的读者可以绕行了,走前感谢你慷慨给了一次“阅读”,同时也欢迎给出斧正意见。
接下来以Springboot为主线,必要时才提及Spring。
先明确Springboot是干什么的(和不能干什么)。
对于初学者,Springboot能让你很方便地写出一个“运行在服务器上的程序”。什么是“运行在服务器上的程序”?微信、QQ、淘宝、支付宝、王者、吃鸡、CSDN、360安全卫士、共享单车、选课系统、CET报名和查分系统……现在几乎所有的数字应用都是由“电脑或手机上的前端界面”和“服务器上的后台程序”组成的,是的,Springboot就是写这些后台的。“能”写任意后台,但并不一定都适合,到底哪些适合,暂不讨论。
后台和前端之间什么关系?什么区别?前台负责貌美如花负责呵护备至,脏活累活后台来做。前台后台之间会交换数据,前台负责收集和展示数据,后台负责接收并处理数据。近几年随着网络和云概念的普及,基本上可以说前后台通常处于网络的两个端,很少有前后台在同一个物理节点上的应用了(单机斗地主就是,但大家更喜欢上网和其他真实玩家一起玩)。
Springboot,就是在服务器上接收、处理、并发回数据的。(敲黑板,Springboot本身没有前台界面哦,界面怎么办?先猜猜)
Springboot不能干什么?首先,不能显示任何东西(有异议先保留)。其次,java不能干的它都不能干,除此之外没了。(java不能干啥?课外知识)
针对spring没有界面这个问题,学springboot,你需要另外有一个给你做界面的妹纸。没有?稍后教你靠自己的双手咯(别下车!真的是去幼儿园!)。
一、环境搭建
在真正开始环境搭建前,我们要先明确我们需要怎样的一个环境。
spring boot是java编写的所以我们需要一个java IDE,spring boot是一个框架所以我们还需要一个能自动生成spring boot框架代码的插件。
所以我们这里的环境搭建,就是安装jdk、安装eclipse、再安装一个能自动生成spring boot框架代码的插件。
对于jdk而言一般都是需要我们自己安装,但对于后两者其实有很多IDE就已经把插件给集成好了,比如几乎成为事实标准的IntelliJ IDEA,又比如spring boot官方已经提供了用于开发spring boot的定制版eclipse(STS,Spring Tool Suite)。都直接下载使用即可,非常方便,在日常的开发中我们也非常推荐直接使用这两个IDE。
另外还要说明“能自动生成spring boot框架代码的插件”本质是到https://start.spring.io/把代码下载下来,所以不安装插件直接从该页面下载框架然后就用原版eclipse开发spring boot也是可行的。
但考虑到可能有些小伙伴已经装有了eclipse又不想再装个IDE,也不想跑一趟网页,我们这里还是介绍使用原版eclipse再在其上安装spring插件进行开发的方法。
最后,不管是“网页+Eclipse”、“插件+Eclipse”、STS、IntelliJ IDEA本质都是一个意思,尤其是第三大节的代码总是可以使用的。
1.1 安装jdk
jdk一是用于运行eclipse,二是用于开发spring boot项目。
安装方法可参考链接:https://www.cnblogs.com/lsdb/p/6497816.html
jdk官方下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
1.2 安装eclipse
eclipse可用于开发多种语言的项目,选择Eclipse IDE for Java EE Developers版本下载,解压即可(Eclipse IDE for Java Developers版本应该也可以)
官方下载地址:https://www.eclipse.org/downloads/packages/
1.3 安装spring插件
打开eclipse—-菜单—-Help—-Eclipse Marketplace—-在Find搜索框中输入spring—-回车搜索
二、新建spring boot项目
打开eclipse—-菜单—-File—-New—-Project(插件装成功后才会有Spring Boot项)
填好项目信息,点击next(这里本质还是到https://start.spring.io/页面生成项目)
finish之后我们就得到了一个spring boot项目,其目录结构如下(此时所有东西都是自动生成的未做任何改动)
三、实现REST请求
在上一步中我们已经得到了一个spring boot项目,下边我们以在此基础上实现一个rest请求作为开发演示
3.1 创建项目结构
首先我们按习惯在demo目录下,创建model文件夹(用于存放model)、dao文件夹(用于存放数据访问文件)、controller文件夹(用于存放控制器)、service(用于存放主要的程序逻辑代码)
(不过下面为了简单起见dao和service不用到,只使用model,然后controller直接返回结果。)
3.2 实现model
在model文件夹创建Test.java文件,写入以下内容:
package com.example.demo.model; public class Test { private final long id; private final String content; public Test(long id, String content) { this.id = id; this.content = content; } public long getId() { return id; } public String getContent() { return content; } }
3.3 实现controller
在controller文件夹创建TestController.java文件,写入以下内容:
(该内容主要是对test和test1两个请求进行响应,test和test1两个请求的返回结果是一样的写两个是为了强调一个Controller文件就可以处理多个请求,不用每个请求都建一个Controller)
package com.example.demo.controller; import java.util.concurrent.atomic.AtomicLong; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.example.demo.model.Test; @RestController public class TestController { private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong(); @RequestMapping("/test") public Test dealTest(@RequestParam(value="name", defaultValue="World") String name) { return new Test(counter.incrementAndGet(), String.format(template, name)); } @RequestMapping("/test1") public Test dealTest1(@RequestParam(value="name", defaultValue="World") String name) { return new Test(counter.incrementAndGet(), String.format(template, name)); } }
完成后项目结构如下:
3.4 运行项目
选择项目—-右键—-Run As—-Spring Boot App
控制台选项卡会打印运行日志,如下我们可以看到监听于本地8080端口
又由于我们前面创建了test请求的响应,此时通过浏览器访问http://localhost:8080/test,响应结果如下:
3.5 实现热部署
在当前项目中但凡我们对项目文件有所修改,要修其生效都要手动重新运行;比如我们将请求修从test修改为modify,要此修改生效就得手动重新运行这是比较麻烦的。
如果能修改保存之后系统自己重新运行那是非常好的,这就是所谓的热部署,而spring boot通过简单配置就能实现热部署。
首生,打开项目根目录下的pom.xml文件,在<dependencies></dependencies>标签内加入以下内容:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
其次,eclipse菜单—-Project菜单—-确保Build Automatically处于钩选状态。
经此两步,每当选择“保存”eclipse检测到项目有修改就会自动重新构建项目免去手动重启的麻烦。
四、使用体验
4.1 关于spring boot本身
如果我们去看ssh的书(比如《Struts2 Spring Hibernate框架技术与项目实战》)就会看到厚厚的一本,然后其中很大部分内容是教你到哪下载什么文件放到哪里然后要修改哪些配置文件—-反正就是说搭建ssh开发环境就是一件旁杂的事情。
但到spring boot中一是spring boot其实可以实现ssh的作用消灭了一堆集成配置,二是自带tomcat消灭了tomcat的安装配置,三是自身支持REST,四是maven/gradle简化了jar文件的下载安装及一些配置,通过这几点确实实现了其“简单”的口号。
4.2 关于spring、spring mvc、spring boot和spring cloud的关系
spring是一个实现控制反转(IoC)和向向切片(AOP)的框架。
spring mvc基于spring,是一个mvc框架。和struts2同性质。
spring boot基于spring mvc。主要改进是集成tomcat等,能自己直接运行。
spring cloud基于spring boot。spring boot是集鉴权、路由等所有功能于一体的单体应用;spring cloud是由一个个专注于一个功能的spring boot应用组成的分布式应用(分布式指一个功能是一个单独的服务,并不一定说部在不同机器上),比如专注服务治理的eurake、专注路由的zuul等。在学习时我们要抓住eurake等也是一个spring boot应用,就不会太过感到畏惧。