重学SpringBoot系列之基础知识回顾

x33g5p2x  于2021-11-24 转载在 Spring  
字(7.5k)|赞(0)|评价(0)|浏览(325)

SpringBoot项目结构

项目结构目录整体上符合maven规范要求:

目录位置功能
src/main/java项目java文件存放位置,初始化包含主程序入口 XxxApplication,可以通过直接运行该类来 启动 Spring Boot应用
src/main/resources存放静态资源,图片、CSS、JavaScript、web页面模板文件等
src/test单元测试代码目录
.gitignoregit版本管理排除文件
target文件夹项目代码构建打包结果文件存放位置,不需要人为维护
pom.xmlmaven项目配置文件
application.properties(application.yml)用于存放程序的各种依赖模块的配置信息,比如服务端口,数据库连接配置等
  • src/main/resources/static主要用来存放css、图片、js等开发用静态文件
  • src/main/resources/public用来存放可以直接用于访问的html文件
  • src/main/resources/templates用来存放web开发模板文件

Spring Boot 、 Spring MVC 、Spring对比

首先你需要明白一件事情:Spring Boot项目目的并不是替换Spring、SpringMVC,而是使他们用起来更加简单。

Spring 框架

Spring框架最核心的特性就是依赖注入DI(Dependency Injecttion)和控制反转IOC(Inversion Of Control)。如果你能够合理的使用DI和IOC,可以开发出松耦合、扩展性好的的应用程序

Spring MVC

Spring MVC提供了一种友好的方式来开发Web应用程序。 通过使用诸如Dispatcher Servlet,ModelAndView和View Resolver,可以轻松开发Web应用程序。

Spring Boot

Spring 和 Spring MVC最大的弊病在于存在大量的配置,并且这些配置在不同的项目中具有很高的相似性。从而导致重复配置,繁琐而且杂乱!

Spring Boot期望通过结合自动配置和starters来解决了这个问题。 另外,Spring Boot还提供了一些功能,可以更快地构建可用于生产环境的应用程序

Spring Boot 自动配置

Spring和Spring MVC应用程序里面有大量的XML或Java Bean配置。Spring Boot为解决这个问题,提供一种新的解决方案,新的思维方式。

springboot思考的方式:是不是可以更加智能一点,当Spring中加入一些新的jar包,加入一些配置,可以自动的影响应用内的bean的加载。 比如:Spring MVC JAR位于类路径中时,自动配置Dispatcher Servlet。当然,当这些自动的默认配置不符合我们的要求的时候,我们可以修改。修改之前加载的这一些Bean,配置修改之后会自动加载另外一些Bean。

什么是Spring Boot Starter?

Spring Boot Starter是一组被依赖第三方类库的集合。

如果你要开发一个web应用程序,就通过包管理工具(如maven)引入spring-boot-starter-web就可以了,而不用分别引入下面这么多依赖类库,spring-boot-starter-web一次性帮你引入下面的这些常用类库。

  • Spring — spring 核心, beans, context上下文, AOP面向切面
  • Web MVC — Spring MVC
  • Jackson — JSON数据的序列化与反序列化
  • Validation — Hibernate参数校验及校验API
  • 嵌入式 Servlet Container — Tomcat
  • 日志框架Logging — logback, slf4j

什么是Spring Boot Starter Parent

所有的Spring Boot项目默认使用spring-boot-starter-parent作为应用程序的父项目。

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.0.RELEASE</version>
</parent>

继承父项目的好处在于: 统一java版本配置和其他的一些依赖类库的版本。也就是说,你引入的第三方类库不要加版本号,父项目替你管理版本,而且是经过兼容性测试的。比你自己随便引入一个版本兼容性更好。

当然父项目只能帮你管理一些常用类库的版本,如果你引入一些不常用的jar,还是要自己管理版本号及兼容性!

嵌入式web容器

Spring boot打成jar包,默认包含嵌入式的web容器:tomcat。你可以简单的使用如下命令启动一个web服务:

java -jar springboot-demo.jar

这更有利于微服务的部署及微服务的构建、启动、扩容。Spring Boot还支持Jetty和Undertow作为web容器。

Spring Data

Spring Data的目标是提供一种更友好的方式或者是API来存取数据。包括对于关系型数据库和NOSQL数据的支持。比如:

  • Spring Data JPA — 关系型数据库操作的API,友好且易于使用
  • Spring Data MongoDB -MongoDB的操作API
  • Spring Data REST — 从持久层Repositories自动生成服务层API,暴露 REST APIs
    接口。超级好用!

当然,Spring Data还有更多好用的特性和支持等待你去探索!

spring boot2.x新特性

基础环境升级

最低 JDK 8,支持 JDK 9,不再支持 Java 6 和 7。Spring Boot 2.0 要求 Java 8 作为最低版本,许多现有的 API 已更新,以利用 Java 8 的特性。

例如,接口上的默认方法,函数回调以及新的 API,如 javax.time。

如果你正在使用 Java 7 或更早版本,则在开发 Spring Boot 2.0 应用程序之前,需要升级你的 JDK。

依赖组件升级

Jetty 9.4,Jetty 是一个开源的 Servlet 容器,它为基于 Java 的 Web 内容,例如 JSP 和 Servlet 提供运行环境。Jetty 是使用 Java 语言编写的,它的 API 以一组 JAR 包的形式发布。

Tomcat 8.5,Apache Tomcat 8.5.x 旨在取代 8.0.x,完全支持 Java 9。

Flyway 5,Flyway 是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway 可以像 SVN 管理不同人的代码那样,管理不同人的 SQL 脚本,从而做到数据库同步。

Hibernate 5.2,Hibernate 是一款非常流行的 ORM 框架。

Gradle 3.4,Spring Boot 的 Gradle 插件在很大程度上已被重写,有了重大的改进。

Thymeleaf 3.0,Thymeleaf 3 相对于 Thymeleaf 2 有非常大的性能提升。

默认软件替换

默认数据库连接池已从 Tomcat 切换到 HikariCP,HikariCP 是一个高性能的 JDBC 连接池,Hikari 是日语“光”的意思。

redis客户端默认使用 Lettuce,替换掉Jedis.Lettuce 是一个可伸缩的线程安全的 Redis 客户端,用于同步、异步和反应使用。多个线程可以共享同一个 RedisConnection,它利用优秀 Netty NIO 框架来高效地管理多个连接,支持先进的 Redis 功能,如 Sentinel、集群、流水线、自动重新连接和 Redis 数据模型。

新技术的引入

响应式编程WebFlux,重要的变革,后续章节会详细展示

支持 Quartz,Spring Boot 1.0 并没有提供对 Quartz 的支持,之前出现了各种集成方案,Spring Boot 2.0 给出了最简单的集成方式。
对Kotlin 的支持

JOOQ 的支持,JOOQ 是基于 Java 访问关系型数据库的工具包。JOOQ 既吸取了传统 ORM 操作数据的简单性和安全性,又保留了原生
SQL 的灵活性,它更像是介于 ORMS 和 JDBC 的中间层。

springboot启动banner的设置

在 Spring Boot 1.0 项目中 src/main/resources 路径下新建一个 banner.txt 文件,文件中写入一些字符,启动项目时就会发现默认的 Banner 被替换了,到了 Spring Boot 2.0 现在可以支持 Gif 文件的打印,Spring Boot 2.0 在项目启动的时候,会将 Gif 图片的每一个画面,按照顺序打印在日志中,所有的画面打印完毕后,才会启动 Spring Boot 项目。

lombok

lombok使用的比较频繁,我这里记录两个平时用但是没怎么注意的注解

Slf4j注解

将在编译期自动帮我们引入Logger日志常量,我们在代码中就直接使用log.info或log.debug打印日志即可。下图中红色代码就用Slf4j注解代替就可以了。

Builder注解

在Java类上使用Builder注解之后,我们可以使用如下代码为对象属性赋值

LombokPOJO lombokPOJO = LombokPOJO.builder()
        .name("kobe")
        .age(39)
        .build();

IDEA环境下的热加载与热部署

使用Jrebel插件

这是最简单的一种方式,但是有一定的个局限性,Jrebel插件是收费的。虽然有破解方案,但是不建议!有需要的同学自行研究,这里就不多做介绍了

Jrebel插件在有些Spring Boot版本不够兼容,会报错,越新的版本越容易报错。所以笔者目前还是选择性放弃使用该方法!

第一步:安装插件,按照箭头所示选择安装。安装完成之后,要重启IDEA才能生效。

第二步:激活。在安装完成之后,右上角会多出这样几个按钮。点击之后会提示你进行插件激活,可以注册码激活,也可以在线激活。也可以填写个人姓名、邮箱、电话之后获取10天的试用!

第三步:更新操作触发配置,这个配置不仅结合Jrebel使用有效,对于其他的方式实现开发过程中需要自动更新的情况下,也要勾选上。

在Spring Boot项目启动配置中,选择下图中的红色框中的内容:uodate classes and resources on ‘update’ action

配置完成后,通过右上角的JR按钮启动SpringBoot项目。就可以实现改动代码和资源的自动更新。

devtools实现热加载

这是一种对于SpringBoot而言比较常见的一种实现方式。

引入devtools的maven依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional>
</dependency>

spring-boot-devtools从名称就可以看出来,是开发者工具包,其主要的功能就是实现热加载。

其实现原理就是两个ClassLoader,一个负责加载那些不会经常改变的文件,比如:第三方jar包,一旦引入项目之后这部分代码在调试过程中就处于不变的状态;一个负责加载可能经常改变的类,比如我们自己在项目中写的代码,被称为restart ClassLoader。当有代码发生改变的时候,重建一个restart ClassLoader,原有的restart ClassLoader被丢掉。由于每次重新加载的内容较少,所以速度比手动重启更快一些

设置IDEA

  • 首先,运行时编译配置:组合键:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾 “compiler.automake.allow.when.app.running” 。

  • 其次,自动化编译配置: “File” -> “Settings” -> “Build,Execution,Deplyment” -> “Compiler”,选中打勾 “Make project automatically” 。这是一种重新自动化的编译整体项目的方法。但是笔者一般不这么做,因为IDEA的文件是自动保存的,你想修改一个字符串,有可能你只修改完成第一个字符它就重新编译了,重新加载启动。所以,笔者一般代码修改完成之后,使用Ctrl + F9快捷键对修改类重新编译,而不是做项目的自动化编译。

  • 最后,在一些相对旧的IDEA版本上运行时配置,按如下图形勾选。(新版本IDEA已经不需要了)

修改一下application.properties配置

在比较新的Spring Boot devtools版本中我们已经不需要做如下的配置了,但是如果你以上的步骤都完成了,仍然无法实现代码更改之后的热加载,请参考下面的方法。在有些版本我们需要配置热加载生效的开关,使其值等于true。

下文是properties格式配置,喜欢yml格式的同学可以自行调整一下。默认情况下,支持热加载的目录如下,如果需要其它目录下文件支持热加载需要手动配置:

  • /META-INF/maven
  • /META-INF/resources
  • /resources
  • /static
  • /public
  • /templates
#热加载生效
spring.devtools.restart.enabled=true
#额外新增的热加载目录
spring.devtools.restart.additional-paths= src/main/java
#热加载排除目录
#spring.devtools.restart.exclude=

LiveReload插件

最后建议你去chrome 浏览器插件商店安装一个插件叫做LiveReload。

Spring devtools默认会启动一个 Live Reload Server实例,监听文件的变化。并实时的与浏览器插件通信,更新浏览器展示界面。这样,你就不用每次更改内容之后都点击浏览器刷新按钮了。

开发过程中常用IDEA插件

Codota

极其强大的代码自动补全

当我们第一次使用某个类,对该类的某个函数不够熟悉时,可以通过该插件搜索相关用法,快速模仿学习。

Auto filling Java call arguments

开发中,我们通常会调用其他已经编写好的函数,调用后需要填充参数,但是绝大多数情况下,传入的变量名称和该函数的参数名一致,当参数较多时,手动单个填充参数非常浪费时间

该插件就可以帮你解决这个问题。

安装完该插件以后,调用一个函数,使用 Alt+Enter 组合键,调出 “Auto fill call parameters” 自动使用该函数定义的参数名填充。

GsonFormat

GsonFormat插件工具可以快速的将JSON转换为实体类

{
    "id": 1,
    "author": "zimug",
    "title": "手摸手教你开发spring boot",
    "content": "c",
    "createTime": "",
    "reader":[{"name":"zimug","age":18},{"name":"kobe","age":37}]
}

插件安装好之后,先定义一个空的实体类(只有类名和花括号),使用快捷键Alt + S调出代码生成配置页面,相信后面你就都会了。这是根据JSON生成出来的对应的java bean的代码

public class Article {

    /** * id : 1 * author : zimug * title : 手摸手教你开发spring boot * content : c * createTime : * reader : [{"name":"zimug","age":18},{"name":"kobe","age":37}] */

    private Long id;
    private String author;
    private String title;
    private String content;
    private String createTime;
    private List<ReaderBean> reader;


    public static class ReaderBean {
        /** * name : zimug * age : 18 */

        private String name;
        private int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}

Rainbow Brackets

代码由于括号太多,不确定当前代码行是否属于某个代码块,此时这个插件就会帮上大忙。

Maven Helper

日常开发中,可能经常会遇到jar包冲突等问题,就需要通过查看maven依赖树来查看依赖情况。这种方式不是很高效,这里推荐一个插件,安装之后,直接打开pom文件,即可查看依赖数,还能自动分析是否存在jar包冲突。

Key promoter X

Key Promoter X 是一个提示插件,当你在IDEA里面使用鼠标的时候,如果这个鼠标操作是能够用快捷键替代的,那么Key Promoter X会弹出一个提示框,告知你这个鼠标操作可以用什么快捷键替代。

当我使用鼠标查看一个方法都被哪些类使用的时候,就会在右下角提示:

换个美女图

设置方法:

Ctrl+Shift+A(或者help -> find action)调用弹窗后输入Set Background Image

在里面设定要设置为Image的图片,透明度调到15左右,保存即可。

看着美女写代码,效率会不会更高一点!

相关文章