1.什么是 Spring Boot?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
2.SpringBoot有哪些优点?
独立运行 Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
简化配置 spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。
自动配置 Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring-boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。
无代码生成和XML配置 Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring4.x 的核心功能之一。
避免大量的Maven导入和各种版本冲突
应用监控 Spring Boot 提供一系列端点可以监控服务及应用,做健康检测。
3.SpringBoot有哪些缺点?
任何技术都是有优缺点的
SpringBoot优点概括起来就是简化:简化编码,简化配置,简化部署,简化监控,简化依赖坐标导入,简化整合其他技术….
SpringBoot的缺点是入门简单精通难,各种强大的功能封装的太好了,内部原理比较难得参透!再就是用多了容易产生依赖,就像嗑药似的,用了就离不开了;SpringBoot一旦出了错误,由于内部封装比较深,部分错误调试难度比一般Spring应用程序要大很多!
当然完全不必纠结与SpringBoot的缺点,毕竟SpringBoot的优点太突出了。
4.Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密/解密的场景;
5.Spring Boot 的配置文件有哪几种格式?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同。
1).properties
app.user.name = javastack
2).yml
app: user: name: javastack
另外,.yml 格式不支持
@PropertySource
注解导入配置。
6.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {主要组合包含了以下 3 个注解:
@SpringBootConfiguration: 组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration: 打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan: Spring组件扫描。
7.开启 Spring Boot 特性有哪几种方式?
快问快答
1)继承spring-boot-starter-parent项目
2)导入spring-boot-dependencies项目依赖
详细介绍启动方式
Spring Boot依赖
使用Spring Boot很简单,先添加基础依赖包,有以下两种方式
继承spring-boot-starter-parent项目
1. 继承spring-boot-starter-parent项目
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> </parent>2. 导入spring-boot-dependencies项目依赖
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencyManagement>
8.什么是JavaConfig?
JavaConfig是一种用于配置和管理Java应用程序的方式。它是基于纯Java代码的配置方法,用于替代传统的XML配置文件。JavaConfig使开发者能够以编程的方式定义和组装应用程序的各个组件,而不需要使用繁琐的XML配置。
通过JavaConfig,开发者可以使用Java类和注解来定义应用程序的配置信息。这些Java类通常被称为配置类,它们包含了一系列的Java方法,每个方法都对应一个组件的配置。例如,可以使用@Configuration注解将一个类标记为配置类,并在其中使用@Bean注解定义一个Bean。
JavaConfig的主要优点之一是提供了类型安全的配置。由于配置类是使用Java代码编写的,因此在编译时就能够检测到配置错误,避免了在运行时才发现配置问题的情况。
另外,JavaConfig还提供了更好的可读性和可维护性。通过使用Java代码进行配置,可以更清晰地表达应用程序的依赖关系和配置信息,减少了繁琐的XML配置文件的使用。
总而言之,JavaConfig是一种使用纯Java代码进行应用程序配置的方式,它提供了类型安全、可读性高和可维护性好的优点。它是许多Java框架和项目中常用的配置方式,如Spring框架的JavaConfig和Spring Boot的注解驱动配置。
当使用JavaConfig配置一个简单的Bean时,可以按照以下方式进行:
首先,创建一个普通的Java类作为配置类,并使用@Configuration注解标记该类为配置类。例如,我们创建一个名为AppConfig的配置类:
@Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } }然后,创建一个普通的Java类作为Bean,例如,我们创建一个名为MyBean的Bean类:
public class MyBean { public void sayHello() { System.out.println("Hello, World!"); } }接下来,在应用程序中使用该配置类来获取相应的Bean实例:
public class MainApp { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 获取MyBean实例 MyBean myBean = context.getBean(MyBean.class); // 调用MyBean的方法 myBean.sayHello(); context.close(); } }在上述示例中,我们使用@Configuration注解标记了AppConfig类作为配置类,并使用@Bean注解定义了一个名为myBean的Bean。在MainApp类中,我们使用AnnotationConfigApplicationContext来加载配置,并通过调用getBean方法获取到myBean实例。最后,我们调用myBean的sayHello方法输出"Hello, World!"。 这个例子演示了如何使用JavaConfig配置和获取一个简单的Bean实例。
9.SpringBoot自动配置原理是什么?
Spring Boot的自动配置是通过条件化配置的机制来实现的。它使用了Spring Framework中的条件注解和条件判断器来根据应用程序的环境和依赖情况自动配置相应的组件。
Spring Boot的自动配置原理可以总结为以下几个步骤:
类路径扫描:Spring Boot会扫描应用程序的类路径,查找特定的配置类和组件。
条件判断:对于每一个被扫描到的配置类或组件,Spring Boot会检查它们是否满足特定的条件。条件注解(如@ConditionalOnClass、@ConditionalOnBean等)用于根据类是否存在、Bean是否存在等条件进行判断。
自动配置:当满足条件时,Spring Boot会自动将相应的组件进行配置。这些组件包括各种Spring Bean、配置属性等。
属性绑定:Spring Boot会将外部配置文件(如application.properties或application.yml)中的属性值绑定到相应的配置类或组件上。
Bean注册:Spring Boot会将配置好的Bean注册到Spring应用程序的上下文中,使其可以在应用程序中进行使用。
通过上述步骤,Spring Boot能够根据应用程序的环境和依赖情况自动配置相应的组件,简化了开发者的配置工作。
需要注意的是,Spring Boot的自动配置是可插拔的。开发者可以通过自定义条件注解和条件判断器,以及配置文件中的属性值,来控制和定制自动配置的行为。如果需要禁用某个自动配置,可以通过在配置文件中设置相应的属性值来实现。
综上所述,Spring Boot的自动配置通过条件化配置的机制,根据应用程序的环境和依赖情况自动配置相应的组件,简化了应用程序的配置过程。
10.SpringBoot、Spring MVC和Spring有什么区别?
Spring Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转。 当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用。
Spring MVC Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
SpringBoot Spring和Spring MVC的问题在于需要配置大量的参数。 SpringBoot通过一个自动配置和启动的项来解决这个问题。
11.SpringBoot启动时都做了什么?
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
12.SpringBoot 需要独立的容器运行吗?
可以不需要,内置了 Tomcat/ Jetty 等容器。
13.什么是YAML?
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
14.YAML 配置的优势在哪里 ?
YAML 现在可以算是非常流行的一种配置文件格式了,无论是前端还是后端,都可以见到 YAML 配置。那么 YAML 配置和传统的 properties 配置相比到底有哪些优势呢?
配置有序,在一些特殊的场景下,配置有序很关键
支持数组,数组中的元素可以是基本数据类型也可以是对象
简洁
相比 properties 配置文件,YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的 YAML 配置。
15.SpringBoot 是否可以使用 XML 配置 ?
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
16.SpringBoot核心配置文件是什么?
bootstrap.properties和application.properties
17.bootstrap.properties和application.properties 有何区别 ?
SpringBoot两个核心的配置文件:
bootstrap(.yml 或者 .properties):boostrap 由父 ApplicationContext 加载的,比applicaton优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 SpringCloud Config 或者Nacos中会用到它。且boostrap里面的属性不能被覆盖;
application (.yml或者.properties):由ApplicatonContext 加载,用于 SpringBoot项目的自动化配置。
18.什么是Spring Profiles?
主要用来区分环境; Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。
19.如何在自定义端口上运行SpringBoot应用程序?
SpringBoot默认监听的是8080端口;为了在自定义端口上运行 SpringBoot 应用程序,您可以在application.properties 中通过
server.port = 8888指定端口;这样就可以将监听的端口修改为8888。
20.如何实现SpringBoot应用程序的安全性?
为了实现SpringBoot的安全性,我们使用spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。
===========================================================
21.比较一下Spring Security 和Shiro各自的优缺点 ?
由于SpringBoot官方提供了大量的非常方便的开箱即用的Starter,包括Spring Security的Starter ,使得在 SpringBoot中使用Spring Security变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是SpringBoot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro和Spring Security相比,主要有如下一些特点:
Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
Spring Security 功能强大;Shiro 功能简单
22.SpringBoot中如何解决跨域问题 ?
可以通过实现WebMvcConfigurer接口然后重写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); } }
这段代码是一个使用Spring Boot的配置类,用于配置跨域资源共享(CORS)的设置。
CORS是一种机制,允许在浏览器中运行的Web应用程序从不同的源访问跨域资源。默认情况下,浏览器限制跨域请求,以防止潜在的安全威胁。通过配置CORS,可以在服务器端定义允许的跨域请求规则,以实现跨域资源的访问。
在这个示例中,
CorsConfig
类实现了WebMvcConfigurer
接口,重写了addCorsMappings
方法。该方法用于配置跨域请求的映射规则。
registry.addMapping("/**")
:指定允许跨域的路径,这里是所有路径。
allowedOrigins("*")
:设置允许跨域请求的源,这里使用通配符表示任何源都允许访问。
allowCredentials(true)
:设置是否允许发送跨域请求时携带用户凭证(如cookies、HTTP身份验证或客户端SSL证书)。
allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
:设置允许的HTTP请求方法。
maxAge(3600)
:设置预检请求(OPTIONS)的缓存时间(以秒为单位),即在指定时间内不需要再发送预检请求。通过这段代码的配置,应用程序将允许来自任何源的跨域请求,并支持常见的HTTP请求方法。此外,还启用了携带用户凭证的功能,以及预检请求的缓存。
23.什么是 CSRF 攻击?
CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。
24.SpringBoot 中的监视器是什么
在Spring Boot中,监视器(Monitor)指的是用于监控和管理应用程序运行状态的组件。Spring Boot提供了一些内置的监视器,可以帮助开发者监测应用程序的健康状况、性能指标和运行时信息。
以下是一些常见的Spring Boot监视器:
健康监视器(Health Monitor):健康监视器用于检查应用程序的健康状况,并向外部系统报告应用程序的运行状态。通过访问
/actuator/health
端点,可以获取应用程序的健康信息,如是否存活、是否正常运行等。开发者还可以自定义健康监视器,根据业务需求添加自定义的健康检查逻辑。信息监视器(Info Monitor):信息监视器用于提供关于应用程序的额外信息,如版本号、构建时间等。通过访问
/actuator/info
端点,可以获取应用程序的信息。开发者可以自定义信息监视器,添加自定义的应用程序信息。环境监视器(Environment Monitor):环境监视器用于获取应用程序的配置信息和运行环境。通过访问
/actuator/env
端点,可以获取应用程序的环境变量、系统属性、配置属性等。开发者可以使用环境监视器来查看和调试应用程序的配置。性能监视器(Performance Monitor):性能监视器用于监测应用程序的性能指标。Spring Boot提供了一些内置的性能指标,如请求次数、请求处理时间等。通过访问
/actuator/metrics
端点,可以获取这些性能指标的详细信息。开发者还可以添加自定义的性能指标,以便监控应用程序的特定性能。日志监视器(Logfile Monitor):日志监视器用于提供应用程序的日志文件内容。通过访问
/actuator/logfile
端点,可以获取应用程序的日志文件路径和内容。该监视器对于排查问题和分析日志非常有用。这些监视器通过Spring Boot的Actuator模块提供,并且可以通过简单的配置启用。开发者可以根据需要选择启用哪些监视器,并可以通过自定义健康检查、指标收集等方式扩展和定制监视器的功能。
25.如何监视所有SpringBoot微服务?
SpringBoot提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。
26.什么是 WebSockets?
WebSockets是一种在Web应用程序中实现全双工通信的协议。它允许客户端和服务器之间建立持久性的、双向的通信连接,以实时地传输数据。
传统的HTTP协议是无状态的,即每次请求都是独立的,服务器只能在收到请求后响应数据。而WebSockets协议通过在客户端和服务器之间建立一个持久性的连接,使得双方可以随时发送和接收数据,而不需要每次都重新建立连接。
WebSockets协议的特点包括:
双向通信:客户端和服务器可以同时发送和接收数据,实现真正的双向通信。
实时性:WebSockets提供了低延迟的通信,可以实时地传输数据,适用于实时聊天、在线游戏等场景。
低开销:相比于HTTP协议,WebSockets协议的通信开销更低,因为它建立一次连接后可以多次复用,而不需要反复建立连接。
在使用WebSockets时,客户端和服务器都可以通过WebSocket API进行操作。客户端可以通过JavaScript代码与服务器建立WebSocket连接,并监听来自服务器的消息。服务器则可以使用特定的WebSocket库或框架来处理客户端的连接和消息。
WebSockets已被广泛应用于实时Web应用程序、即时通讯、协同编辑、股票市场行情等需要实时数据传输和双向通信的场景。它为开发者提供了一种便捷高效的方式来构建具有实时特性的Web应用程序。
27.什么是 Spring Data?
Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:
SpringData 项目支持 NoSQL 存储:
MongoDB (文档数据库)
Neo4j(图形数据库)
Redis(键/值存储)
Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术:
JDBC
JPA
Spring Data Jpa 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。
28.Swagger用过麽?他用来做什么?
Swagger广泛用于可视化API,使用SwaggerUl为前端开发人员提供在线沙箱。Swagger 是用于生成RESTful Web服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger 消除了调用服务时的猜测。
29.前后端分离,如何维护接口文档 ?
前后端分离开发日益流行,大部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离一定会有接口文档,不然会前后端会深深陷入到扯皮中。一个比较笨的方法就是使用 word 或者 md 来维护接口文档,但是效率太低,接口一变,所有人手上的文档都得变。在 Spring Boot 中,这个问题常见的解决方案是 Swagger ,使用 Swagger 我们可以快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最新的接口文档,非常方便。
30.SpringBoot项目如何热部署?
这可以使用 DEV 工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat 将重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools 模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供 H2 数据库控制台以更好地测试应用程序。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
31.SpringBoot 中的starter到底是什么 ?
首先,这个 Starter 并非什么新的技术点,基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为
XXXAutoConfiguration
,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是 Spring 中原本就有的),然后它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义 Starter
32.spring-boot-starter-parent 有什么用?
新创建一个 SpringBoot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
定义了 Java 编译版本为 1.8 。
使用 UTF-8 格式编码。
继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
执行打包操作的配置。
自动化的资源过滤。
自动化的插件配置。
针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。
33.SpringBoot 打成的jar和普通的jar有什么区别 ?
pring oot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过
java -jar xxx.jar
命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。SpringBoot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在
\BOOT-INF\classes
目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
34.如何使用SpringBoot实现异常处理?
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。
当使用Spring的
@ControllerAdvice
注解时,您可以创建一个全局异常处理器来捕获和处理应用程序中抛出的所有异常。下面是一个详细的例子:
创建一个自定义异常类
public class CustomException extends RuntimeException { public CustomException(String message) { super(message); } }
创建一个全局异常处理器
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) public ResponseEntity<String> handleCustomException(CustomException ex) { // 可以根据具体需求进行处理,例如记录日志、返回特定的错误信息等 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage()); } @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 其他未处理的异常会被该方法捕获 // 可以根据具体需求进行处理,比如返回适当的错误信息或者选择不同的HTTP状态码 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); } }在上述代码中,我们创建了一个名为
GlobalExceptionHandler
的类,并使用@ControllerAdvice
注解标识它是一个全局异常处理器。然后,我们使用@ExceptionHandler
注解来标识处理特定类型异常的方法。
handleCustomException
方法用于处理CustomException
类型的异常。当应用程序中抛出CustomException
异常时,该方法将被调用,并返回一个HTTP 500的响应。
handleException
方法用于处理其他未处理的异常,它的参数类型为Exception
。当应用程序中抛出任何未处理的异常时,该方法将被调用,并返回一个HTTP 500的响应。
在控制器中抛出异常
@RestController public class MyController { @GetMapping("/test") public void test() { throw new CustomException("Custom Exception"); } }在上述代码中,我们在
MyController
中的test
方法中抛出了一个自定义异常CustomException
。当应用程序中抛出异常时,全局异常处理器
GlobalExceptionHandler
会捕获并处理该异常。请注意,全局异常处理器中的方法可以根据需要进行扩展和定制,例如记录日志、返回特定的错误信息、选择不同的HTTP状态码等。通过使用
@ControllerAdvice
和@ExceptionHandler
来实现全局异常处理,可以避免在每个控制器中都重复编写相同的异常处理逻辑,提高了代码的可维护性和可重用性。
35.如何使用SpringBoot实现分页和排序?
使用Spring Boot实现分页非常简单。使用Spring Data-JPA可以实现将可分页的
org.springframework.data.domain.Pageable
传递给存储库方法。public Page find(Integer page, Integer size) { if (null == page) { page = 0; } if (CheckUtils.isEmpty(size)) { size = 10; } PageRequest pageable = PageRequest.of(page, size, Sort.Direction.DESC, "updateTime"); Page users = userRepository.findAll(pageable); return users; }
36.微服务中如何实现 session 共享?
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。