【面試題-2】SpringBoot啟動過程


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包中的自動配置類加到容器中並進行實例化,完成自動裝配。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM