认识 SpringBootApplication 注解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了认识 SpringBootApplication 注解相关的知识,希望对你有一定的参考价值。

参考技术A

这篇文章不谈论具体背后的工作原理,只是先认识根 @SpringBootApplication 注解相关的其他几个注解,以及带来的作用。先把地基打好,才能建高楼大厦。

@Import 注解表示可以导入一个或多个 @Configuration 类。它提供的功能等同于以前的 Spring xml 配置中的 标签, 可以导入 @Configuration 类、ImportSelector 和 ImportBeanDefinitionRegistrar 的实现类 ,以及普通的组件类。如果 XML 或其他非 @Configuration 注解定义的 bean 资源需要被导入,可以使用 @ImportResource 注解。

它的作用是在处理 @Configuration 时,注册额外的 bean definition。

开启 Spring 应用上下文的自动配置功能,它试图猜测你可能需要配置的 bean 信息。

表示包含该注解的类所在的包应该在 AutoConfigurationPackages 中注册。所以这个注解就能够解释为什么 spring boot 的启动类要放在 package 的最外层,以保证 spring 能够自动扫描到它们。

它的实现原理是在注解上标注了 @Import,导入了一个 AutoConfigurationPackages.Registrar 类。

用于保存导入的配置类所在的包及子包。它实现了 ImportBeanDefinitionRegistrar 接口。注意下,Registrar 类是 AutoConfigurationPackages 类的内部类,同上面的注解 @AutoConfigurationPackage 名字就差了一个字母,千万别搞混了。

DeferredImportSelector 类用于处理自动配置。如果需要自定义扩展 @EnableAutoConfiguration,那么也可以扩展此类。

DeferredImportSelector 接口是 ImportSelector 接口的一种扩展,它是在处理完所有 @Configuration 类型的 bean 之后才会被执行,因此,它的执行时机是在 @Configuration 注解中的其他逻辑被处理完毕之后(包括对 @ImportResource、@Bean 这些注解的处理)再执行,也就是说,DeferredImportSelector 的执行时机比 ImportSelector 更晚。

DeferredImportSelector 接口在处理有条件的选择导入时非常有用。

@SpringBootApplication注解的理解

  • @SpringBootApplication

废话不多说,我们直接贴出来SpringBoot的官方给出的源码:
package org.springframework.boot.autoconfigure;
@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 {

}

可以分为这两类:
第一类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited

第二类
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

第一类我们忽略,直接看第二类
下面是每一类的源码:

@SpringBootConfiguration

package org.springframework.boot;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

@EnableAutoConfiguration

package org.springframework.boot.autoconfigure;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

}

@ComponentScan

 

package org.springframework.context.annotation;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
}


于此得出@SpringBootApplication由@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan组成。

我们来看看官方https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/api/    API是怎么解释的

 

@SpringBootApplication  注解在 这个包目录下 org.springframework.boot.autoconfigure;

 

重点就是这句话“Indicates a configuration class that declares one or more @Bean methods and also triggers auto-configuration and component scanning. This is a convenience annotation that is equivalent to declaring @Configuration@EnableAutoConfiguration and @ComponentScan.”

我们翻一下:

指示一个配置类,该类声明一个或多个@Bean方法,并且还触发自动配置和组件扫描。这是一个方便注释,等效于声明@ Configuration,@ EnableAutoConfiguration和@ComponentScan。

从中我们可以明确的知道@SpringBootApplication==@Configuration+@EnableAutoConfiguration+@ComponentScan

2020-04-25 00:12:18

 

 

 

 

 

 

 

 

 

 

 

 

 









以上是关于认识 SpringBootApplication 注解的主要内容,如果未能解决你的问题,请参考以下文章

使用idea引入注解@SpringBootApplication报错Cannot resolve symbol 'SpringBootApplication'

Spring编程:springboot @SpringBootApplication注解

Spring 将属性文件中的值读入 @SpringBootApplication 类

使用@SpringBootApplication注解

@SpringBootApplication注解

什么是 SpringBootApplication 功能?