在springboot主程序类中,有一个非常重要的注释@SpringBootApplication,Springboot运行这个类下的main方法启动springboot应用,如下:
按住键盘上Ctrl键,用鼠标点击这个注释,可以看到这个注释启用了三个注释功能:
1.@SpringBootConfiguration:允许在上下文中注册额外的bean或导入其他配置类
2.@EnableAutoConfiguration
:启用Spring Boot的自动配置机制
3.@ComponentScan:启用组件扫描功能
简单来说,就是@SpringBootApplication是一个组合注解,相当于使用@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注释与它们的默认属性,如下图:
@SpringBootConfiguration :SpringBoot配置类,与@Configuration注解作用一样,将当前类内声明的一个或多个以@Bean注解标记的方法的实例放入到spring容器中,实例名就是方法名,相当于Spring中的配置文件
说明: @*Configuration表示xx配置类,点击@SpringBootConfiguration代码分析,如下图:
同时需要说明一下,配置类也是Spring容器中的一个组件,我们可以按住键盘上的Ctrl键,用鼠标点@Configuration打开代表跟踪如下图:
@EnableAutoConfiguration也是一个组注解,我们按上述同样的方法打开代码跟踪。如下图所示:
@AutoConfigurationPackage:包自动配置,跟踪代码发现就是由一个@import注释,如下图:
通过跟踪发现, @AutoConfigurationPackage注解使用的Spring底层注解@Import,给容器导入一个组件,导入的组件由AutoConfigurationPackages.Registrar类处理导入,按住键盘Ctrl键,用鼠标点击Registrar类名,可以看到如下图所示代码结构:
我们在Registrar方法中的第129行处打下断点,对register方法进行跟踪调试,运行项目调试程序,如下图所示:
依次点击introspectedClass我们可以看到@SpringBootApplication标注所在类为SpringApplicationStart,如下图所示:
为了测试得到导入的包名,我们把new PackageImport(metadata).getPackageName()),复制到调试窗口中的Expressions标签页,点击Add new expression,在name中粘贴new PackageImport(metadata).getPackageName()),回车即可在Value中看到导入的包名com.goldCup.boot.main,如下图:
通过调试我们可以知道:@AutoConfigurationPackage注释的作用就是将主配置类所在的包下面所有的组件都扫描到Spring容器中。
@EnableAutoConfiguration还有另一个@Import注释,跟据字义,我们可以理解为导入组件选择器自动配置,作用是将需要导入的组件以全类名的方式返回,这些组件将被添加到Spring容器中,如图:
自动配置类的作用,配置注入功能组件自动完成。
SpringBoot在启动的时候从自动配置类路径下的META-INF/spring.factorles中获取EnableAutoConfiguration指定的值,并将这些值作为自动配置类导入到容器中,自动配置类就生效,如下图: