面试题-2SpringBoot启动过程

Posted LeeBoom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题-2SpringBoot启动过程相关的知识,希望对你有一定的参考价值。

SpringBoot 启动类中的1个核心注解

@SpringBootApplication

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;

@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 {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

可以看到一个@SpringBootApplication注解里已经包含了1.@SpringBootConfiguration 该注解主要是将当前类作为一个JavaConfig本质上和普通的@Configuration没有区别
2.@ComponentScan,该注解会用于扫描Spring对应的组件,如果里面不设置值,则会默认从所在类的package进行扫描。所以一般启动类都放在根package下
3.@EnableAutoConfiguration,该注解标识可以自动配置,把所有符合自动配置条件的Bean定义加载到IOC容器

SpringBoot启动流程

1.当我们启动SpringBoot的时候,先动用启动类中的静态run方法


2.run方法中最重要的两个环节
a.创建 ApplicationContext容器
b.刷新 ApplicationContext容器
3.在刷新容器的时候会去解析启动类,而启动类的注解使用的是@SpringBootApplication,这是一个复合注解,里面包含了@ComponentScan,@EnableAutoConfiguration,@SpringBootConfiguration 这三个注解
4.三个注解中,@EnableAutoConfiguration会开启自动配置,同时会去依赖的包中寻找spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。
5.将jar包中的自动配置类加到容器中并进行实例化,完成自动装配。

以上是关于面试题-2SpringBoot启动过程的主要内容,如果未能解决你的问题,请参考以下文章

Java工程师面试题,二级java刷题软件

启动和内核管理-面试题

面试题打卡——第十天

Java进阶之光!2021必看-Java高级面试题总结

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

第十次JAVA实习生面试题打卡