本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net
1、什么是 springboot?
Spring Boot 是一个基于 Spring 框架的全新项目,旨在帮助开发者更轻松地创建基于 Spring 的应用程序。它简化了 Spring 应用程序的初始化和开发过程,使得开发者能够更快速地构建独立、生产级别的应用程序。Spring Boot 通过提供默认配置和一系列快捷特性,如自动配置、起步依赖、内置 Web 服务器等,来降低项目搭建的复杂性。同时,它还集成了大量常用的第三方库配置,使得这些库在 Spring Boot 应用中几乎可以零配置地开箱即用。
Spring Boot 的设计目标是让开发者能够更专注于业务逻辑的开发,而不需要花费过多时间在繁琐的配置和依赖管理上。通过简化配置和提供一系列默认设置,Spring Boot 极大地提高了开发效率和生产力。此外,Spring Boot 还支持多种部署方式,如独立运行、内嵌 Web 服务器等,使得应用程序的部署和运维也变得更加简单和方便。
总之,Spring Boot 是一个功能强大、易于使用的 Spring 框架扩展项目,它简化了 Spring 应用程序的开发和部署过程,为开发者提供了更高效、更便捷的开发体验。
2、springboot 的特性
- 独立运行:Spring Boot 应用程序可以作为独立的可执行 JAR 或 WAR 文件运行,这使得部署和分发变得非常简单。
- 内嵌 Servlet 容器:Spring Boot 内嵌了 Tomcat、Jetty 或 Undertow 等 Servlet 容器,因此无需将应用程序部署到外部 Servlet 容器中。
- 自动配置:Spring Boot 会自动配置 Spring 应用程序,减少手动配置的工作量。它基于项目中的类路径、属性设置和其他条件来自动配置 Bean。
- 提供 starter 简化 Maven 配置:Spring Boot 提供了一系列的 “starter” 项目对象模型(POMs),这些预定义的依赖项集合大大简化了 Maven 配置。
- 无代码生成和 XML 配置:Spring Boot 尽量避免了繁琐的 XML 配置和代码生成,而是通过注解、属性文件和 YAML 文件等方式进行配置。
- 应用监控:Spring Boot 提供了内置的应用监控功能,如健康检查、指标收集和可视化等。这使得监控和诊断应用程序变得更加容易。
- 与外部资源的集成:Spring Boot 可以轻松地与外部资源(如数据库、消息队列、缓存等)进行集成,提供了相应的自动配置和 starter。
- 微服务支持:Spring Boot 非常适合构建微服务架构的应用程序,可以与 Spring Cloud 等项目结合使用,实现服务发现、配置管理、熔断降级等功能。
- 快速开发和测试:Spring Boot 提供了快速开发和测试的工具和插件,如热部署、自动重启、测试自动化等。
3、SpringFactoriesLoader 简介
SpringFactoriesLoader是 Spring 框架内部提供的一个工厂加载器,用于从指定的配置文件META-INF/spring.factories中加载和实例化指定的类。这种加载方式提供了一种扩展机制,使得开发者可以方便地集成第三方库或插件,而无需修改主程序代码。
具体来说,SpringFactoriesLoader会扫描所有在 classpath 下的META-INF/spring.factories文件,并根据其中的配置信息创建和返回相应的对象实例。这些配置信息通常以 key-value 对的形式存在,其中 key 为接口或抽象类的全限定名,value 为实现类的全限定名列表,多个实现类之间通过逗号分隔。
当应用程序需要某个接口或抽象类的实例时,Spring 容器会根据SpringFactoriesLoader加载到的配置信息来创建相应的实现类实例,并将其注入到应用程序中。这种机制在 Spring Boot 的自动配置中得到了广泛应用,使得开发者可以轻松地通过添加或修改配置文件来实现应用程序的定制化配置。
总的来说,SpringFactoriesLoader提供了一种灵活且可扩展的加载机制,使得 Spring 框架能够更加开放和易于集成第三方库或插件。
4、Springboot spi 简介
Spring Boot 的 SPI(Service Provider Interface)机制是一种服务发现机制,它允许第三方为某些接口提供实现,并在运行时被动态加载和使用。这种机制类似于 Java 的标准 SPI 机制,但 Spring Boot 对其进行了扩展和优化,以更好地适应 Spring 的生态系统和约定。
在 Spring Boot 中,SPI 机制主要通过META-INF/spring.factories文件来实现。该文件位于 classpath 下,包含了接口与实现类之间的映射关系。当 Spring Boot 应用程序启动时,它会扫描所有在 classpath 下的META-INF/spring.factories文件,并根据其中的配置信息创建和返回相应的对象实例。
具体来说,spring.factories文件中的配置信息通常以 key-value 对的形式存在,其中 key 为接口或抽象类的全限定名,value 为实现类的全限定名列表,多个实现类之间通过逗号分隔。例如:
com.example.MyService=com.example.MyServiceImpl1,com.example.MyServiceImpl2
上述配置表示com.example.MyService接口有两个实现类:com.example.MyServiceImpl1和com.example.MyServiceImpl2。当应用程序需要MyService的实例时,Spring 容器会根据这些配置信息创建相应的实现类实例,并将其注入到应用程序中。
需要注意的是,SPI 机制并不是 Spring Boot 独有的特性,而是基于 Java 平台的一种通用机制。然而,Spring Boot 通过集成和优化这种机制,使得开发者能够更加方便地使用和扩展 Spring 生态系统中的各种组件和插件。
此外,与 Java 标准的 SPI 机制相比,Spring Boot 的 SPI 机制具有更好的灵活性和可扩展性。例如,它支持通过条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)来控制 bean 的创建和注入条件,从而实现更加精细化的配置和控制。同时,Spring Boot 还提供了丰富的自动配置功能,可以自动地根据 classpath 下的类、属性文件等信息来推断和配置 bean 的依赖关系,进一步简化了开发者的配置工作。
5、创建一个可以被 springboot 项目自动装配的 jar 包简单例子
要创建一个能够被 Spring Boot 项目自动装配的 jar 包,你需要遵循 Spring Boot 的自动配置规范,并在你的 jar 包中包含适当的自动配置类、条件注解以及META-INF/spring.factories文件。下面是一个简单的步骤指南:
-
创建自动配置类:
首先,你需要创建一个或多个自动配置类,这些类将使用@Configuration注解来定义,并且包含创建和配置所需 bean 的@Bean方法。这些自动配置类应该使用条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty等)来确保它们只在适当的条件下被加载。package com.example.autoconfigure; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnClass(MyService.class) public class MyServiceAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService() { return new MyServiceImpl(); } } -
添加
META-INF/spring.factories文件:
在你的项目中,你需要创建一个META-INF/spring.factories文件,并在其中指定你的自动配置类,以便 Spring Boot 在启动时能够发现它。这个文件应该位于src/main/resources/META-INF/目录下。文件内容示例:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.autoconfigure.MyServiceAutoConfiguration
6、springboot 常用注解
-
@SpringBootApplication:
这是 Spring Boot 项目的核心注解,通常放在主类上。它实际上是@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。 -
@EnableAutoConfiguration:是一个加载 Starter 目录包之外的需要 Spring 自动生成 bean 对象(是否需要的依据是 "META-INF/spring.factories" 中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 后面是有能找到那个 bean)的带有 @Configuration 注解的类。一般就是对各种引入的 spring-boot-starter 依赖包指定的(spring.factories)类进行实例化。
-
@SpringBootConfiguration:
标记一个类为 Spring Boot 的配置类。这实际上是@Configuration的一个特化形式,但在 Spring Boot 项目中更明确地表示这是一个引导配置类。 -
@ConditionalOn...系列注解:-
@ConditionalOnClass:当给定的类名在类路径上存在时,条件成立。 -
@ConditionalOnMissingClass:当给定的类名在类路径上不存在时,条件成立。 -
@ConditionalOnBean:当给定的 bean 在容器中时,条件成立。 -
@ConditionalOnMissingBean:当给定的 bean 没有在容器中时,条件成立。 -
@ConditionalOnProperty:当指定的属性有指定的值时,条件成立。 -
等等。这些注解通常用于自动配置类中,以确保只有在满足特定条件时才进行配置。
-
-
@ConfigurationProperties:
将外部配置属性(例如从application.properties或application.yml文件)绑定到一个 POJO(Plain Old Java Object)上。这使得管理配置变得非常简单。 -
@EnableConfigurationProperties:
当你想让@ConfigurationProperties注解的类被 Spring 容器管理时,你可以使用这个注解来启用它们。通常与@Configuration注解一起使用。 -
@Endpoint、@ReadOperation、@WriteOperation和@DeleteOperation:
用于创建和管理 Actuator 端点,这些端点提供了关于应用程序运行时的信息,并且允许你在运行时修改应用程序的状态。这些注解是 Spring Boot Actuator 模块的一部分。
这些注解大大简化了 Spring Boot 项目的配置和管理过程,使得开发人员能够更快速地构建和部署生产级的 Spring 应用程序。
7、Spring Boot Actuator 是什么?
Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的功能模块。它提供了许多生产级别的功能,如健康检查、审计、指标收集、HTTP 跟踪等。通过 Actuator,开发者可以很方便地对应用程序的某些监控指标进行查看、统计,以及进行其他相关的管理操作。
Actuator 的核心是端点(Endpoint),用于监视应用程序及与之交互。Spring Boot 中已经内置了非常多的 Endpoint,如 health、info、beans、metrics、httptrace 等。这些 Endpoint 都可以通过 HTTP 或 JMX(Java Management Extensions)进行访问,但大多数情况下,它们都是通过 HTTP 的方式进行暴露。每个 Endpoint 都会被映射为一个 URL,其格式为/actuator/{id},其中{id}为 Endpoint 的 ID。
除了内置的 Endpoint 外,开发者还可以自定义自己的 Endpoint 来扩展 Actuator 的功能。要启用或禁用某个 Endpoint,可以通过配置文件进行管理。在 Spring Boot 2.0 及更高版本中,Endpoint 的监控机制有所改变,启用了 Endpoint 并不代表可以直接访问,还需要将其暴露出来。
要使用 Spring Boot Actuator,只需在项目中添加相应的依赖即可。在 Maven 项目中,可以在pom.xml文件中添加spring-boot-starter-actuator依赖。添加依赖后,Actuator 将自动配置并暴露出相应的 Endpoint 供开发者使用。
总的来说,Spring Boot Actuator 为开发者提供了一个强大而灵活的工具来监控和管理 Spring Boot 应用程序。通过它,开发者可以更好地了解应用程序的运行状态并进行相应的优化和调整。
8、ControllerAdvice 简介
@ControllerAdvice是 Spring 框架中的一个注解,用于增强 Controller 的功能。它可以应用于整个应用程序中的所有 Controller,或者通过指定包或注解来应用于特定的 Controller。这个注解主要用于全局处理一些共通的操作或处理,例如全局异常处理、全局数据绑定、全局数据预处理等。
示例 1:全局异常处理
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Object> handleException(Exception ex) {
// 这里可以记录日志、发送通知等操作
return new ResponseEntity<>("发生异常:" + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
// 你还可以为特定的异常类型定义处理方法
@ExceptionHandler(value = CustomException.class)
public ResponseEntity<Object> handleCustomException(CustomException ex) {
return new ResponseEntity<>("自定义异常:" + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
在这个示例中,GlobalExceptionHandler类使用了@ControllerAdvice注解,表明它是一个全局异常处理器。它定义了两个@ExceptionHandler方法,分别处理所有类型的Exception和特定的CustomException。当 Controller 中抛出这些异常时,相应的方法会被调用,并返回一个统一的 HTTP 响应。
示例 2:全局数据绑定和预处理
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.context.request.WebRequest;
import java.beans.PropertyEditorSupport;
import java.text.SimpleDateFormat;
import java.util.Date;
@ControllerAdvice
public class GlobalDataBinding {
// 自定义日期格式转换器
public class CustomDateEditor extends PropertyEditorSupport {
private final SimpleDateFormat dateFormat;
public CustomDateEditor(SimpleDateFormat dateFormat) {
this.dateFormat = dateFormat;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
try {
setValue(dateFormat.parse(text));
} catch (Exception e) {
throw new IllegalArgumentException("Could not parse date: " + e.getMessage(), e);
}
}
}
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat));
}
@ModelAttribute
public void addAttributes(WebRequest request) {
// 这里可以添加全局属性,这些属性会在每个Controller方法执行前添加到模型中
// 例如:request.setAttribute("currentTime", new Date());
}
}
在这个示例中,GlobalDataBinding类使用了@ControllerAdvice注解。它定义了一个@InitBinder方法,用于注册自定义的日期格式转换器。这意味着,当请求参数中包含日期类型时,Spring 会使用这个自定义的转换器来解析日期字符串。此外,它还定义了一个@ModelAttribute方法,用于添加全局属性。但是注意,在@ModelAttribute方法中,通常我们会使用Model或ModelMap参数来添加属性,而不是WebRequest。这里的代码需要相应地调整才能正确工作。正确的做法可能是这样的:
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("currentTime", new Date());
}
这样,在每个 Controller 方法执行前,都会执行addAttributes方法,将当前时间添加到模型中。但请注意,由于这个示例中的addAttributes方法没有正确的参数类型,它实际上不会按预期工作,需要按照上面的修正来修改。