前言
日更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
注解,该注解是负责启动自动装配功能的注解
2、SpringBoot
的自动装配核心是通过Spring Framework提供的@EnableAutoConfiguration
注解实现的
当应用添加了@EnableAutoConfiguration
注解,这个注解就会引入一个@Import
注解
这个@Import
注解会导入一个deferredImportSelector
组件(即延迟导入选择器)他会使SpringBoot
的自动配置类的顺序在最后,这样可以方便我们扩展和覆盖
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:)