启动类
package com.liouwb.springbootdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author liouwb
*/
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}
启动类只有@SpringBootApplication注解和一个main方法
- @springBootApplication注解,说明这是一个Spring Boot应用
@SpringBootApplication 注解
- SpringBootApplication注解源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
- 从上面注解源码可以看出,@SpringBootApplication是一个复合注解
- @Target @Retention @Documented @Inherited四个是元注解不用考虑
- @SpringBootConfiguration 说明这个一个SpringBoot配置
- @EnableAutoConfiguration 开启自动配置功能
@SpringBootConfiguration注解
- @SpringBootConfiguration 源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
- @Configuration 说明这个一个配置类(对应Spring的xml 配置文件)
@EnableAutoConfiguration注解
- @EnableAutoConfiguration 注解源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
- @AutoConfigurationPackage 自动配置包
- @Import Spring底层注解 给容器中导入一个组件
@AutoConfigurationPackage注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
-
- @Import Spring底层注解 给容器中导入一个组件
@Import 注解
- AutoConfigurationImportSelector :自动配置导入选择器
- AutoConfigurationPackages.Registrar.class: 将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器
AutoConfigurationImportSelector 类
- getCandidateConfigurations() 方法
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
- SpringFactoriesLoader类的 loadFactoryNames() 方法
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}
-
loadSpringFactories() 方法
-
spring.factories 文件,自动配置都在springboot-autoconfigure的jar包中
-
看下自动配置类的代码
-
就是一个平常经常写的java配置类
自动配置原理
- SpringBoot在启动的会扫描classpath类路径下的META-INF/spring.factories
- 获取EnableAutoConfiguration指定的值,导入容器,进行自动配置工作