如何正确的使用@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})
用来表示注解作用范围,类型表示作用范围为类或接口。
2.1.2注解2:@Retention (RetentionPolicy.RUNTIME)
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注解