@SpringBootApplication
我們可以看到@SpringBootApplication主要由以下三個(gè)注解組合。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringBootConfiguration注解(指定springboot的主配置類(啟動(dòng)類))
@SpringBootConfiguration標(biāo)注在某個(gè)類上,表示這是一個(gè)springboot的配置類
一層層點(diǎn)到最后,發(fā)現(xiàn)其實(shí)就是我們熟悉的spring的framework包下的注解@Configuartion
@Configuartion:配置類上用這個(gè)注冊(cè)-配置類的作用可以充當(dāng)配置文件,配置類也是容器中的一個(gè)組件;@Component
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
@Configuartion是@Component的派生注解
@Service、@Repository、@Configuartion等注解都是@Component的派生,可以理解成@Component是父類,@Configuartion是子類。
其實(shí)這些注解的作用都是,就是spring掃描類時(shí)會(huì)對(duì)加上這些注解的類自動(dòng)裝配到Spring容器中進(jìn)行管理。只是注解分多個(gè)名稱來(lái)標(biāo)注,閱讀代碼時(shí)更好的理解代碼的作用,我們可以看看
ClassPathScanningCandidateComponentProvider類
掃描的就是@Component注解,和它派生出來(lái)的注解(子類注解)
與xml中配置<bean id="" class=""/>作用相同
@EnableAutoConfiguration 開(kāi)啟自動(dòng)配置功能springboot啟動(dòng)類所在包及子包的組件類和自動(dòng)配置類(META-INF/spring.factories文件下的類),并將其初始化注入到IOC容器)
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
一.@AutoConfigurationPackage:自動(dòng)配置包,這注解里面通過(guò)@Import(AutoConfigurationPackages.Registrar.class)注入了Registrar類,springboot啟動(dòng)時(shí)這個(gè)類的registerBeanDefinitions方法會(huì)掃描獲取到springboot啟動(dòng)類所在的包及其子包下所有的類,將掃描到的所有組件(加了@Component等spring注解的類)注入spring的IOC容器中
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
二.@Import(EnableAutoConfigurationImportSelector.class);
注入的EnableAutoConfigurationImportSelector類,這個(gè)Selector選擇器類會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(xxxAutoConfiguration)
這個(gè)類會(huì)調(diào)用SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader)方法
Spring Boot在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類導(dǎo)入到容器中,自動(dòng)配置類就生效,幫我們進(jìn)行自動(dòng)配置工作(類似于java的spi)
自動(dòng)配置:比如之前啟動(dòng)WebMvc需要在xml上寫很多配置,現(xiàn)在只要引入springboot的starter-web包,springboot啟動(dòng)時(shí)會(huì)將spring-boot-autoconfigure-2.1.4.RELEASE.jar包下的META-INF\spring.factories配置文件org.springframework.boot.autoconfigure.EnableAutoConfiguration為key的類加載到IOC容器中,其中就有啟動(dòng)WebMvc需要配置的自動(dòng)配置類WebMvcAutoConfiguration,這個(gè)類初始化就會(huì)幫我們配置好webMVC需要的配置
又比如啟動(dòng)springboot web時(shí)不配置server.port,默認(rèn)的端口號(hào)為8080,這也是通過(guò)自動(dòng)配置類初始化的
@ComponentScan注解
指定要掃描的包及其子包下的類,默認(rèn)掃描當(dāng)前類的同級(jí)包及其子包,作用:比如某個(gè)類上有@Component,還需要@ComponentScan注解來(lái)指定掃描這個(gè)包的類,spring才會(huì)去處理這個(gè)類上的注解
xml的<context:component-scan base-package="" />作用相同