SpringBoot实战电商项目mall(40k+star)地址:github.com/macrozheng/…
摘要
天天在用SpringBoot,但有些SpringBoot的实用知识点却不是很清楚!最近又对SpringBoot中的实用知识点做了个总结,相信对从Spring过渡到SpringBoot的朋友会很有帮助!
前言
首先我们来了解下为什么要有SpringBoot?
Spring作为J2EE的轻量级代替品,让我们无需开发重量级的Enterprise JavaBean(EJB),通过依赖注入和面向切面编程,使用简单的Java对象(POJO)即可实现EJB的功能。
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。即使后来Spring引入了基于注解的组件扫描和基于Java的配置,让它看上去简洁不少,但Spring还是需要不少配置。除此之外,项目的依赖管理也很麻烦,我们无法确保各个版本的依赖都能兼容。
为了简化Spring中的配置和统一各种依赖的版本,SpringBoot诞生了!
简介
SpringBoot从本质上来说就是Spring,它通过了一些自己的特性帮助我们简化了Spring应用程序的开发。主要有以下三个核心特性:
- 自动配置:对于很多Spring应用程序常见的应用功能,SpringBoot能自动提供相关配置,集成功能开发者仅需很少的配置。
- 起步依赖:告诉SpringBoot需要什么功能,它就能引入对应的库,无需考虑该功能依赖库的版本问题。
- Actuator:可以深入了解SpringBoot应用程序内部情况,比如创建了哪些Bean、自动配置的决策、应用程序的状态信息等。
开始使用
创建应用
创建SpringBoot应用的方式有很多种,这里使用最流行的开发工具IDEA来创建应用。
- 首先通过
File->New Project
来创建一个项目;
- 然后选择通过
Spring Initializr
来创建一个SpringBoot应用;
- 填写好Maven项目的
groupId
和artifactId
及选择好Java版本;
- 选择好起步依赖,这里选择的是开启Web功能的起步依赖;
- 选择好项目的存放位置即可顺利创建一个SpringBoot应用。
查看应用
项目结构
一个新创建的SpringBoot应用基本结构如下。
1 | bash复制代码mall-tiny-boot |
应用启动类
MallTinyApplication
在SpringBoot应用中有配置和引导的作用,通过@SpringBootApplication
注解开启组件扫描和自动配置,通过SpringApplication.run()
引导应用程序启动;
1 | java复制代码//开启组件扫描和应用装配 |
@SpringBootApplication
注解是三个注解的结合体,拥有以下三个注解的功能:
@Configuration
:用于声明Spring中的Java配置;@ComponentScan
:启用组件扫描,当我们声明组件时,会自动发现并注册为Spring应用上下文中的Bean;@EnableAutoConfiguration
:开启SpringBoot自动配置功能,简化配置编写。
测试应用
可以使用@RunWith
和@SpringBootTest
来创建Spring应用上下文,通过@Test
注解来声明一个测试方法。
1 | java复制代码@RunWith(SpringRunner.class) |
编写应用配置
当我们需要微调自动配置的参数时,可以在application.yml
文件中进行配置,比如微调下端口号。
1 | yaml复制代码server: |
项目构建过程
SpringBoot项目可以使用Maven进行构建,首先我们需要继承spring-boot-starter-parent
这个父依赖,父依赖可以控制所有SpringBoot官方起步依赖的版本,接下来当我们使用官方起步依赖时,就不用指定版本号了。我们还需要使用SpringBoot的插件,该插件主要用于将应用打包为可执行Jar。
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
使用起步依赖
使用起步依赖的好处
在使用起步依赖之前,我们先来了解下使用起步依赖的好处,当我们使用SpringBoot需要整合Web相关功能时,只需在pom.xml
中添加一个起步依赖即可。
1 | xml复制代码<dependency> |
如果是Spring项目的话,我们需要添加很多依赖,还需要考虑各个依赖版本的兼容性问题,是个相当麻烦的事情。
指定基于功能的依赖
当我们需要开发一个Web应用,需要使用MySQL数据库进行存储,使用Swagger生成API文档,添加如下起步依赖即可。需要注意的是只有官方的起步依赖不需要指定版本号,其他的还是需要自行指定的。
1 | xml复制代码<dependencies> |
覆盖起步依赖中的库
其实起步依赖和你平时使用的依赖没什么区别,你可以使用Maven的方式来排除不想要的依赖。比如你不想使用tomcat容器,想使用undertow容器,可以在Web功能依赖中排除掉tomcat。
1 | xml复制代码<dependencies> |
使用自动配置
SpringBoot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。
举个例子,当我们使用Spring整合MyBatis的时候,需要完成如下几个步骤:
- 根据数据库连接配置,配置一个dataSource对象;
- 根据dataSource对象和SqlMapConfig.xml文件(其中包含mapper.xml文件路径和mapper接口路径配置),配置一个sqlSessionFactory对象。
当我们使用SpringBoot整合MyBatis的时候,会自动创建dataSource和sqlSessionFactory对象,只需我们在application.yml
和Java配置中添加一些自定义配置即可。
在application.yml
中配置好数据库连接信息及mapper.xml文件路径。
1 | yaml复制代码spring: |
使用Java配置,配置好mapper接口路径。
1 | java复制代码/** |
使用自动配置以后,我们整合其他功能的配置大大减少了,可以更加专注程序功能的开发了。
自定义配置
自定义Bean覆盖自动配置
虽然自动配置很好用,但有时候自动配置的Bean并不能满足你的需要,我们可以自己定义相同的Bean来覆盖自动配置中的Bean。
例如当我们使用Spring Security来保护应用安全时,由于自动配置并不能满足我们的需求,我们需要自定义基于WebSecurityConfigurerAdapter的配置。这里我们自定义了很多配置,比如将基于Session的认证改为使用JWT令牌、配置了一些路径的无授权访问,自定义了登录接口路径,禁用了csrf功能等。
1 | java复制代码/** |
自动配置微调
有时候我们只需要微调下自动配置就能满足需求,并不需要覆盖自动配置的Bean,此时我们可以在application.yml
属性文件中进行配置。
比如微调下应用运行的端口。
1 | yaml复制代码server: |
比如修改下数据库连接信息。
1 | yaml复制代码spring: |
读取配置文件的自定义属性
有时候我们会在属性文件中自定义一些属性,然后在程序中使用。此时可以将这些自定义属性映射到一个属性类里来使用。
比如说我们想给Spring Security配置一个白名单,访问这些路径无需授权,我们可以先在application.yml
中添添加如下配置。
1 | yaml复制代码secure: |
之后创建一个属性类,使用@ConfigurationProperties
注解配置好这些属性的前缀,再定义一个urls
属性与属性文件相对应即可。
1 | java复制代码/** |
Actuator
SpringBoot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序运行时的内部状况。
端点概览
Actuator提供了大概20个端点,常用端点路径及描述如下:
路径 | 请求方式 | 描述 |
---|---|---|
/beans | GET | 描述应用程序上下文里全部的Bean,以及它们之间关系 |
/conditions | GET | 描述自动配置报告,记录哪些自动配置生效了,哪些没生效 |
/env | GET | 获取全部环境属性 |
/env/{name} | GET | 根据名称获取特定的环境属性 |
/mappings | GET | 描述全部的URI路径和控制器或过滤器的映射关系 |
/configprops | GET | 描述配置属性(包含默认值)如何注入Bean |
/metrics | GET | 获取应用程序度量指标,比如JVM和进程信息 |
/metrics/{name} | GET | 获取指定名称的应用程序度量值 |
loggers | GET | 查看应用程序中的日志级别 |
/threaddump | GET | 获取线程活动的快照 |
/health | GET | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
/shutdown | POST | 关闭应用程序 |
/info | GET | 获取应用程序的定制信息,这些信息由info打头的属性提供 |
查看配置明细
- 直接访问根端点,可以获取到所有端点访问路径,根端点访问地址:http://localhost:8088/actuator
1 | json复制代码{ |
- 通过
/beans
端点,可以获取到Spring应用上下文中的Bean的信息,比如Bean的类型和依赖属性等,访问地址:http://localhost:8088/actuator/beans
1 | json复制代码{ |
- 通过
/conditions
端点,可以获取到当前应用的自动配置报告,positiveMatches
表示生效的自动配置,negativeMatches
表示没有生效的自动配置。
1 | json复制代码{ |
- 通过
/env
端点,可以获取全部配置属性,包括环境变量、JVM属性、命令行参数和application.yml
中的属性。
1 | json复制代码{ |
- 通过
/mappings
端点,可以查看全部的URI路径和控制器或过滤器的映射关系,这里可以看到我们自己定义的PmsBrandController
和JwtAuthenticationTokenFilter
的映射关系。
1 | json复制代码{ |
查看运行时度量
- 通过
/metrics
端点,可以获取应用程序度量指标,不过只能获取度量的名称;
1 | json复制代码{ |
- 需要添加指标名称才能获取对应的值,比如获取当前JVM使用的内存信息,访问地址:http://localhost:8088/actuator/metrics/jvm.memory.used
1 | json复制代码{ |
- 通过
loggers
端点,可以查看应用程序中的日志级别信息,可以看出我们把ROOT
范围日志设置为了INFO,而com.macro.mall.tiny
包范围的设置为了DEBUG。
1 | json复制代码{ |
- 通过
/health
端点,可以查看应用的健康指标。
1 | json复制代码{ |
关闭应用
通过POST请求/shutdown
端点可以直接关闭应用,但是需要将endpoints.shutdown.enabled
属性设置为true才可以使用。
1 | json复制代码{ |
定制Actuator
有的时候,我们需要自定义一下Actuator的端点才能满足我们的需求。
- 比如说Actuator有些端点默认是关闭的,我们想要开启所有端点,可以这样设置;
1 | yaml复制代码management: |
- 比如说我们想自定义Actuator端点的基础路径,比如改为
/monitor
,这样我们我们访问地址就变成了这个:http://localhost:8088/monitor
1 | yaml复制代码management: |
常用起步依赖
起步依赖不仅能让构建应用的依赖配置更简单,还能根据提供给应用程序的功能将它们组织到一起,这里整理了一些常用的起步依赖。
官方依赖
1 | xml复制代码<dependencies> |
第三方依赖
1 | xml复制代码<dependencies> |
项目源码地址
本文 GitHub github.com/macrozheng/… 已经收录,欢迎大家Star!
本文转载自: 掘金