前言
SpringBoot是Java后端开发知识体系中的一个重要部分,相信许多跟荔枝一样正在学的或者是学过了的小伙伴们提起SpringBoot,第一反应就是它的自动装配原理。在这篇文章中荔枝将会简单从自己所了解的角度来梳理一下SpringBoot的自动装配原理,从源码的角度来分析。在写这篇文章的时候,荔枝主要是对自己来做的梳理,因此默认的口吻是以对于SpringBoot有一定的了解并上手做过项目的自己来写的,希望对大家有帮助~
文章目录
1.1.1 @SpringBootConfiguration
1.1.2 @EnableAutoConfiguration
1.1.3 配置文件与配置类属性properties之间存在关联
一、原理初探
在一开始学习SpringBoot项目或者是在看面试题的时候,荔枝知道SpringBoot是通过自动导入springboot核心包autoconfiguration下的META-INF中的spring.factories配置来实现自动装配的。但是具体的装配流程和用到的核心类属实未曾搞明白,因此我还需要一次细致的梳理复盘:
首先我们明确的是对于任何一个SpringBoot项目来说,我们都会在启动类中加入这么一个注解@SpringBootApplication,即通过注解的方式声明这是一个SpringBoot应用服务。
package com.macro.mall;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 应用启动入口
*/
@SpringBootApplication
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication .class, args);
}
}
对于启动类,我们需要的源码功能寻找点有两个:
- 注解@SpringBootApplication
- main中的run()方法。
1.1 @SpringBootApplication
首先进到@SpringBootApplication注解的源码中,我们知道其实注解也被成为声明式接口,而在SpringBootApplication注解的上方还有一些注解,除了一些常规的注解,我们主要来看看这些注解在整个自动装配过程中起到了怎样的作用。
//声明该注解的使用范围,该注解只能用类中
@Target({ElementType.TYPE})
//注解声明的作用周期:在运行的时候
@Retention(RetentionPolicy.RUNTIME)
//该注解的文档信息将被记录
@Documented
//该注解可以被继承
@Inherited
//声明下面是SpringBoot的一个配置类
@SpringBootConfiguration
//允许自动装配
@EnableAutoConfiguration
//开启组件扫描:排除一些过滤规则
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
...
...
}
1.1.1 @SpringBootConfiguration
这其实是一个SpringBoot的配置类,进入SpringBootConfiguration注