spring boot 为什么加了@SpringbootApplication注解就是启动类?
因为@SpringbootApplication注解包含了3个注解:
1.@ComponentScan
2.@SpringBootConfiguration
3.@EnableAutoConfiguration
@ComponentScan
@ComponentScan注解等同于
<context:component-scan package="" />
我们没有设置package,是因为@ComponentScan这个注解配合
@EnableAutoConfiguration进行自动扫描,
扫描启动类所在包及其子包下所有springIOC注解.
所以,我们需要把启动类放在根目录下
@EnableAutoConfiguration
含义:
开启自动配置
自动配置是SpringBoot的一个特性,
可以根据classpath中的jar依赖,自动注册bean
我们点开这个注解查看源代码得知:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {...}
中有一个@Import(AutoConfigurationImportSelector.class)这个最为重要
可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当
前springboot创建并使用的IOC容器中
AutoConfigurationImportSelector类
点开@Import(AutoConfigurationImportSelector.class)进入类中,
我们可以看导入了import org.springframework.core.io.support.SpringFactoriesLoader;
看到这个我们就可以得知,springboot应用是借助spring框架的一个工具类SpringFactoriesLoader
来真正实现智能的自动配置.
怎么自动配置?
翻看源码得知:
List<String> configurations = SpringFactoriesLoader
.loadFactoryNames(getSpringFactoriesLoaderFactoryClass()
通过SpringFactoriesLoader.loadFactoryNames()来加载所有注入的bean
核心:
1.从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
(查看桌面本地图片)
2.去重,并将exclude和excludeName属性携带的类排除;
3.过滤,将满足条件(@Conditional)的自动配置类返回;
@SpringBootConfiguration
含义: 定义该类为配置类
继承自Spring的@Configuration
如果这个类被这个注解或@Configuration注解标记,则表示该类为配置类
会自动扫描标记了@Bean的方法,自动注册到springIOC容器中,并且实例名就是方法名
springboot的启动流程
public static void main(String[] args) {
SpringApplication.run(SBMApplication.class,args);
}
进入run方法