springboot面试题
什么是SpringBoot?你们项目中为什么使用springboot?
springboot是spring框架的脚手架工程,可以说是在spring框架的外边套了一层壳子。
SpringBoot简化了使用 Spring 的难度。比如,我们以前基于SSM来开发项目需要进行大量的配置,现在使用springboot简省了繁重的配置,提供了各种启动器,基于⾃动配置代码提供了⾃动配置模块及依赖,让软件集成变得简单、易⽤开发者能快速上手。
- 独立运行
Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
- 简化配置
springboot基于约定大于配置的理念,让我们的配置变少了。
spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。
-
自动配置
我们使用springboot可以很轻松的完成spring和redis、MySQL、kafka的整合。
Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 springboot-starter-web 启动器就能拥有 web 的功能,无需其他配置。 -
无代码生成和XML配置
Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring4.x 的核心功能之一。
- 应用监控
springboot给我们提供了actuator的监控功能。当然我们也可以自定义监控端点。
Spring Boot 提供一系列端点可以监控服务及应用,做健康检测。
SpringBoot自动配置的原理?
1.在我们的spring boot 的main方法的启动类上面有一个注解@Springbootapplication,我们点进去这个注解,能后看到他是一个复合注解。里面包含:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
点击查看代码
@ComponentScan,如果我们没有特别指定扫描路径,那么默认就是扫描当前包及其子包。
@SpringBootConfiguration注解点进去之后,他是一个@Configuration注解,也就是说会在我们的BeanFactoryPostProcessor后置处理器中加载它。
2.@EnableAutoConfiguration注解它点进去之后其实也是一个复合注解,有@AutoConfigurationPackage注解(其实啥也没干,主要留给我们进行扩展)和@Import(AutoConfigurationImportSelector.class)导入了一个自动配置类,然后springboot启动类在使用run方法启动的时候,他会进行spring容器的初始化,然后会扫描这个@import注解,会执行这个自动配置类的selectImports()方法,然后会自动加载我们在pom.xml配置文件中starter jar包下面的META-INF/Spring.factories文件中的所有候选的自动配置类(也就是key为EnableAutoConfiguration维护的所有的自动配置类)。
3.因为每个自动配置类都有这种@ConditionalOnXXX的这种注解,最后springboot最后将我们加载到的自动配置类进行去重、排除、过滤处理。
怎么筛选,因为每个自动配置类上面它可能有这种@ConditionnalOnClass这种注解、@ConditionalOnMissingBean这种注解。
springboot启动类,它会调用SpringApplication.run()方法,我们一步一步点进去之后,会看到他底层会调用到我们spring容器初始化的refresh方法中。所以也可以说,一个springboot项目在启动的时候,会进行spring容器的初始化。
什么是Spring Boot Starter?有哪些常用的?
和自动配置一样,Spring Boot Starter的目的也是简化配置,而Spring Boot Starter解决的是依赖管理配置复杂的问题,有了它,当我需要构建一个Web应用程序时,不必再遍历所有的依赖包,一个一个地添加到项目的依赖管理中,而是只需要一个配置spring-boot-starter-web, 同理,如果想引入持久化功能,可以配置spring-boot-starter-data-jpa。
还有像redis kafka mongodb elasticsearch等等。
spring-boot-starter-parent有什么作用?
我们知道,新建一个SpringBoot项目,默认都是有parent的,这个parent就是spring-boot-starter-parent,spring-boot-starter-parent主要有如下作用:
- 定义了Java编译版本
- 使用UTF-8格式编码
- 继承自spring-boor-dependencies,这里面定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号
- 执行打包操作的配置
- 自动化的资源过滤
- 自动化的插件配置
@Import注解的三种用法
1.静态注入,也就是说我们可以直接使用@Import注解导入我们的类,然后吧它注入到spring容器中,当然这种方式相较于@Bean的方式来说,灵活性相对差一点。所以,一般来说,我们不推荐这种方式注入bean。
如果真要用的话,比方说我们引入了启动类所在包之外的包下面的类,这个时候我们可以使用@Import注解。
当然我们也可以使用@ComponentScan注解。
2.实现了我们的ImportSelector接口,并且重写了selectImports()方法,那么我们的返回值就是selectImports()方法的返回类型。
3.实现了lmportBeanDefinitionRegistrar接口,并且实现了registerBeanDefinitions()方法。那么这个时候我们可以自行封装BeanDefinition。
## 说一下springboot比spring多提供了哪些功能
- 简化配置:Spring Boot通过自动配置和“约定优于配置”的原则,极大地简化了项目的配置流程。它使用“starter”依赖项来简化Maven配置,开发者只需添加必要的依赖,Spring Boot会根据类路径中的内容和开发者的配置自动创建所需的Bean和组件12。
- 嵌入式服务器:Spring Boot内置了Tomcat、Jetty、Undertow等服务器,允许应用以Java应用的形式直接运行,无需外部部署。这使得开发者可以直接打包应用程序为一个可执行的JAR或WAR文件,简化了部署过程12。
- 快速启动:Spring Boot使用嵌入式服务器,使得应用程序可以作为一个独立的应用启动,大大缩短了启动时间23。
- 非功能性特性:Spring Boot提供了许多非功能性特性,如生产指标、健康检查和外部化配置等,这些特性使得开发者能够快速地搭建和运行一个高效的Spring项目2。
- 依赖管理:Spring Boot使用“starters”来简化Maven配置,开发者可以快速地添加各种功能和库。例如,spring-boot-starter-web或spring-boot-starter-security等,使得在需要时添加依赖项变得非常容易3。
- 微服务支持:Spring Boot专为构建微服务应用程序而设计,提供了内置web服务器、健康检查和生命周期管理函数等工具和库,特别适合小到中型企业的需求3。
这些功能使得Spring Boot成为开发Java应用的首选框架,特别是在快速开发和部署方面具有显著优势。
说一下springboot打成的jar包里面的启动类叫什么名字呀
JarLanuch,主要调用的是launch方法,通过该方法会调用我们启动类。
说一下springboot怎样实现热部署(面试有被问到)
方式一,在pom.xml配置文件中导入devtools依赖,其实他不是真正意义上的热部署,而是将我们的项目进行了自动重启。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
方式二,使用idea原生自带的热部署功能。
修改两个配置项,update classes and resources
方式三,安装jrebel插件,需要使用jrebel提供的启动方式。
说一下spring boot项目怎样整合mybatis,都需要进行哪些配置
1.在pom.xml配置文件中引入依赖
// 引入mybatis的starter
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis - spring - boot - starter</artifactId>
<version>最新版本号</version>
</dependency>
// 引入数据库的驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql - connector - java</artifactId>
<version>最新版本号</version>
</dependency>
2.在yaml配置文件中进行配置
spring.datasource.url = jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone = UTC&characterEncoding=utf8
spring.datasource.username = 用户名
spring.datasource.password = 密码
spring.datasource.driver - class - name = com.mysql.cj.jdbc.Driver
4.编写mapper接口文件以及对象的xml sql文件
5.在springboot项目的启动类中添加@Mapperscan注解,指定我们要扫描的mapper包路径
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}