SpringBoot
2022-11-29 13:59:45 52 举报
AI智能生成
根据 JavaGuide 绘制的脑图
作者其他创作
大纲/内容
Spring 的简介及其缺点
Spring 是重量级企业开发框架 Enterprise JavaBean(EJB)的替代品,Spring 为 企业级 Java 开发提供了一种相对简单<br>的方法,通过 <b><font color="#0000ff">依赖注入</font></b> 和 <b><font color="#0000ff">面向切面编程</font></b>,用简单的 <b><font color="#0000ff">Java 对象(Plain Old Java Object,POJO)</font></b>实现了 EJB 的功能。
<b><font color="#0000ff">虽然 Spring 的组件代码是轻量级的,但它的配置却是重量级的(需要大量 XML 配置)。</font></b>
为此,<b><font color="#0000ff">Spring 2.5</font></b> 引入了 <b><font color="#0000ff">基于</font><font color="#ff00ff">注解</font><font color="#0000ff">的组件扫描</font></b>,这消除了大量针对应用程序自身组件的显式 XML 配置。<br>Spring 3.0 引入了基于 Java 的配置,这是一种类型安全的可重构配置方式,可以代替 XML。
尽管如此,我们依旧没能逃脱配置的魔爪。开启某些 Spring 特性时,比如事务管理和 Spring MVC,还是需要用 XML 或 Java 进行显式配置。<br>启用第三方库时也需要显式配置,比如基于 Thymeleaf 的 Web 视图。配置 Servlet 和过滤器(比如 Spring 的 DispatcherServlet)同样需要<br>在 web.xml 或 Servlet 初始化代码里进行显式配置。组件扫描减少了配置量,Java 配置让它看上去简洁不少,但 Spring 还是需要不少配置。<br>
光配置这些 XML 文件都够我们头疼的了,占用了我们大部分时间和精力。<br>除此之外,相关库的依赖非常让人头疼,不同库之间的版本冲突也非常常见。<br>
为什么要有 SpringBoot
Spring 旨在简化 J2EE 企业应用程序开发,而 SpringBoot 旨在简化 Spring 开发(减少配置文件,开箱即用)。
使用 SpringBoot 的主要优点
1. 开发基于 Spring 的应用程序很容易。<br>2. Spring Boot 项目所需的开发或工程时间明显减少,通常会提高整体生产力。<br>3. Spring Boot 不需要编写大量样板代码、XML 配置和注释。<br>4. Spring 引导应用程序可以很容易地与 Spring 生态系统集成,如Spring JDBC、Spring ORM、Spring Data、Spring Security 等。<br>5. Spring Boot 遵循“固执己见的默认配置”,以减少开发工作(默认配置可以修改)。<br>6. Spring Boot 应用程序提供嵌入式 HTTP 服务器,如 Tomcat 和 Jetty,可以轻松地开发和测试 web 应用程序。<br>7. Spring Boot 提供命令行接口 (CLI) 工具,用于开发和测试 Spring Boot 应用程序,如 Java 或 Groovy。<br>8. Spring Boot 提供了多种插件,可以使用内置工具 (如 Maven 和 Gradle) 开发和测试 Spring Boot 应用程序。<br>
什么是 Spring Boot Starters
Spring Boot Starters 是 <b><font color="#0000ff">一系列依赖关系的集合</font></b>,因为它的存在,<b><font color="#0000ff">项目的依赖之间的关系 </font></b>对我们来说变得 <b><font color="#0000ff">更加简单 </font></b>了。
举个例子:在没有 Spring Boot Starters 之前,我们开发 REST 服务或 Web 应用程序时;我们需要使用像 Spring MVC,<br>Tomcat 和 Jackson 这样的库,这些依赖我们需要手动一个一个添加。但是,有了 SpringBoot Starters 我们只需要一个<br>只需添加一个 <b><font color="#0000ff">spring-boot-starter-web</font></b> 一个依赖就可以了,这个依赖包含的子依赖中包含了我们开发 REST 服务需要的 <b><font color="#0000ff">所有依赖</font></b>。<br>
SpringBoot 支持哪些内嵌 Servlet 容器
SpringBoot 支持以下嵌入式 Servlet 容器:
您还可以将 Spring 引导应用程序部署到任何 Servlet 3.1+ 兼容的 Web 容器中。
这就是为什么可以直接像运行普通 Java 项目一样运行 SpringBoot 项目。这样的确省事了很多,方便了我们进行开发,降低了学习难度。<br>
如何在 SpringBoot 中使用 Jetty 而不是 Tomcat
SpringBoot ( spring-boot-starter-web )使用 Tomcat 作为默认的嵌入式 servlet 容器,<br>如果想使用 Jetty 的话只需要修改 pom.xml (Maven) 或者 build.gradle (Gradle) 就行了。<br>
介绍一下 @SpringBootApplication 注解
SpringBootApplication 注解源码:
SpringBootConfiguration 注解源码:
大概可以把 @SpringBootApplication 看作是 @Configuration、@EnableAutoConfiguration、<br>@ComponentScan 注解的集合。根据 SpringBoot 官网,这三个注解的作用分别是:<br><br><ul><li><b><font color="#0000ff">@EnableAutoConfiguration</font></b>:启动 SpringBoot 的自动装配机制;</li><li><b><font color="#0000ff">@ComponentScan</font></b>:扫描被 @Component(@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类;</li><li><b><font color="#0000ff">@Configuration</font></b>:允许在上下文中注册额外的 bean 或导入其他配置类;</li></ul>
<b>SpringBoot 自动配置是如何实现的</b>
简单介绍
这是因为 @SpringBootApplication 注解的原因,在上一个问题中已经提到了这个注解。我们知道 @SpringBootApplication <br>可以看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。
<b><font color="#0000ff">@EnableAutoConfiguration 是启动自动配置的关键</font></b>,源码如下(可以打断点,走一遍基本流程):<br>
@EnableAutoConfiguration 注解通过 Spring 提供的 @Import 注解导入了 <br>AutoConfigurationImportSelector 类(@Import 注解可以导入配置类或者 Bean 到当前类中来)。
AutoConfigurationImportSelector 类中 getCandidateConfigurations() 方法会将所有<br>自动配置类的信息以 List 的形式返回。这些配置信息会被 Spring 容器作为 bean 来管理。
自动配置信息有了,那么自动配置还差什么呢?
<b><font color="#0000ff">@Conditional</font></b> 注解:<br><ul><li><b><font color="#0000ff">@ConditionalOnClass(指定的类必须存在于类路径下),@ConditionalOnBean(容器中是否有指定的 Bean)</font></b><br>等等都是对 @Conditional 注解的扩展;</li></ul>
拿 Spring Security 的自动装配举例:SecurityAutoConfiguration 中导入了 WebSecurityEnablerConfiguration 类,<br>WebSecurityEnablerConfiguration 源码如下:
WebSecurityEnablerConfiguration 类中使用 @ConditionalOnBean 指定了容器中必须有 WebSecurityConfigurationAdapter类<br>或者其实现类。所以,一般情况下 Spring Security 配置类都会去实现 WebSecurityConfigurationAdapter,这样就完成了自动配置。
原理详解在 SpringBoot 自动配置是如何实现的
开发 RESTful Web 服务常用的注解有哪些
简单介绍
Spring Bean 相关
<span style="font-family: "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei UI", "Microsoft YaHei", sans-serif;">@Autowired:<b><font color="#0000ff">自动导入对象到类中</font></b>,被注入进的类同样要被 Spring 容器管理。</span>
@RestController:@RestController 注解是 @Controller 和 @ResponseBody 的合集,<br>表示这是个控制器 bean,并且是 <b><font color="#0000ff">将函数的返回值直接填入 HTTP 响应体中</font></b>,是 REST 风格的控制器。<br>
@Component:<b><font color="#0000ff">通用的注解,可标注任意类为 Spring 组件</font></b>。如果一个 Bean 不知道属于哪个层,可以使用 @Component 注解标注。<br>
@Repository:对应持久层即 Dao 层,主要用于数据库相关操作。<br>
@Service:对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。<br>
@Controller:对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。<br>
处理常见的 HTTP 请求类型
@GetMapping:GET 请求。
@PostMapping:POST 请求。
@PutMapping:PUT 请求。
@DeleteMapping:Delete 请求。
前后端传值
@RequestParam 和 @Pathvairable:@PathVariable 用于获取路径参数,@RequestParam 用于获取查询参数。<br>
@RequestBody:用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且 <br>Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会<br>使用 HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。<br>
详细总结在 Spring&SpringBoot 常用注解总结
SpringBoot 常用的读取配置文件的方法有哪些
编写一个 yaml 的配置文件:
1. 通过 @value 读取比较简单的配置信息<br>
使用 @Value("${property}") 读取比较简单的配置信息:<br>
需要注意的是 @value这种方式是不被推荐的,Spring 比较建议的是下面几种读取配置信息的方式。<br>
2. 通过 @ConfigurationProperties 读取并与 bean 绑定<br>
LibraryProperties 类上加了 @Component 注解,我们可以像使用普通 bean 一样将其注入到类中使用。<br>
这个时候你就可以像使用普通 bean 一样,将其注入到类中使用:<br>
控制台输出:
3. 通过 @ConfigurationProperties 读取并校验<br>
我们先将 application.yml 修改为如下内容,明显看出这不是一个正确的 email 格式:<br>
ProfileProperties 类没有加 @Component 注解:<br>
我们在要使用 ProfileProperties 的地方使用 @EnableConfigurationProperties 注册我们的配置 bean:
因为邮箱格式不正确,所以程序运行的时候就报错,根本运行不起来,保证了数据类型的安全性:<br>
我们把邮箱测试改为正确的之后再运行,控制台就能成功打印出读取到的信息:<br>
4. @PropertySource 读取指定的 properties 文件<br>
编写一个类,定义一些对象来存储配置:
只需要在使用的地方注入这个类,就可以直接调用 get 方法获取:
SpringBoot 加载配置文件的优先级了解么
一图知意:
常用的 Bean 映射工具有哪些
我们经常在代码中会对一个数据结构封装成 DO、SDO、DTO、VO 等,而这些 Bean 中的<br>大部分属性都是一样的,所以使用属性拷贝类工具可以帮助我们节省大量的 set 和 get 操作。<br>
常用的 Bean 映射工具有:Spring BeanUtils、Apache BeanUtils、MapStruct、ModelMapper、Dozer、Orika、JMapper 。<br>
由于 Apache BeanUtils 、Dozer 、ModelMapper 性能太差,所以不建议使用。<br>MapStruct 性能更好而且使用起来比较灵活,是一个比较不错的选择。<br>
SpringBoot 如何监控系统实际运行状况
我们可以使用 Spring Boot Actuator 来对 Spring Boot 项目进行简单的监控。<br>
集成了这个模块之后,你的 Spring Boot 应用程序就自带了一些开箱即用的获取程序运行时的内部状态信息的 API。<br>
比如通过 GET 方法访问 /health 接口,你就可以获取应用程序的健康指标。<br>
SpringBoot 如何做请求参数校验
数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的<br>数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。<br>
Spring Boot 程序做请求参数校验的话只需要 spring-boot-starter-web 依赖就够了,它的子依赖包含了我们所需要的东西。<br>
1. 校验注解
JSR 提供的校验注解:<br><ul><li>@Null 被注释的元素必须为 null</li><li>@NotNull 被注释的元素必须不为 null</li><li>@AssertTrue 被注释的元素必须为 true</li><li>@AssertFalse 被注释的元素必须为 false</li><li>@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值</li><li>@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值</li><li>@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值</li><li>@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值</li><li>@Size(max=, min=) 被注释的元素的大小必须在指定的范围内</li><li>@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内</li><li>@Past 被注释的元素必须是一个过去的日期</li><li>@Future 被注释的元素必须是一个将来的日期</li><li>@Pattern(regex=, flag=) 被注释的元素必须符合指定的正则表达式</li></ul>
Hibernate Validator 提供的校验注解:<br><ul><li>@NotBlank(message =) 验证字符串非 null,且长度必须大于 0</li><li>@Email 被注释的元素必须是电子邮箱地址</li><li>@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内</li><li>@NotEmpty 被注释的字符串的必须非空</li><li>@Range(min=,max=,message=) 被注释的元素必须在合适的范围内</li></ul>
2. 验证请求体(RequestBody)<br>
在需要验证的参数上加上了<b><font color="#0000ff">@Valid</font></b> 注解,如果验证失败,它将抛出 MethodArgumentNotValidException。<br>默认情况下,Spring 会将此异常转换为 HTTP Status 400(错误请求)。<br>
3. 验证请求参数 (PathVariables 和 RequestParameters)<br>
一定一定不要忘记在类上加上 @Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。<br>
更多详细内容查看
SpringBoot 实现全局异常处理
可以使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常。<br>
详细内容查看
SpringBoot 中如何实现定时任务
我们使用 @Scheduled 注解就能很方便地创建一个定时任务。<br>
单纯依靠 @Scheduled 注解 还不行,我们还需要在 SpringBoot 中我们只需要在启动类上加上 @EnableScheduling 注解,<br>这样才可以启动定时任务。@EnableScheduling 注解的作用是发现注解 @Scheduled 的任务并在后台执行该任务。<br>
0 条评论
下一页