我把所有Java相关的面试题和答案都整理成了PDF,并且带书签目录,阅读起来非常方便
面试题及答案PDF下载:https://www.hicxy.com/?p=2645
面试题及答案PDF下载:https://www.hicxy.com/?p=2645
面试题及答案PDF下载:https://www.hicxy.com/?p=2645
1. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration: 组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration: 打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
**@ComponentScan: **Spring组件扫描。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
2. 什么是YAML?
YAML是一种人类可读的数据序列化语言。它通常用于配置文件。 与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。
3. 运行 Spring Boot 有哪几种方式?
**1、**打包用命令或者放到容器中运行
**2、**用 Maven/ Gradle 插件运行
**3、**直接执行 main 方法运行
4. springboot自动配置的原理
只要使用了@EnableAutoConfiguration
注解就能实现自动配置。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration
@Import(AutoConfigurationImportSelector.class)
这个是自动配置的关键,它完成了自动配置的主要逻辑。 下面是代码的主要片段
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
// 获取配置的元数据
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
// 这个方法包含了加载的主要逻辑,它能找到所有自动注入的类
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
autoConfigurationMetadata, annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
下面来看getAutoConfigurationEntry
的主要逻辑
protected AutoConfigurationEntry getAutoConfigurationEntry(
AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata) {
// ....
// 获取候选配置类
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
// ... 过滤、去重、排除一些配置类
return new AutoConfigurationEntry(configurations, exclusions);
}
SpringFactoriesLoader
是spring提供的一个扩展机制,它能加载模块下的META-INF/sring.factories
文件,这个Properties格式的文件中的key是接口、注解、或抽象类的全名,value是以逗号“,"分隔的实现类。SpringFactoriesLoader能将相应的实现类注入Spirng容器中。
查看一下spring-boot-autoconfigure模块下的META-INF/spring.factories
文件
...
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
...
就可以看出来它加载哪些自动配置类;通过这个机制我们可以自己写自动配置类并且在模块下的META-INF/spring.factories
文件中写入
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.yuan.interview.springboot.XXXAutoConfiguration
这样直接引入我们的模块就会加载org.yuan.interview.springboot.XXXAutoConfiguration
配置类了。
5. spring-boot-starter-parent 有什么用 ?
我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
定义了 Java 编译版本为 1.8 。
使用 UTF-8 格式编码。
继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
执行打包操作的配置。
自动化的资源过滤。
自动化的插件配置。
针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。
后面的问题,大家可以先自己独立思考一下。
另外我把所有Java相关的面试题和答案都整理出来了,给大家参考一下
面试题及答案PDF下载:https://www.hicxy.com/?p=2645
面试题及答案PDF下载:https://www.hicxy.com/?p=2645
面试题及答案PDF下载:https://www.hicxy.com/?p=2645