如何正确的使用@SpringBootApplication注解

  介绍

如何正确的使用@SpringBootApplication注解?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

对SpringBoot工程的自动配置很感兴趣,于是学习其源码并整理了其中一些内容,如果有错误请大家指正~话不多说,直接上源码;

@SpringBootApplication注解的源码如下:

@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  {   …   }

可以看到这是一个复合注解,一共包括7个不同的注,解下面对这7个不同的注解进行分析。

2.1注解

2.1.1注解1:@Target ({ElementType.TYPE})

用来表示注解作用范围,类型表示作用范围为类或接口。

如何正确的使用@SpringBootApplication注解

2.1.2注解2:@Retention (RetentionPolicy.RUNTIME)

如何正确的使用@SpringBootApplication注解

2.1.3注解3:@Documented

表明这个注释是由javadoc记录的。

2.1.4注解4:@Inherited

放在注解上,当父类加了@SpringBootApplication注解时,子类也会继承这个注解(对接口的实现类无效)。

2.1.5注解5:@SpringBootConfiguration

底层仍是@ configuration注解,源码如下:

@Target (ElementType.TYPE)   @Retention (RetentionPolicy.RUNTIME)   @Documented   @ configuration   public  @interface  SpringBootConfiguration  {   }
2.1.6注解6:@ComponetScan

@ComponentScan这个注解在春天中很重要,它对XML应配置中的元素@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@ @ component和等)或者豆定义,最终将这些豆定义加载到国际奥委会容器中。

可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认春天框架实现会从声明@ComponentScan所在类的包进行扫描。所以SpringBoot的启动类最好是放在根包下,因为默认不指定basePackages .

2.2注解:@EnableAutoConfiguration

个人感觉@EnableAutoConfiguration这个注释最为重要它的作用可以概括为:借助@ import的帮助,将所有符合自动配置条件的bean定义加载到国际奥委会容器。

其源码如下:

@Target (ElementType.TYPE)   @Retention (RetentionPolicy.RUNTIME)   @Documented   @Inherited   @AutoConfigurationPackage   @ import (AutoConfigurationImportSelector.class)   public  @interface  EnableAutoConfiguration  {   String 才能;ENABLED_OVERRIDE_PROPERTY =,“spring.boot.enableautoconfiguration";   ,,   Class<?才能在[],排除(),default  {};   ,,   String[],才能excludeName (), default  {};   }

这里需要关注@AutoConfigurationPackage和@ import (AutoConfigurationImportSelector.class)两个注解。

2.2.1注释:@AutoConfigurationPackage

源码如下:

@Target (ElementType.TYPE)   @Retention (RetentionPolicy.RUNTIME)   @Documented   @Inherited   @AutoConfigurationPackage   @ import (AutoConfigurationImportSelector.class)   public  @interface  EnableAutoConfiguration  {   String 才能;ENABLED_OVERRIDE_PROPERTY =,“spring.boot.enableautoconfiguration";   ,,   Class<?才能在[],排除(),default  {};   ,,   String[],才能excludeName (), default  {};   }

可以发现这个注解的核心其实也是进口注解,表示对于标注该注解的类的包,应当使用AutoConfigurationPackages注册。接着看注册这个类:

static  class  Registrar  implements  ImportBeanDefinitionRegistrar, DeterminableImports  {      ,,@Override   ,,,,,//元数据是我们注解所在的元信息   ,,,public  void  registerBeanDefinitions (AnnotationMetadata 元数据,BeanDefinitionRegistry 注册表),{   ,,,,,,,,,,,//将我们注解所在包下所有的组件进行注册   ,,,,,注册(注册表,,new  PackageImport(元数据).getPackageName ());   ,,,}      ,,@Override   ,,,public  Set

如何正确的使用@SpringBootApplication注解