美文网首页
【Spring Boot相关】@SpringBootApplic

【Spring Boot相关】@SpringBootApplic

作者: 伊丽莎白2015 | 来源:发表于2022-09-24 16:56 被阅读0次

介绍

@SpringBootApplication注解,会激活3个注解:

  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan annotations

本文的主要内容导图:


@SpringBootApplication

注解-1:@Configuration

Spring Boot @SpringBootApplication主要的注解:

image.png

@SpringBootApplication的自身定义,可以看到它上面的注解,其中一个为:@SpringBootConfiguration

image.png

@SpringBootConfiguration的定义,可以看到它的其中一个注解即为@Configuration

image.png

注解-2:@EnableAutoConfiguration

@SpringBootApplication的自身定义,可以看到除了上述介绍的@SpringBootConfiguration外,还有@EnableAutoConfiguration

image.png
配置类:AutoConfigurationImportSelector

从注解的名字可以看出,它激动了auto-configuration的相关配置。
@EnableAutoConfiguration自身的定义,看到import了一个重要的类,叫AutoConfigurationImportSelector

image.png

AutoConfigurationImportSelector类中,有内部类,其中一个内部类为:AutoConfigurationGroup

image.png

这个内部static类实现了接口DeferredImportSelector的内部接口:Group

image.png

这个接口有两个方法:

  • void process(AnnotationMetadata metadata, DeferredImportSelector selector);
  • Iterable<Entry> selectImports();

所以我们回到内部static类DeferredImportSelector,重点看上述两个方法,先看process方法:

image.png

process方法内 --> getAutoConfigurationEntry(annotationMetadata)

image.png
2.1 通过SpringFactoriesLoader加载META-INF/spring.factories

getAutoConfigurationEntry(annotationMetadata)中,
--> 调用了:getCandidateConfigurations(annotationMetadata, attributes)
--> SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())
这里有个重要的类,即【SpringFactoriesLoader】,在这个类中,主要加载了包中的文件:META-INF/spring.factories

Enumeration<URL> urls = classLoader.getResources("META-INF/spring.factories");

这里的META-INF/spring.factories并不是指特定某个jar包中的,而是会扫描所有依赖包中的,比如我自定义了一个starter,我就可以在自己的starter的resources下定义该文件:

image.png

文件内容,只需要指定我们的autoconfig类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.test.autoconfigure.UserAutoConfiguration

我们在另一个项目中引入这个自定义的starter,然后debug上述的getAutoConfigurationEntry方法:

image.png
2.2 通过AutoConfigurationMetadataLoader加载META-INF/spring-autoconfigure-metadata.properties

上述的getAutoConfigurationEntry(annotationMetadata)方法中,除了#2.1的内容外,再看方法中另一个调用:【getConfigurationClassFilter()】:

image.png

通过getConfigurationClassFilter()
--> new ConfigurationClassFilter(this.beanClassLoader, filters)
--> AutoConfigurationMetadataLoader.loadMetadata(classLoader)
最终到了【AutoConfigurationMetadataLoader】类:

image.png

从META-INF中,读取了文件:spring-autoconfigure-metadata.properties

当前包是哪个呢?
即配置类AutoConfigurationMetadataLoader所在的包,即spring-boot-autoconfigure-2.7.0.jar

image.png 该文件定义了很多需要被Import进来的类: image.png

当前包是哪个呢?
本章配置类AutoConfigurationMetadataLoader所在的包,即spring-boot-autoconfigure-2.7.0.jar

image.png

注解-3:@ComponentScan

image.png

@SpringBootApplication的定义中,除了配置1、2外,第3个配置就比较熟悉了。从Spring 3.1开始就有的一个注解,即自动包扫描功能,会自动扫描包路径下面的所有被@Controller、@Service、@Repository、@Component 注解标识的类,然后装配到Spring容器中。

可以看到在@SpringBootApplication中,会把上述配置2,自动加载进来的class给排除掉:

image.png

@ComponentScan默认的包路径为@SpringBootApplication注解修饰的类所在的package。

相关文章

网友评论

      本文标题:【Spring Boot相关】@SpringBootApplic

      本文链接:https://www.haomeiwen.com/subject/oxtoortx.html