北川广海の梦

北川广海の梦

SpringBootApplication注解

297
2020-05-21

@SpringBootApplication
这个注解是每一个SpringBoot应用程序都会包含的一个注解。
它位于我们的启动类上,也就是程序的入口点main()方法所在的类上面。

它的作用主要有:
1.标注我们的这个启动类,一般我们命名为XXXApplicaion,为一个我们SpringBoot的配置类。
2.启用SpringBoot自动装配。
3.组件自动扫描。

其实这里面也就对应了三个组成@SpringBootApplication注解很重要的注解

@SpringBootConfiguration

这个注解派生自@Configuration注解,作用就是标注某一个类为SpringBoot配置类。
image.png
这里我确实不清楚它和@Configuration注解的区别。。。
image.png
我将@Configuration和@SpringBootConfiguration在启动类进行替换,也是没有问题的。不知道为什么会这样设计。

@ComponentScan

这个很简单,自动扫描包和子包目录下的组件和Bean的定义,
例如 @Service@Controller等等。并将它们添加到容器里面。具体哪个目录可以自己指定,但是我们一般默认是包含这个注解的类所在的包,也就是我们XXXApplication所在的包,向下扫描。

@EnableAutoConfiguration

这个注解最为精彩,靠它实现了SpringBoot的自动装配。
先看看它的构成:
image.png
核心的包含两个部分,@AutoConfigurationPackage注解和@Import注解。

@AutoConfigurationPackage

这个注解其实很简单,里面也包含了一个@Import
image.png
进入这个内部类,上面一行注释:
image.png
从导入的配置中存储这个基本包。
这行代码也很简单:获取这个类的包名,然后将它注册成为bean。

@Import(AutoConfigurationImportSelector.class)

这个注解是SpringBoot实现自动装配的重点。
image.png
selectImports方法会在ConfigurationClassParser解析被@Configuration修饰的类的时候调用。作用就是将需要导入的组件以全类名的方式返回。
顺着其中的调用链路
selectImports()->getAutoConfigurationEntry()->getCandidateConfigurations()

image.png
这个方法会从META-INF下的spring.factories加载配置,并将其中的配置类全部加载到容器中。
这样就可以实现外部组件自动的装配。

但是我们会有一个疑问:这么多的配置软件难道都会生效吗?我的系统里面根本没有引入这些组件啊。
image.png

我们随便进入一个配置类看看,例如Redis:
image.png
上面有一个@ConditionalOnClass注解,这个注解的作用就是声明当RedisOperations这个类存在classpath的时候生效。可是我们并没有引入Redis依赖,所以这个配置类是并不会生效的。
而如果配置类生效,也就是引入了Redis依赖的话,我们就可以直接通过依赖注入的方式,拿到RedisTemplate对象,实现Redis的各种操作。

同样类似的条件注解还有一些:
@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效