一、 什么是Spring Boot?
答:SpringBoot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重XML的配置,提供了各种启动器,在运行过程中自定配置, 开发者能快速上手。它的优势是独立运行、 简化配置、自动配置 、无代码生成和XML配置, 无需部署war文件。
二 、Spring Boot 有哪些优点?
Spring Boot 的优点有: 减少开发,测试时间和努力。 使用JavaConfig 有助于避免使用XML。 避免大量的Maven导入和各种版本冲突。 提供意见发展方法。 通过提供默认值快速开始开发。 没有单独的Web服务器需要。这意味着你不再需要启动Tomcat,Glassfish或其他任何东 西。 需要更少的配置 因为没有web.xml文件。只需添加用@ Configuration注释的类,然后添加 用@Bean注释的方法,Spring将自动加载对象并像以前一样对其进行管理。您甚至可以将 @Autowired 添加到bean方法中,以使Spring自动装入需要的依赖关系中。 基于环境的配置 Dspring.profiles.active 使用这些属性,您可以将您正在使用的环境传递到应用程序: = {enviornment}。在加载主应用程序属性文件后,Spring将在 (application{environment} .properties)中加载后续的应用程序属性文件。
三、什么是JavaConfig?
答:Spring JavaConfig 是 Spring 社区的产品,它提供了配置Spring IoC容器的纯Java方法。因此 它有助于避免使用XML配置。使用JavaConfig的优点在于: 面向对象的配置。由于配置被定义为JavaConfig中的类,因此用户可以充分利用Java中的 面向对象功能。一个配置类可以继承另一个,重写它的@Bean方法等。 减少或消除XML配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人 员不希望在XML和Java之间来回切换。JavaConfig为开发人员提供了一种纯Java方法来配 置与XML配置概念相似的Spring容器。从技术角度来讲,只使用JavaConfig配置类来配置 容器是可行的,但实际上很多人认为将JavaConfig与XML混合匹配是理想的。 类型安全和重构友好。JavaConfig提供了一种类型安全的方法来配置Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索bean,不需要任何强制转换或 基于字符串的查找。
四、如何重新加载Spring Boot上的更改,而无需重新启动服务器?
答:这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat 将重新启动。Spring Boot有一个开发工具(DevTools)模块,它有助于提高开发人员的生 产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务 器。开发人员可以重新加载Spring Boot上的更改,而无需重新启动服务器。这将消除每次 手动部署更改的需要。Spring Boot在发布它的第一个版本时没有这个功能。这是开发人员 最需要的功能。DevTools模块完全满足开发人员的需求。该模块将在生产环境中被禁用。 它还提供H2数据库控制台以更好地测试应用程序。 org.springframework.boot spring-boot-devtools true
五、Spring Boot 中的监视器是什么?
答:Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot监视器可帮助您访 问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和 监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器 模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
六、如何在Spring Boot 中禁用Actuator端点安全性?
答:默认情况下,所有敏感的HTTP端点都是安全的,只有具有ACTUATOR角色的用户才能访 问它们。安全性是使用标准的HttpServletRequest.isUserInRole 方法实施的。 我们可以使用 management.security.enabled = false 来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。
七、SpringBoot 拦截器、监听器、过滤器它们的作用和区别是什么?
答:1.拦截器(Interceptor)
拦截器是SpringMVC框架提供的一种机制,它可以在请求处理前、处理后和视图渲染前对请求进行拦截和处理。拦截器常用于对用户的请求进行身份验证、日志记录、权限控制等操作。在SpringBoot中,可以通过实现HandlerInterceptor接口来创建拦截器,在配置文件中配置拦截器的生效路径。
2.监听器(Listener)
监听器是用于监听应用程序中事件的一种机制,它可以在事件发生前、发生后或发生异常时进行处理。SpringBoot中的监听器可以监听Web应用程序的启动和关闭、Session的创建和销毁、上下文的初始化和销毁等事件。在SpringBoot中,可以通过实现ApplicationListener接口来创建监听器,在配置文件中配置监听器的生效方式。
3.过滤器(Filter)
过滤器是Web应用程序中最常用的一种中间件,它可以在请求被处理前和响应被发送前对请求和响应进行过滤和处理。过滤器常用于对请求进行编码、解码、验证、日志记录等操作。在SpringBoot中,可以通过实现Filter接口来创建过滤器,在配置文件中配置过滤器的生效路径和顺序。
总之,拦截器、监听器和过滤器都是用于处理Web请求的中间件,它们的作用和使用方式略有不同,但都可以实现对Web应用程序的控制和管理。在开发Web应用程序时,可以根据具体需求选择合适的中间件来处理请求。
八、SpringBoot 自动装配原理?
答:SpringBoot的自动装配是SpringFramework的一个扩展,它可以根据应用程序的配置和classpath中的类来自动配置Spring应用程序上下文。SpringBoot的自动装配是通过条件化配置和Spring的组件扫描机制来实现的。
具体来说,SpringBoot的自动装配原理包括以下几个方面:
1.条件化配置
SpringBoot的自动装配是基于条件化配置的,即通过在类路径下的META-INF/spring.factories文件中定义条件化的自动配置类,根据条件来决定是否应用该自动配置类。例如,如果应用程序中配置了某个Bean,则不会应用自动配置类中的相应Bean。
2.Spring组件扫描
SpringBoot的自动装配也依赖于Spring的组件扫描机制,即通过在应用程序中定义@ComponentScan注解来扫描应用程序中的组件,并将它们自动注入到Spring应用程序上下文中。通过自动扫描机制,SpringBoot可以自动装配许多常见的组件,例如控制器、服务、存储库等。
3.自动配置类
SpringBoot的自动装配还依赖于自动配置类,即在类路径下的META-INF/spring.factories文件中定义的条件化自动配置类。这些自动配置类可以自动配置Spring应用程序上下文中的各种组件,例如数据源、事务管理器、WebMvcConfigurer等。
4.SpringBoot Starter
SpringBoot Starter是SpringBoot的一个重要特性,它可以将相关的依赖项打包成一个单独的模块,并提供默认的自动配置类和配置文件,从而简化应用程序的配置过程。例如,SpringBoot提供了spring-boot-starter-web模块,它包含了Web应用程序所需的依赖项和默认的自动配置类,可以快速地搭建一个Web应用程序。
总之,SpringBoot的自动装配是通过条件化配置和Spring的组件扫描机制来实现的,它可以大大简化应用程序的配置过程,并提高应用程序的开发效率。
九、Spring Boot 有哪些核心注解?
答:Spring Boot的核心注解主要包括以下几个:
1.@SpringBootApplication:标识一个类作为Spring Boot项目的启动类。实际上,这个注解是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan这三个注解的组合。
2.@SpringBootConfiguration:这个注解表示该类是一个Spring Boot配置类,用于定义bean。实际上是一个特殊的@Configuration注解,用于加载Spring Boot项目的配置。
3.@EnableAutoConfiguration:这个注解用于启用Spring Boot的自动化配置功能。通过添加此注解,Spring Boot可以自动引入相关的配置,减少开发人员的配置成本。
4.@ComponentScan:这个注解用于定义Spring扫描包的路径,用于发现应用程序中的bean、组件、配置类和服务等。可以自动扫描并注册包路径下的带有@Component、@Service等注解的类。
十、Spring Boot 配置文件的加载顺序?
答:1.先会加载项目中的默认配置文件,通常位于src/main/resources
目录下的application.properties
或application.yml
。
2.加载特定命名的配置文件,如application-{profile}.properties
或application-{profile}.yml
。
3.如果存在spring.config.location
命令行参数,Spring Boot会按照指定的路径加载配置文件。
加载过程中,如果同一个属性在多个配置文件中都有定义,那么后加载的配置文件中的值将覆盖先加载的配置文件中的值。
十二、bootstrap.properties 和 application.properties 有何区别 ?
答:1.加载顺序和优先级:
bootstrap.properties(或bootstrap.yml)是Spring Boot应用程序启动时最先加载的配置文件。
application.properties(或application.yml)是在bootstrap.properties之后加载。
2.配置范围:
bootstrap.properties的作用范围是全局的,会被该项目下所有的Spring应用程序共享。
application.properties主要关注应用程序本身的配置属性,比如数据库连接、端口设置、日志级别、缓存配置等。
十三、什么是Spring Profiles?
答:Spring Profiles 允许用户根据配置文件(dev,test,prod等)来注册bean。因此,当应用 程序在开发中运行时,只有某些bean可以加载,而在PRODUCTION中,某些其他bean可 以加载。假设我们的要求是Swagger文档仅适用于QA环境,并且禁用所有其他文档。这 可以使用配置文件来完成。Spring Boot使得使用配置文件非常简单。
十四、什么是Spring Batch?
答:Spring Boot Batch 提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟 踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供了更先进 的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。简单 以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。
十五、Spring Boot 项目如何热部署?
答:热部署意味着能够在不重启应用程序服务器的情况下,重新加载代码的更改,可以大大提高开发效率。
实现Spring Boot项目的热部署只需要在pom.xml中添加以下依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
热部署主要用于开发环境,不建议在生产环境中使用。
十六 、Spring Boot 有哪些 starter ?
答:1.spring-boot-starter-web:用于构建 Web 应用程序的 Starter,包括 Spring MVC 和 Tomcat 服务器。
2.spring-boot-starter-data-jpa:用于与关系型数据库进行交互的 Starter,用于简化数据库访问层的开发。
3.spring-boot-starter-data-redis:用于与 Redis 数据库进行交互的 Starter。
4.spring-boot-starter-actuator:用于监控和管理 Spring Boot 应用的 Starter。
5.mybatis-spring-boot-starter:用于在 Spring Boot 应用中集成 MyBatis 。
除了上述常用的 Starter,Spring Boot 还提供了许多其他的 Starter。比如数据库连接池、安全、消息队列等。
十七、SpringBoot 支持哪些日志框架?推荐和默认的日志框架是哪个?
答:SpringBoot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架,SpringBoot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,SpringBoot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。
spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。
十八、SpringBoot 中如何解决跨域问题 ?
答:跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 SpringBoot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现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);
}
十九、SpringBoot打成的jar和普通jar有什么区别?
答:Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。
Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。
普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes
目录下才是我们的代码,因此无法被直接引用。
如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
二十、SpringBoot中如何实现定时任务?
答:定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。
在 Spring Boot 中使用定时任务主要有两种不同的方式,
-
一个就是使用 Spring 中的 @Scheduled 注解,
-
另一个则是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。
二十一、SpringBoot微服务中如何实现 session 共享 ?
答:在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。
将所有微服务的session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
二十二、你使用了哪些 starter maven 依赖项?
答:1.spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
2.spring-boot-starter-data-jpa 数据库支持
3.spring-boot-starter-data-redis redis数据库支持
4.spring-boot-starter-data-solr solr支持
5.mybatis-spring-boot-starter 第三方的mybatis集成starter
6.自定义的starter(如果自己开发过就可以说出来)
二十三、 Spring Boot 如何定义多套不同环境配置?
答:Spring Boot支持多套不同环境配置,使得你可以在不同的环境(如开发、测试、生产)中使用不同的配置属性。以下是在Spring Boot中定义多套不同环境配置的常见方法:
1.使用不同的配置文件: Spring Boot默认会加载 application.properties
或 application.yml
文件中的配置属性。你可以创建不同环境的配置文件,命名为 application-{环境名}.properties
或 application-{环境名}.yml
,然后在启动应用程序时通过 spring.profiles.active
属性来指定要使用的环境。例如,创建 application-dev.properties
和 application-prod.properties
文件,并在 application.properties
中设置 spring.profiles.active=dev
或 spring.profiles.active=prod
。
2.使用 @Profile
注解: 通过在配置类或组件上使用 @Profile
注解,你可以根据不同的环境来选择性地加载特定的配置类或组件。例如:
@Configuration@Profile("dev")public class DevConfig { // ...}@Configuration@Profile("prod")public class ProdConfig { // ...}
二十四、你知道“@SpringBootApplication”注解在内部是如何工作的吗?
答:Spring Boot 应用程序使用此注解执行。实际上它是其他 3 个注释的组合:
ComponentScan、EnableAutoConfiguration和Configuration。
@SpringBootApplication = @ComponentScan + @EnableAutoConfiguration + @Configuration
“@Configuration” ——所有带注释的类都被视为 Spring Boot 的广告配置,它们有资格创建 bean 并返回到 IOC 容器。
“@ComponentScan” ——所有带注释的类都将通过包(在哪里寻找)进行扫描,并帮助创建这些类的实例。
“@EnableAutoConfiguration” ——这是神奇的注解。这会寻找类路径。基础框架附带了一个名为auto-configure的内置库,它为我们完成了这项工作。它检测某些类的存在以及类路径上的存在,并为我们自动配置它们。我在下面放了图书馆的快照。如果您前往 spring.factories 文件,您将看到可用的类配置。
二十五、Spring Boot 中如何处理事务?使用的任何注释?
答:在Spring Boot中处理事务通常使用@Transactional
注解。这个注解可以被标注在方法上或者类上。当标注在方法上时,仅该方法拥有事务性行为。而当标注在类上时,该类中的所有公共方法默认都有事务行为。
使用@Transactional
注解时,你可以配置事务的隔离级别、传播行为、超时设置以及事务的回滚规则等。
例如:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MyService {
@Transactional
public void someTransactionalMethod() {
// 方法中的数据库操作会在一个事务内执行
}
}
PS:@Transactional参数说明: