SpringBoot面试精选(一)

前言

日更SpringBoot相关面试题,每日两题

问题①:

问题描述

SpringBoot的自动装配原理是什么?

问题难度及重要程度

只要问到SpringBoot相关的知识,这类问题总是避不开的,比如Spring、SpringBoot、SpringMVC三者的区别与联系呀SpringBoot的IOC、AOP机制,实现原理,实现方式,为什么要实现等等。这类问题都是高频面试点,而自动装配是SpringBoot区别与Spring框架的一大亮点。因此这个问题还是挺重要的

答案

1、启动SpringBoot的自动装配功能

SpringBoot项目中,SpringBootApplication注解标记了该文件时SpringBoot的启动类

package com.example;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.mapper")
public class MallApplication {

	public static void main(String[] args) {
		SpringApplication.run(MallApplication.class, args);
	}

}

而在SpringBootApplication注解中又引入了SpringBootConfiguration注解,该注解是负责启动自动装配功能的注解

image-20230620105916831

2、SpringBoot的自动装配核心是通过Spring Framework提供的@EnableAutoConfiguration注解实现的

image-20230620110421799

当应用添加了@EnableAutoConfiguration注解,这个注解就会引入一个@Import注解

image-20230620110736974

这个@Import注解会导入一个deferredImportSelector组件(即延迟导入选择器)他会使SpringBoot的自动配置类的顺序在最后,这样可以方便我们扩展和覆盖

image-20230620141613673

3、然后他会读取所有的/META-INF/spring.factories文件,这个文件中定义了多个自动装配类,SpringBoot会根据自动装配类的条件来装配默认的组件的Bean

4、过滤出所有AutoConfigurationClass类型的类

5、通过@ConditionalOnXXX排除无效的装配类

问题②

问题描述

SpringBoot的jar包可以直接运行

问题难度及重要程度

一般的jar包都不能通过java -jar XXXX.jar的形式启动,但是SpringBoot就可以,很多人都知道这一点,但是他们的原理却不是很了解,

答案

1、SpringBoot提供了一个插件spring-boot-maven-plugin用于将程序打包成一个可执行的jar包

<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

2、SpringBoot打包后会生成一个FatJar包(即jar包中还包含jar包),其中包含依赖的jar和Spring Boot loader相关的类

3、使用java -jar XXXX.jar命令启动jar包,JVM(Java虚拟机)首先会找到jar包中的META-INF下的MANIFEST文件,MANIFEST文章中记录了jar包真正的启动类(Main-Class:org.springframework.boot.loader.JarLanucher

META-INF/MANIFEST.MF文件包含了许多与jar包相关的属性和信息,比如jar包的名称、版本、作者信息等等。其中,最重要的属性之一是Main-Class,它指定了jar包的启动类。

值得注意的是,如果Main-Class属性不存在或者没有指定正确的启动类,JVM将无法启动该jar包,并抛出no main manifest attribute的异常。因此,确保Main-Class属性被正确地设置是非常重要的。

Main-Class属性不存在或者没有指定正确的启动类,JVM将无法启动该jar包,并抛出no main manifest attribute的异常。因此,确保Main-Class`属性被正确地设置是非常重要的。

4、FatJar的启动Main函数是JarLancer,他负责创建一个LanuchedURLClassLoader来加载boot-lib下的jar,并以一个新的线程启动应用的启动类Main函数(即MANIFEST文件中的Start-Class:)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深藏bulu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值