SpringBoot(牛客面试题补充)
根据牛客面试指南Java工程师模块问题进行整理和细微补充,仅供参考,不合理地方请评论区指出共勉
1.说说你对Spring Boot的理解
从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。Spring Boot使用“习惯优于配置”的理念让你的项目快速地运行起来,使用Spring Boot很容易创建一个能独立运行、准生产级别、基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。
简而言之,Spring Boot本身并不提供Spring的核心功能,而是作为Spring的脚手架框架,以达到快速构建项目、预置三方配置、开箱即用的目的。Spring Boot有如下的优点:
- 可以快速构建项目;
- 可以对主流开发框架的无配置集成;
- 项目可独立运行,无需外部依赖Servlet容器;
- 提供运行时的应用监控;
- 可以极大地提高开发、部署效率;
- 可以与云计算天然集成。
2.Spring Boot Starter有什么用?
Spring Boot Starter简化了Spring Boot应用程序的依赖性管理,并提供了快速启动应用程序所需的所有依赖关系的打包方式。
在Spring Boot项目开发中,我们可以参考Spring Boot Starter组织的maven工程来进行依赖的引入。
Spring Boot Starter是一个依赖模块化的Spring Boot库,意为启用一组特定的依赖项。在Spring Boot中,Starter包实际上是提供了一组预定义依赖关系的预定义配置文件。
它为一组特定任务配置Spring应用程序,如使用Spring MVC时管理REST端点,或使用Spring JPA时配置数据库JNDI制造商。
Starter被设计用于更快地构建和配置Spring Boot项目。
对于Spring Boot应用程序,大多数组件都是在Spring应用程序上下文中启动的,这需要很多依赖管理工作。Spring Boot Starter通过将所有必需的依赖项汇集到特定项目中来极大地简化了依赖关系的管理。它可用于Spring Boot应用程序的所有方面,包括Spring Boot开发,如Web应用程序开发,数据访问等。
Spring Boot Starter的默认集合,是按模块化的方式来设计的。也就是说,每个Starter都包含一组为实现一项特定任务必需的依赖关系。这样就能通过添加特定的Starter,来启用Spring Boot,自动获取一个或多个开箱即用的模块。
Spring Boot Starter使Spring Boot更加易于开发和配置。不同的Starter集合具有不同的特性,可用于各种用例,如Web应用程序、数据访问等。在Spring Boot项目中,正确使用Starter是成功的关键之一。
3.介绍Spring Boot的启动流程
原文链接
构造SpringApplection的实例过程主要干了下面几件事:
- 把参数sources设置到SpringApplection属性中,这个sources可以是任何类型的参数;
- 获取应用类型,判断是否是web程序,并设置到webEnvironment的boolean属性中;
- 创建并初始化ApplectionInitializer(初始化器),设置到initializers属性中;
- 创建并初始化ApplicationListener(初监听器),设置到listeners属性中;
- 初始化主类mainApplectionClass,定位main方法。
SpringBoot在执行run方法主要做了以下操作:
- 获取监听器和参数配置;
- 打印Banner信息;
- 创建并初始化容器;
- 监听器发送通知。
--------------------------------创建springbootApplication对象---------------------------------------------
1. 创建springbootApplication对象springboot容器初始化操作
2. 获取当前应用的启动类型。
2.1:通过判断当前classpath是否加载servlet类,返回servlet web启动方式。
2.2:webApplicationType三种类型:
1.reactive:响应式启动(spring5新特性)
2.none:即不嵌入web容器启动(springboot放在外部服务器运行 )
3.servlet:基于web容器进行启动
3. 读取springboot下的META-INFO/spring.factories文件,获取对应的ApplicationContextInitializer装配到集合
4. 读取springboot下的META-INFO/spring.factories文件,获取对应的ApplicationListener装配到集合
5. mainApplicationClass,获取当前运行的主函数
------------------调用springbootApplication对象的run方法,实现启动,返回当前容器的上下文-------------------------------
1. 调用run方法启动
2. StopWatch stopWatch = new StopWatch(),记录项目启动时间
3. getRunListeners,读取META-INF/spring.factores,将SpringApplicationRunListeners类型存到集合中
4. listeners.starting();循环调用starting方法
5. prepareEnvironment(listeners, applicationArguments);将配置文件读取到容器中
读取多数据源:classpath:/,classpath:/config/,file:./,file:./config/底下。其中classpath是读取编译后的,file是读取编译前的
支持yml,yaml,xml,properties
6. Banner printedBanner = printBanner(environment);开始打印banner图,就是springboot启动最开头的图案
7. 初始化AnnotationConfigServletWebServerApplicationContext对象
8. 刷新上下文,调用注解,refreshContext(context);
9. 创建tomcat
10. 加载springmvc
11. 刷新后的方法,空方法,给用户自定义重写afterRefresh()
12. stopWatch.stop();结束计时
13. 使用广播和回调机制告诉监听者springboot容器已经启动化成功,listeners.started(context);
14. 使用广播和回调机制告诉监听者springboot容器已经启动化成功, listeners.running(context);
15. 返回上下文
4.Spring Boot项目是如何导入包的?
通过Spring Boot Starter导入包。
Spring Boot通过提供众多起步依赖(Starter)降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model, POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或某类功能。
5.请描述Spring Boot自动装配的过程
参考文章
使用Spring Boot时,我们只需引入对应的Starters,Spring Boot启动时便会自动加载相关依赖,配置相应的初始化参数,以最快捷、简单的形式对第三方软件进行集成,这便是Spring Boot的自动配置功能。Spring Boot实现该运作机制锁涉及的核心部分如下图所示:
整个自动装配的过程是:
- Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各种AutoConfiguration类;
- 当某个AutoConfiguration类满足其注解@Conditional指定的生效条件(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该AutoConfiguration类中定义的Bean(组件等);
- 并注入Spring容器,就可以完成依赖框架的自动配置。
6.说说你对Spring Boot注解的了解
参考文章
@SpringBootApplication注解:
在Spring Boot入口类中,唯一的一个注解就是@SpringBootApplication。它是Spring Boot项目的核心注解,用于开启自动配置,准确说是通过该注解内组合的@EnableAutoConfiguration开启了自动配置。
@EnableAutoConfiguration注解:
@EnableAutoConfiguration的主要功能是启动Spring应用程序上下文时进行自动配置,它会尝试猜测并配置项目可能需要的Bean。自动配置通常是基于项目classpath中引入的类和已定义的Bean来实现的。在此过程中,被自动配置的组件来自项目自身和项目依赖的jar包中。
@Import注解:
@EnableAutoConfiguration的关键功能是通过@Import注解导入的ImportSelector来完成的。从源代码得知@Import(AutoConfigurationImportSelector.class)是@EnableAutoConfiguration注解的组成部分,也是自动配置功能的核心实现者。
@Conditional注解:
@Conditional注解是由Spring 4.0版本引入的新特性,可根据是否满足指定的条件来决定是否进行Bean的实例化及装配,比如,设定当类路径下包含某个jar包的时候才会对注解的类进行实例化操作。总之,就是根据一些特定条件来控制Bean实例化的行为。
@Conditional衍生注解:
在Spring Boot的autoconfigure项目中提供了各类基于@Conditional注解的衍生注解,它们适用不同的场景并提供了不同的功能。通过阅读这些注解的源码,你会发现它们其实都组合了@Conditional注解,不同之处是它们在注解中指定的条件(Condition)不同。
- @ConditionalOnBean:在容器中有指定Bean的条件下。
- @ConditionalOnClass:在classpath类路径下有指定类的条件下。
- @ConditionalOnCloudPlatform:当指定的云平台处于active状态时。
- @ConditionalOnExpression:基于SpEL表达式的条件判断。
- @ConditionalOnJava:基于JVM版本作为判断条件。
- @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置。
- @ConditionalOnMissingBean:当容器里没有指定Bean的条件时。
- @ConditionalOnMissingClass:当类路径下没有指定类的条件时。
- @ConditionalOnNotWebApplication:在项目不是一个Web项目的条件下。
- @ConditionalOnProperty:在指定的属性有指定值的条件下。
- @ConditionalOnResource:类路径是否有指定的值。
- @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个或者有多个但是指定了首选的Bean时。
- @ConditionalOnWebApplication:在项目是一个Web项目的条件下。