一、SpringBoot核心注解及其作用
@SpringBootConfiguration
声明为配置类(根配置类,首先扫描该类,本身是一个IOC容器的配置类),将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
SpringBoot使用Java Config技术进行配置,Java Config使用注解和Java代码的方式代替xml配置文件
- 任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。
- 任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。
@ComponentScan
自动扫描当前包及子包下被@Component,@Controller,@Service,@Repository注解标记的类,将其作为bean加载到IOC容器中。
不指定范围则默认从注解所在类的包下进行扫描。
@EnableAutoConfiguration
核心注解,是自动配置的入口,SpringBoot根据添加的jar包来进行项目的默认配置
二、SpringBoot自动配置如何实现
- @EnableAutoConfiguration是实现自动配置的入口
- 该注解又通过@Import注解完成导入配置的功能,导入了AutoConfigurationImportSelector,这是一个自动配置文件收集器
- 该类中的selectImports()方法内部使用SpringFactoriesLoader.loadFactoryNames()方法进行扫描具有META-INF/spring.factories文件的jar包,返回类全名经过滤后返回一个类全名的数组
- 返回的类全名通过反射被实例化,就形成了具体的工厂实例
- 工厂实例来生成组件具体需要的bean,加载到IOC容器中
spring.factories文件 - 该文件中定义了关于配置类的初始化,监听器等信息,并使用EnableAutoConfiguration使自动配置生效
- EnableAutoConfiguration中配置了多个自动配置相关类,在启动过程中会解析对应类配置信息
- 每个Configuation类都定义了相关bean的实例化配置,使用@Conditonal注解声明自动配置的条件
三、SpringBoot的启动过程
- 首先进入run方法,在run方法中创建一个SpringApplication实例,在构造方法内调用了初始化的initialize方法(创建监听器,加载springboot配置环境)
- 执行run方法创建Spring容器