原文出处:Springboot 启动原理详细解析 - jstarseven - 博客园
开发任何一个SpringBoot项目,都需要一个启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
一、关于@SpringBootApplication
@SpringBootApplication是一个组合注解,其中最重要的分别是:@SpringBootConfiguration(本质上是一个@Configuration)、@EnableAutoConfiguration、@ComponentScan。
即@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan
1、@Configuration
它就是JavaConfig形式下的那个@Configuration,所以,这个启动类本质上也是一个Spring的IOC容器配置类
JavaConfig配置下的两个注解:参考XML配置与Java配置_m0_50043893的博客-CSDN博客
2、@ComponentScan
@ComponentScan注解的作用是自动扫描并加载符合条件的组件或者bean,并将他们加载到IOC容器中
我们可以通过注解里包含的basePackages等属性来定制扫描的范围,如果不指定,则默认从声明@ComponentScan所在类的package里面找。
所以,SpringBoot启动类最好放在根目录下。
3、@EnableAutoConfiguation
Spring也提供了其他Enable开头的注解,例如@EnableCaching
@EnableAutoConfiguration简单概括就是借助@Import,收集和注册特定场景相关的bean定义
@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
@EnableAutoConfiguration作为一个复合注解,其中最关键的注解为@Import(EnableAutoConfigurationImportSelector.class),它借助于Spring原有的工具类SpringFactoriesLoader,可以帮助SpringBoot将所有符合条件的@Configuration配置都添加到当前SpringBoot创建并使用的IOC容器。
自动配置幕后英雄:SpringFactoriesLoader详解
SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。
public abstract class SpringFactoriesLoader {
//...
public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
...
}
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
....
}
}
配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类。
上图就是从SpringBoot的autoconfigure依赖包中的META-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。
所以,@EnableAutoConfiguration自动配置的魔法骑士就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
结论:
-
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
-
将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
-
整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
-
它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
-
有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;