SpringBoot
1 为什么要用SpringBoot?
Spring Boot 优点非常多,如:
- 独立运行:Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
- 简化配置:spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。
- 自动配置:Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starterweb启动器就能拥有web的功能,无需其他配置。
- 无代码生成和XML配置:Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
- 应用监控:Spring Boot提供一系列端点可以监控服务及应用,做健康检测。
2 运行Spring Boot有哪几种方式?
- 打包用命令或者放到容器中运行
- 用Maven/Gradle 插件运行
- 直接执行 main 方法运行
3 如何理解 Spring Boot 中的 Starters?
Starters是什么:
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。Starters命名:
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。
常用的Starters:
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa 数据库支持
spring-boot-starter-data-redis redis数据库支持
spring-boot-starter-actuator actuator监控支持
mybatis-spring-boot-starter 第三方的mybatis集成starter
4 Spring Boot中的监视器是什么?
Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。可以通过配置开放端点或者隐藏端点。
5 如何使用Spring Boot实现异常处理?
Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法。 我们通过实现一个
ControlerAdvice类,来处理控制器类抛出的所有异常。
6 SpringBoot 如何实现热部署?
1、模板热部署
在SpringBoot中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭模版引擎的缓存,如下:
Thymeleaf的配置:spring.thymeleaf.cache=false
FreeMarker的配置:spring.freemarker.cache=false
2、使用调试模式Debug实现热部署
此种方式为最简单最快速的一种热部署方式,运行系统时使用Debug模式,无需装任何插件即可,但是无法对配置文件,方法名称改变,增加类及方法进行热部署,使用范围有限。
3、spring-boot-devtools
在Spring Boot 项目中添加 spring-boot-devtools依赖即可实现页面和代码的热部署。
此种方式的特点是作用范围广,系统的任何变动包括配置文件修改、方法名称变化都能覆盖,但是后遗症也非常明显,它是采用文件变化后重启的策略来实现了,主要是节省了我们手动点击重启的时间,提高了实效性,在体验上回稍差。
spring-boot-devtools 默认关闭了模版缓存,如果使用这种方式不用单独配置关闭模版缓存。
4、Spring Loaded
此种方式与Debug模式类似,适用范围有限,但是不依赖于Debug模式启动,通过Spring Loaded库文件启动,即可在正常模式下进行实时热部署。此种需要在 run confrgration 中进行配置。
5、JRebel
Jrebel是Java开发最好的热部署工具,对Spring Boot 提供了极佳的支持,JRebel为收费软件,试用期14天。可直接通过插件安装。
7 Spring Boot自助配置原理是什么?
Spring Boot的自动配置原理是基于条件化配置(Conditional Configuration)的概念。自动配置使得在应用程序启动时,Spring Boot可以根据项目的依赖和类路径上的内容,自动配置各种功能和组件,而无需开发者显式地进行大量的配置。
a) @SpringBootApplication 或 @EnableAutoConfiguration: 在Spring Boot的主类的 main 方法中使用 @SpringBootApplication 或者 @EnableAutoConfiguration 注解,是启动Spring Boot应用程序的入口。这两个注解会触发Spring Boot自动配置的机制。
b) spring.factories 文件: 在项目的依赖中,每个Spring Boot Starter都包含一个 META-INF/spring.factories 文件。这个文件中列出了各个Starter所提供的自动配置类。当Spring Boot应用启动时,它会扫描这些Starter,加载并应用自动配置类。
c) 自动配置类的加载: Spring Boot会在启动时扫描项目的依赖中的spring.factories文件,找到各个Starter的自动配置类,并加载这些类。
d) @Conditional 注解的条件判断: 自动配置类通常会使用 @Conditional 注解来定义一些条件,例如 @ConditionalOnClass、@ConditionalOnMissingBean 等。这些条件会在Spring Boot启动时进行评估,根据条件判断结果来决定是否应用某个自动配置。
e) 自动配置与Bean注入: 符合条件的自动配置类会在Spring容器中创建和注册一些Bean。这些Bean通常是应用程序所需的基础设施,如数据源、消息队列、缓存等。这些Bean会根据自动配置的条件和配置信息被注入到Spring的应用上下文中。
8 Spring Boot读取配置的方式有哪些?
a) 使用 @Value 注解: 通过在类的字段或方法参数上使用 @Value 注解,可以将配置值直接注入到对应的属性中。例如:
@Value("${myapp.database.url}")
private String databaseUrl;
b) 使用 @ConfigurationProperties 注解:@ConfigurationProperties 注解可以用于将一组相关的配置属性映射到一个Java对象中。首先,创建一个用于保存属性值的POJO类,然后在类上使用 @ConfigurationProperties 注解,并指定属性的前缀。接下来,可以通过注入这个POJO类来获取属性值。例如:
@ConfigurationProperties(prefix = "myapp.database")
public class DatabaseProperties {
private String url;
// ...
}
c) 通过 Environment 获取属性: 通过在类中注入 Environment 对象,可以使用它来获取配置属性。例如:
@Autowiredprivate Environment environment;
public void someMethod() {
String url = environment.getProperty("myapp.database.url");
}
d) 使用 @PropertySource 注解:@PropertySource 注解用于指定外部配置文件的位置,然后可以使用 Environment 或 @Value 注解来读取这些属性值。例如:
@Configuration@PropertySource("classpath:custom.properties")
public class CustomConfig {
// ...
}
9 Spring Boot 的核心配置文件有哪几个?
1、配置文件种类
- SpringBoot项目默认的配置文件有两种:bootstrap、application
- 支持的文件类型有两种:properties和yml。
- 所以默认的配置文件有四个:bootstrap.properties,application.properties、bootstrap.yml,application.yml,常用的是application.properties。
- 默认位于src/main/resources/下。
2、默认配置文件优先级
上面的4个配置文件,通常情况下只选择一个即可,如果配置了多个,其加载的顺序为:
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml从高到低。
3、bootstrap常见应用场景:
- 配置一些固定的,不能被覆盖的属性,用于一些系统级别的参数配置。本地的配置文件是默认不能覆盖远程的配置的
- 一些需要加密/解密的场景
- 当你使用了Spring Cloud Config配置中心时,这时需要在boostrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息。
4、application常见应用场景:
- 常用于SpringBoot项目的自动化配置
- 用于一些应用级别的参数配置
10 Spring Boot 如何定义多套不同环境配置?
Spring Boot支持多套不同环境配置,使得在不同的环境(如开发、测试、生产)中使用不同的配置属性。
- 创建不同环境的配置文件,命名为 application-{环境名}.properties,
- 在application.properties文件中的配置spring.profiles.active 属性来指定要使用的环境。
例如:
创建 application-dev.properties 和 application-prod.properties 文件
在 application.properties 中设置 spring.profiles.active=dev 或 spring.profiles.active=prod
11 简述SpringBoot的启动流程
- 运行 SpringApplication.run() 方法
- 源码中确定应用程序类型。默认是Servlet容器。 也可以是reactive响应式容器
- 加载所有初始化类,从 META-INF/spring.factories 配置文件中加载的。初始化类实现了ApplicationContextInitializer接口。也可以自定义
- 加载所有监视器类,从 META-INF/spring.factories 配置文件中加载的。初始化类实现了ApplicationListener接口。也可以自定义
- 开启计时器,此刻才认为开始启动springboot程序, 之前都是准备工作,记录开始时间,用来计算启动过程的用时。
- 获取并启用监听器,使得监听器开始生效,工作。
- 设置应用程序参数,将执行run方法时传递的参数封装成对象。
- 准备环境变量,包含系统属性和JVM运行属性,封装在Environment对象中
- 打印banner信息,可以在resources目录下创建banner.txt来自定义banner内容
- 创建应用程序上下文对象,也就是ApplicationContext对象。
- 实例化异常报告器,只捕获启动过程抛出的全局异常,在META-INF/spring.factories中配置了默认异常报告器
- 准备上下文环境,实例化单例的beanName生成器,执行初始化器,将启动参数注册到容器中
- 刷新上下文,完成自动装备及一些启动工作。 如tomcat启动等
- 执行后置处理,刷新上下文后的一些处理工作,用户可以扩展,重写afterRefresh方法
- 结束解释器,springboot程序启动完成, 打印用时的时间。
12 说一说Spring Boot REST 请求风格?
- HTTP 协议是一个广泛应用的 Internet 协议,不同的请求方法,常见的有GET , POST , PUT , DELETE
- REST 全称 Representational State Transfer ——(资源)表现层状态转化,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用
- REST 风格就是通过 Http 请求方式的不同来标识不同的方法,即对于同一个请求路径,可以根据请求方式的不同来区分它们
操作 | 传统风格请求 | REST风格请求 |
查询所有记录 | localhost:8080/sys/findUserAll | GET localhost:8080/sys/user |
查询一条记录 | localhost:8080/sys/findUser?uno=1 | GET localhost:8080/sys/user/1 |
保存一条记录 | localhost:8080/sys/saveUser | POST localhost:8080/sys/user |
修改一条记录 | localhost:8080/sys/upateUser | PUT locahost:8080/sys/user |
- 使用@GetMapping , @PostMapping等注解, 配合@PathVariable注解完成请求映射与参数获取。
13 springboot如何整合第三方框架?
1、添加依赖:在项目的pom.xml文件中添加第三方框架的starter启动器依赖,以及一些必须 的相关的依赖,如整合mybatis框架,需要引入mybatis-sping-boot-starter 和 mysql- connector-java
2、配置属性:在application.properties中配置第三方框架的必要属性。
如:spring.datasource.driver-class-name 等
3、配置Bean:在Spring配置中声明第三方框架的Bean,或者使用自动配置特性。
如:声明SqlSessionFactory
4、使用框架:在你的应用代码中注入并使用第三方框架的类和方法。
14说一说“@SpringBootApplication”注解在内部是如何工作的?
Spring Boot 应用程序使用此注解执行。实际上它是其他 3 个注释的组合:
ComponentScan、EnableAutoConfiguration和Configuration。
- “@Configuration” ——所有带注释的类都被视为 Spring Boot 的配置,它们有资格创建 bean 并返回到 IOC 容器。
- “@ComponentScan” ——所有带注释的类都将通过包(在哪里寻找)进行扫描,并帮助创建这些类的实例。
- “@EnableAutoConfiguration” ——开启自动配置。基础框架附带了一个名为auto-configure的内置库,它为我们提供了与不同框架整合所需要的自动配置类。通过@ConditionalOnBean”、“@ConditionalOnClass等注解检测每一个配置类的激活条件,满足激活条件,开始自动配置。