当前位置: 首页 > news >正文

Java 面试题--SpringBoot篇

一、什么是 SpringBoot?

Spring Boot 是 Spring 开源组织下的子项目,

是 Spring 组件一站式解决方案,主要是简化

了使用 Spring 的难度,简省了繁重 xml 的配

置,提供了各种启动器,在运行过程中自定

配置,,开发者能快速上手

二、为什么要用 SpringBoot?

① 独立运行

② 简化配置

③ 自动配置

④ 无代码生成和 XML 配置

⑤ 无需部署 war 文件

三、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 的核心配置文件application

bootstrap 配置文件

1. application 配置文件

主要用于 Spring Boot 项目的自动化配置

2. bootstrap 配置文件

有以下几个应用场景:

① 使用 SpringCloudConfig 配置中心时,

   这时需要在 bootstrap 配置文件中添加

   连接到配置中心的配置属性来加载外部

   配置中心的配置信息
② 一些固定的不能被覆盖的属性;
③ 一些加密/解密的场景;

四、SpringBoot 的配置文件有哪几种格式?它们有什么区别?

.properties .yml,它们的区别主要是

写格式不同

1. .properties

app.user.name = javastack

2. .yml

app:user:name: javastack

另外,.yml 格式不支持 @PropertySource

注解导入配置

五、SpringBoot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是 @SpringBootApplication

它也是 SpringBoot 的核心注解

主要组合包含了以下 3 个注解:

@SpringBootConfiguration:组合了

   @Configuration 注解,实现配置文件

   的功能
@EnableAutoConfiguration:打开

  动配置的功能,也可以关闭某个自动配

  置的选项,如关闭数据源自动配置功能:

  @SpringBootApplication(exclude =

  { DataSourceAutoConfiguration.class })
@ComponentScan:Spring 组件扫描

六、开启SpringBoot特性有哪几种方式?

① 继承 spring-boot-starter-parent 项目

② 导入 spring-boot-dependencies 项目依

    赖

七、SpringBoot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat/ Jetty 等容器

八、运行 SpringBoot 有哪几种方式?

① 打包用命令或者放到容器中运行

② 用 Maven/ Gradle 插件运行

③ 直接执行 main 方法运行

九、SpringBoot 自动配置原理是什么?

注解 @EnableAutoConfiguration,,

@Configuration,@ConditionalOnClass

就是自动配置的核心,首先它得是一个配

置文件,其次根据类路径下是否有这个类

去自动配置

Spring Boot 的自动配置注解是

@EnableAutoConfiguration, 从上面的

@Import 的类可以找到下面自动加载自动

配置的映射

 org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Class<?>, ClassLoader)
public static List<String> loadFactoryNames(Class<?> factoryClass, 
ClassLoader classLoader) {String factoryClassName = factoryClass.getName();try {Enumeration<URL> urls = (classLoader != null ? 
classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
lassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));List<String> result = new ArrayList<String>();while (urls.hasMoreElements()) {URL url = urls.nextElement();Properties properties = PropertiesLoaderUtils.loadProperties(
new UrlResource(url));String factoryClassNames = properties.getProperty(factoryClassName);result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(
factoryClassNames)));}return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);}
}

这个方法会加载类路径及所有jar包下META-INF/spring.factories配置中映射的自动配置的类。

/**
* The location to look for factories.
* <p>Can be present in multiple JAR files.
*/
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
查看Spring Boot自带的自动配置的包: spring-boot-autoconfigure-1.5.6.RELEASE.jar,
打开其中的META-INF/spring.factories文件会找到自动配置的映射org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
...

再来看看数据源自动配置的实现注解

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration {
...
@Configuration,@ConditionalOnClass就是自动配置的核心,首先它得是一个配置文件,其次根据类

十、如何理解 SpringBoot 中的 Starters?

Starters 可以理解为启动器,它包含了一

系列可以集成到应用里面的依赖包,你可

以一站式集成 Spring 及其他技术,而不

需要到处找示例代码和依赖包

如果想使用 Spring JPA 访问数据库,只

要加入 spring-boot-starter-data-jpa 启动

器依赖就能使用了

 

http://www.lryc.cn/news/134337.html

相关文章:

  • GitKraken 详细图文教程
  • ubuntu20.04 root用户下使用中文输入法——root用户pycharm无法用中文输入法问题
  • FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】
  • 嵌入式蓝海变红海?其实是大浪淘沙!
  • 【附安装包】Solid Edge2023安装教程最强CAD选择
  • 494. 目标和
  • C++学习笔记总结练习:C++编译过程详解
  • 嵌入式设备应用开发(qt界面开发)
  • pytest结合Excel实现接口自动化
  • 【LLM数据篇】预训练数据集+指令生成sft数据集
  • WebDAV之π-Disk派盘 + 一羽记帐
  • ChatGPT:记一次超复杂的KVM桌面系统连接问答记录
  • python-docx把dataframe表格添加到word文件中
  • Web AP—BOM 浏览器对象模型
  • Flink分流,合流,状态,checkpoint和精准一次笔记
  • c# 实现sql查询DataTable数据集 对接SqlSugar ORM
  • 记一次布尔盲注漏洞的挖掘与分析
  • C++11 新特性 ---- noexcept
  • 《Linux运维总结:Centos7.6之OpenSSH7.4p1升级版本至9.4p1》
  • 七夕节日表白:七大网页风格与其适用人群
  • 通达信指标公式16:使用BARSLAST函数写一个指标回测的思路
  • Jenkins自动化部署Vue项目
  • Android JNI打印logcat日志
  • 第28次CCF计算机软件能力认证(测试)
  • 九耶丨阁瑞钛伦特-Java高频面试题-请谈谈 ReadWriteLock 和 StampedLock
  • 【Linux操作系统】深入探索Linux系统编程中的信号集操作函数
  • [C初阶笔记]P2
  • C++并发编程学习01——hello concurrent world
  • 大数据扫盲(2): 数据分析BI与ETL的紧密关系——ETL是成功BI的先决条件
  • Java web 中的 jsp