SpringBootApplication注解
- 前言
- SpringBootApplication
- SpringBootConfiguration
- EnableAutoConfiguration
- import注解
- ComponentScan
- 总结
前言
Springboot作为Spring的脚手架,其本质核心并不提供Spring核心功能,作用就是开发者快速构建,预置三方配置、开箱即用的目的。“习惯优于配置”。
SpringBootApplication
这个是一个组合注解,它实质由SpringBootConfiguration
,EnableAutoConfiguration
,CompnentScan
三个注解组成。意思是SpringBoot启动配置加载,自动配置,组件扫描都是从这里开始。
SpringBootConfiguration
就是spring的@Configuration
替代,唯一区别就是它在写测试类的时候,可以自动查找配置。@DataJpaTest会首先寻找当前包中的@SpringBooConfiguration注解,找不到,去包的层次结构中找,直到找到为止。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration//就可以看出它就是Spring的Configuration的替代,只是有些测试注解会主动寻找它,所以它对于测试很方便
public @interface SpringBootConfiguration {
EnableAutoConfiguration
开启自动配置,这是springboot自动配置的关键。通过AutoConfigurationPackage
注解导入自动扫描包注册器@Import(AutoConfigurationPackages.Registrar.class)
;@Import
直接导入AutoConfigurationImportSelector.class
这是自动配置的关键。
import注解
原生spring框架组件装配经历了三个阶段:
- spring2.5+ @Component装配bean
- spring3.0+ @Configuration+@Bean,项目启动后bean注入到容器
- spring3.1+
@Enablexxx+@Import
,模块装配注入容器
它可以将@Configuration
,ImportSelector
、ImportBeanDefinitionRegistrar
、普通的component类导入
.
ComponentScan
开启组件扫描,扫描出所有标注@Component
注解的bean,作为组件注入到容器。
exclude 和 excludeName 属性来配置不需要实现自动装配的类或类名,也可以通过 scanBasePackages 和 scanBasePackageClasses 属性来配置需要进行扫描的包路径和类路径。
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
总结
springboot启动传入当前启动类class,不是必须的,而是哪个类标记了注解@SpringBootApplication
,传入哪个类,这个注解提供了,容器的配置,自动装配,组件扫描,这才是启动的基础。
//@SpringBootApplication 在CookTool标注@SpringApplication,一样可以启动
public class SpringSourceRead {
public static void main(String[] args) {
SpringApplication.run(CookTool.class, args);
}