一、SpringBoot启动原理(了解即可)?
Spring Boot的启动原理主要依赖于@SpringBootApplication注解以及Spring Boot的自动配置机制,以下是详细的解释:
1、@SpringBootApplication注解:
★ @SpringBootApplication是Spring Boot的核心注解,它实际上是三个注解的组合:@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。
@SpringBootConfiguration继承自@Configuration,表明该类是一个配置类,可以用来声明Bean。
★ @EnableAutoConfiguration是开启自动配置的关键。Spring Boot会根据当前项目类路径下的jar包依赖情况,结合Spring.factories文件中的配置信息,进行自动配置,创建对应的Bean。
★ @ComponentScan默认会扫描当前包及其子包下所有标注了@Component、@Service、@Repository或@Controller等注解的类,并将它们作为Bean加入到IoC容器中。
2、Spring Boot启动过程:
当我们运行带有@SpringBootApplication注解的主类时,实际上就是在运行一个Spring Boot应用。
Spring Boot会使用Spring框架的ApplicationContext加载器来创建并初始化ApplicationContext,这个过程中会执行一系列的Bean的创建、初始化、依赖注入等工作。
在初始化过程中,Spring Boot会读取META-INF/spring.factories文件,根据其中的EnableAutoConfiguration列表,启用对应的所有自动配置类,这些自动配置类会进一步注册各种所需的Bean到容器中。
同时,通过@ComponentScan注解完成对业务组件的扫描和加载,形成完整的Spring IoC容器。
3、引导程序(SpringApplication.run()):
最终,调用SpringApplication的run方法启动Spring Boot应用。run方法内部完成了对环境变量的初始化、ApplicationContext的创建、监听器的注册等一系列操作,最后启动Spring Boot应用。
总结来说,Spring Boot通过@SpringBootApplication注解及其包含的元注解,配合Spring Boot的自动配置特性,实现了简洁高效的启动流程,使得开发者能够快速地构建出独立运行、准生产级别的基于Spring的应用程序。
二、Spring和SpringBoot的关系?
Spring和Spring Boot是Java开发框架中的两种重要技术,它们之间的关系可以这样理解:
1、Spring Framework(简称Spring):
Spring是一个开源的轻量级Java开发框架,它通过提供IoC(控制反转)、AOP(面向切面编程)、DI(依赖注入)等机制,极大地简化了企业级应用的开发。
Spring的主要目标是解决企业级应用开发的复杂性问题,提供了一套全面的编程和配置模型来支持几乎任何类型的Java应用。
2、Spring Boot:
Spring Boot是基于Spring框架之上构建的一种快速应用开发框架,它对Spring平台及第三方库进行了一站式整合,并提供了默认配置来简化项目的搭建和开发过程。
Spring Boot的核心理念是:“约定优于配置”,它自动配置了大量Spring组件,无需手动编写大量的XML配置文件,开发者只需很少的配置就可以快速启动一个Spring应用。
Spring Boot还内置了Tomcat、Jetty等Web容器,允许开发人员以jar包的形式直接运行应用,大大简化了部署流程。
总结来说,Spring Boot并不是替代Spring,而是Spring生态体系下的一个项目,旨在简化Spring应用的初始搭建以及开发过程,让开发者能更快地投入到业务逻辑开发中去。在Spring Boot中,你可以无侵入地使用所有Spring的功能和服务。
三、Spring Boot 的优点(面试时至少说三条) ?
Spring Boot具有以下主要优点:
1、简化配置:
Spring Boot通过提供默认配置,使得开发人员无需编写大量的XML配置文件。它遵循“约定优于配置”的原则,自动配置了Spring框架以及第三方库的依赖关系,开发者只需要添加少量的配置属性就能完成应用的搭建。
2、快速启动:
Spring Boot内嵌了Tomcat、Jetty等Web容器,允许开发者将应用打成一个可执行的jar包,直接通过java -jar命令就可以运行应用,大大简化了部署和启动流程。
3、一站式解决方案:
Spring Boot整合了许多常用的第三方库,如数据库连接池(HikariCP、Druid等)、模板引擎(Thymeleaf、FreeMarker等)、安全框架(Spring Security)、消息队列(RabbitMQ、Kafka等),开发者可以直接在项目中引用相关starter POM,而无需关注底层集成细节。
4、健康检查与监控:
Spring Boot Actuator模块提供了丰富的端点来监控应用的状态信息,包括但不限于健康检查、环境信息、审计、metrics统计等,方便运维管理和故障排查。
5、零XML配置:
Spring Boot鼓励使用Java注解进行配置,使得代码更清晰易读,同时也避免了XML配置容易出错的问题。
6、强大的CLI工具:
Spring Boot CLI提供了命令行接口,可以快速地创建新项目或者测试Groovy脚本,极大地提高了开发效率。
7、易于测试:
Spring Boot集成了Spring Test模块,为开发者提供了方便快捷的单元测试和集成测试支持。
8、生产就绪:
Spring Boot应用可以很轻松地被部署到各种环境中,无论是传统的服务器,还是云环境,甚至是Docker容器,都具备很好的兼容性和便捷性。
四、SpringBoot中的常用注解(面试时至少说说四个)?
Spring Boot中包含了许多注解,用于简化配置和增强功能。以下是一些常用的注解:
-
@SpringBootApplication
- 这是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。
- 它标记在一个类上,表明该类是Spring Boot应用的主入口,负责启动并配置整个应用程序。
-
@SpringBootConfiguration
- 表示这是一个Spring配置类,等同于@Configuration注解。
-
@EnableAutoConfiguration
- 用于启用自动配置特性,根据项目依赖的jar包来自动配置Bean。
-
@ComponentScan
- 自动扫描指定包及其子包下的所有带有@Service, @Repository, @Component或@Controller注解的类,并将它们作为Bean加入到IoC容器中。
-
@RestController
- 标记在控制类上,表示这个类是RESTful Web服务的控制器,它会自动将方法返回的对象转换为JSON格式响应。
-
@RequestMapping / @GetMapping / @PostMapping 等
- 用于处理HTTP请求映射,定义控制器的方法如何响应特定的URL请求。
-
@Autowired
- Spring框架的依赖注入注解,Spring容器会自动将匹配的Bean注入到被该注解标记的字段或构造函数中。
-
@Value
- 用于读取属性文件中的值,注入到字段或方法参数中。
-
@ConfigurationProperties
- 用于绑定外部配置(如application.properties或YAML文件)到Bean的属性上。
-
@Bean
- 在配置类中声明一个Bean对象的方法上使用,告诉Spring这个方法将会返回一个对象,该对象要注册到Spring IoC容器中。
-
@ConditionalOn...
- 这一系列注解基于条件进行Bean的加载,例如:@ConditionalOnClass、@ConditionalOnMissingBean等。
-
@Profile
- 用于激活特定环境下的配置类或Bean,可以根据不同的环境切换不同的配置。
以上只列举了部分常见的Spring Boot注解,实际开发过程中还有很多其他注解根据具体场景使用。
五、SpringBoot启动时做了哪些事情?
Spring Boot启动时主要做了以下事情:
-
初始化SpringApplication对象:
- 创建SpringApplication实例,这是Spring Boot应用的入口点。
-
加载和解析配置文件:
- 加载application.properties或application.yml等配置文件,将其中的属性转换为Java对象,并存入Spring Environment中。
-
创建并准备ApplicationContext:
- 根据@SpringBootApplication注解中的@EnableAutoConfiguration启用自动配置,根据类路径扫描、jar包依赖和默认配置信息来创建Bean定义。
- 使用SpringApplication.run()方法创建并初始化一个合适的ApplicationContext(通常是AnnotationConfigServletWebServerApplicationContext)。
-
组件扫描:
- 根据@ComponentScan注解或者默认规则对指定包及其子包进行扫描,查找并注册带有@Component、@Service、@Repository、@Controller等注解的类为Spring Bean。
-
自动配置:
- Spring Boot会分析当前环境中已有的类路径和Bean定义,基于约定优于配置的原则,自动配置所需的Bean。例如,如果发现HSQLDB在类路径中,则自动配置内嵌数据库;如果检测到Redis客户端库,则自动配置RedisTemplate等。
-
监听器和事件发布:
- 在初始化过程中触发一些特定的Spring事件,如ApplicationEnvironmentPreparedEvent、ApplicationContextInitializedEvent、ApplicationPreparedEvent等,相关的监听器可以在此阶段执行特定操作。
-
启动嵌入式Web容器:
- 如果项目包含Web相关依赖,如Spring Web MVC,Spring Boot会自动配置并启动一个嵌入式的Servlet容器(如Tomcat、Jetty等),并且暴露服务端口。
-
执行CommandLineRunner或ApplicationRunner接口实现类:
- 应用启动完成后,如果存在实现了CommandLineRunner或ApplicationRunner接口的Bean,Spring Boot会调用它们的run方法,通常用于应用启动后的一些初始化操作。
通过这一系列过程,Spring Boot成功地简化了传统Spring应用的搭建和配置工作,使得开发者能够快速启动和运行一个Spring应用。