springboot 与spring相比实现了将配置类自动加载的功能,省去了配置xml的繁琐的步骤。
@SpringBootApplication 注解表示了这是一个springboot应用,可以将springboot的配置自动加载
查看@SpringBootApplication的源码如下图:
文档中说声明@SpringBootApplication是方便的,相等于声明了以下3个注解
@SpringBootConfiguration # springboot配置
@EnableAutoConfiguration # 自动配置
@ComponentScan # 组件扫描
@SpringBootConfiguration:@SpringBootConfiguration 包括了@Configuration,一个有@Configuration注解的类,可以用作为spring 的标准的注解,配置了@Configuration注解的类可以被spring框架发现
@EnableAutoConfiguration: spring 的上下文试着去猜需要哪些配置,并且智能的加载,需要满足一些条件比如:
@ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean,这个bean可能由于某种原因而没有注册到ioc里,这时@ConditionalOnBean可以让当前bean也不进行注册@ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean,感觉这个是在多态环境下使用,当一个接口有多个实现类时,如果只希望它有一个实现类,那就在各个实现类上加上这个注解@ConditionalOnClass // 当给定的类名在类路径上存在,则实例化当前Bean@ConditionalOnMissingClass // 当给定的类名在类路径上不存在,则实例化当前Bean@AutoConfigurationPackage 添加该注解的类所在的package 作为 自动配置package 进行管理,运行测试代码,可以看到自动配置的package为 com.example.demo
@import(AutoConfigurationimportSelector.class) 引入AutoCofnigurationimportSelector类
AutoConfigurationimportSelector —> SpringFactoriesLoader.loadFactoryNames—>loadSpringFactories—>FACTORIES_RESOURCE_LOCATION = "meta-INF/spring.factories"
可以从上面代码看出,springboot从 spring-boot-autoconfigure-2.6.3.jar下面的meta-INF/spring.factories 加载配置
比如加载MongoDataAutoConfiguration 可以看到依赖的
@ConditionalOnClass({ MongoClient.class, MongoTemplate.class })
MongoClient.class, MongoTemplate.class 这两个类爆红,不存在,因为我没有引入MongoDB依赖,@ConditionalOnClass表示引入的类都存在才会加载
@EnableConfigurationProperties(MongoProperties.class) 表示从MongoProperties 这个文件当中加载默认的MOGODB配置,如果条件成立的话。
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,HTTP编码配置会被自动加载
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods() default true;
}



