springboot知识点
1.springboot 的优势#
- 快速开发:Spring Boot 自动配置很多常见的 Spring 组件,使得开发过程更加高效快捷。
- 简化配置:Spring Boot 自动配置了许多常见的配置,极大地简化了应用程序的配置过程。
- 微服务支持:Spring Boot 可以轻松地构建微服务应用程序,支持常见的微服务技术栈,如 Spring Cloud。
- 易于部署:Spring Boot 应用程序可以打包成独立的可执行 JAR 文件,方便部署和迁移。
- 社区活跃:由于 Spring Boot 是一个非常流行的框架,因此拥有庞大的社区支持,可以获得丰富的文档、教程和解决方案
2.springboot自动装配原理:https://blog.csdn.net/qq_40553042/article/details/109425424#
@EnableAutoConfiguration注解(开启自动配置)
点击AutoConfigurationImportSelector类,我们可以核心代码就在该类中,自动配置原理就在这个方法中:
而loadFactoryNames方法在一个叫SpringFactoriesLoader类中,具体自动配置原理就是这里:
会自动扫描所有项目下ONFACTORIES_RESOURCE_LOCATI这个路径(META-INF/spring.factories)下的类,那么这个路径是啥?我们找到具体点的文件:
SpringBoot的自动配置就是通过自定义实现ImportSelector接口,然后通过SpringFactoriesLoader扫描autoconfigure包下的META-INF/spring.factories中所有路径下的类,并通过反射实例化成一个个的配置类并注入到Spring容器中,从而实现了自动装配,想到这里,我们其实也可以自定一个starter,然后交给SpringBoot自动来装配即可
3. 在Spring Boot 中如何解决跨域#
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Crossorigin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfifigurer接口然后重写addCorsMappings方法解决跨域问题。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
4.application.yml 和 bootstrap.yml的区别#
application.yml和bootstrap.yml是Spring Boot中用于配置应用程序的两个主要文件。
- 加载顺序不同:bootstrap.yml先于application.yml加载。bootstrap.yml用于应用程序上下文之前的阶段,可以用来加载一些系统级别的配置信息。
- 作用范围不同:bootstrap.yml中定义的属性会覆盖所有其他配置文件,包括application.yml。通常情况下,bootstrap.yml中的配置很少需要修改。
- 属性优先级不同:如果在不同的配置文件中定义了相同的属性,则最后加载的配置文件中的属性将具有优先级。
总体来说,bootstrap.yml用于应用程序启动前的系统配置,而application.yml用于应用程序运行时的应用程序配置。
5.Spring Boot 中的监视器#
- Health Indicator:通过实现HealthIndicator接口来提供应用程序的健康状况。Health Indicator可以返回一个Status对象,其中包含应用程序的健康状态信息。
- Metrics:Spring Boot内置了Metrics功能,它可以帮助开发人员收集和展示应用程序的度量数据。Metrics提供了多种方式来收集数据,例如通过Actuator端点、注解或手动编程等方式。
- Trace Web Requests:通过启用Trace Web请求功能,可以跟踪每个HTTP请求的执行情况。Trace Web请求功能提供了一个特殊的HTTP头部,用于跟踪请求的执行链路,并将其存储在日志文件中。
- Scheduled Tasks:Spring Boot可以显示当前应用程序中所有运行中的定时任务。通过访问Actuator端点,可以查看定时任务的状态和执行情况。
6.如何监视所有 Spring Boot 微服务#
- 使用Spring Boot Admin:Spring Boot Admin是一个开源的监控和管理Spring Boot应用程序的工具。它提供了一个Web界面,可以查看每个应用程序的详细信息、监控指标和日志。
- 使用Prometheus和Grafana:Prometheus是一个开源的系统监控和警报工具,而Grafana则是一个开源的数据可视化工具。这两个工具可以结合使用,来监控Spring Boot微服务的健康状况和性能指标。
- 使用ELK Stack:ELK Stack由Elasticsearch、Logstash和Kibana三个开源组件组成,可以用来集中存储和分析日志数据。将Spring Boot微服务的日志数据发送到ELK Stack中,可以方便地进行日志分析和故障排除。
- 使用Zipkin和Sleuth:Zipkin是一个开源的分布式跟踪系统,而Sleuth则是一个Spring Cloud项目,为分布式追踪提供了集成支持。将Zipkin和Sleuth与Spring Boot微服务集成,可以跟踪请求的流程,并分析每个微服务的性能和耗时情况。
以上是一些常见的监视Spring Boot微服务的方法,根据具体需求和场景选择合适的工具和方案。
7.Spring Boot 实现实现全局异常#
在Spring Boot中,可以通过以下步骤来实现全局异常处理:
-
创建一个自定义的异常类,继承自RuntimeException或其子类。例如,定义一个名为CustomException的异常类:
public class CustomException extends RuntimeException { // 构造方法省略 }
-
创建一个异常处理器类,用于处理应用程序中抛出的所有异常。该类需要使用@ControllerAdvice注解,指定要处理的异常类型。例如,创建一个名为GlobalExceptionHandler的异常处理器类:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) public ResponseEntity<String> handleCustomException(CustomException ex) { // 处理CustomException异常 return new ResponseEntity<>("CustomException occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(Exception.class) public ResponseEntity<String> handleAllExceptions(Exception ex) { // 处理所有异常 return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } }
-
启用全局异常处理器。可以在启动类上添加@EnableWebMvc注解,或在配置类中添加@Bean注解来启用全局异常处理器。例如,在启动类上添加@EnableWebMvc注解:
@SpringBootApplication @EnableWebMvc public class MyApp { // 程序入口省略 }
-
在控制器中抛出自定义异常。例如:
@RestController public class MyController { @GetMapping("/hello") public String hello() { throw new CustomException("Hello, Exception!"); } }
以上是使用Spring Boot实现全局异常处理的基本步骤。通过这种方式,可以统一处理应用程序中可能出现的异常,并返回用户友好的错误信息。
8.SpringBoot性能如何优化#
- 减少启动时间:可以通过禁用不必要的自动配置、关闭DevTools和JVM参数调优等方式来减少应用程序的启动时间。
- 优化数据库访问:可以使用缓存、分页查询、批量更新等方式来优化数据库访问,提高数据读写效率。
- 使用异步编程模型:异步编程可以提高应用程序的吞吐量和响应速度。可以使用Spring框架中的异步特性(如@Async注解)或Reactor库来实现异步编程模型。
- 使用缓存:使用缓存可以避免重复计算和IO操作,提高应用程序的性能。可以使用Spring Cache抽象层来实现缓存功能。
- 避免过度依赖:过度依赖其他组件和库可能会导致代码冗余和性能下降。可以尽量避免过度依赖其他组件和库,只引入必要的依赖。
- 使用合适的日志级别:使用合适的日志级别可以避免产生过多的日志信息,降低应用程序的开销。
- 避免频繁的对象创建和垃圾回收:频繁的对象创建和垃圾回收可能会导致性能下降。可以使用对象池、避免在循环中创建对象等方式来减少对象创建和垃圾回收次数。
9.springboot 如何实现自定义starter#
Spring Boot 允许您创建自定义 Starter 来封装您的应用程序或库,使其更容易在其他 Spring Boot 项目中重用。
要创建自定义 Starter,请执行以下步骤:
- 创建一个 Maven 或 Gradle 项目。
- 将
spring-boot-starter-parent
作为父项目,并添加spring-boot-starter-dependencies
依赖项管理器,以确保 Starter 可以与其他 Spring Boot 应用程序一起使用。 - 在该项目中编写代码并定义必要的配置属性和 Bean。
- 在
src/main/resources/META-INF/spring.factories
中声明自己的org.springframework.boot.autoconfigure.EnableAutoConfiguration
实现类以启用自动配置。 - (可选)如果需要,可以将 Starter 发布到 Maven 中央仓库。
完成这些步骤后,您的 Starter 就可以像其他任何 Spring Boot Starter 一样在应用程序中使用。
10.SpringBoot微服务中如何实现 session 共享#
- 使用 Spring Session:Spring Session 提供了一个用于在不同的 Servlet 容器(如 Tomcat、Jetty 等)之间共享 HttpSession 的解决方案。您可以将 Spring Session 集成到微服务架构中,以便允许多个服务使用相同的 HttpSession。
- 使用 Redis 实现 HttpSession 共享:您可以使用 Spring Data Redis 或 Jedis 等 Redis 客户端库来实现将 HttpSession 存储在 Redis 中。这样,不同的微服务实例可以从 Redis 中获取相同的 HttpSession 数据,从而实现 HttpSession 共享。
- 使用 JWT Token:由于 RESTful API 是无状态的,因此使用 JWT (JSON Web Token) 可以避免进行任何会话管理。当用户登录时,服务器将生成 JWT Token 并返回给客户端,客户端应该将其保存在本地存储或 Cookie 中。然后在每个请求中将该 token 发送到服务器,服务器将对其进行验证,并根据其中包含的信息对用户进行身份验证。由于 JWT 无需存储在服务器上,因此它适用于高度可扩展的微服务体系结构。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步