浅谈Spring Boot自动装配

引言

当我们从 Spring MVC 的配置地狱走出来怀抱 Spring Boot, 最吸引我们的就是它的自动装配,开箱即用

学习 Spring MVC 我们最需要掌握的就是 DispatcherServlet 这个前端控制器,他就是网页项目的核心

同为 servlet,相比于 Struts2,DispatcherServlet 需要配置的映射器、适配器和解析器还是让我们应接不暇

因此 Spring Boot 将配置的一切全部托管给启动器的自动装配思想值得我们去梳理和学习一下

正文

我们开始 Spring Boot 之前我们需要先通过一个例子来抛砖引玉一下原理

首先我们来学习一下 @ConfigurationProperties 注解从配置文件中获取配置
# yaml文件中定义people对象
people:
  name: songbaicheng
  age: 12
// 定义People类
@ConfigurationProperties(prefix = "people")
public class People {
    private String name;
    private int age;

    public People() {
    }

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "People {" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
// 测试能否获取yaml配置文件配置
@SpringBootTest
class MySpringBootApplicationTests {
    @Autowired
    private People people;

    @Test
    void contextLoads() {
        System.out.println(people);
    }
}

people

很明显我们通过 @ConfigurationProperties 获取到了配置文件的配置,接下来就自动装配的分析

@SpringBootApplication 作为 Spring Boot 项目的启动注解,自动装配的核心就在该注解内
@SpringBootApplication
public class MySpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }

}

@SpringBootApplication

抛开元注解和一些扫描配置类包的注解不谈,我们直接进入主题 @EnableAutoConfiguration 开启自动配置注解

@EnableAutoConfiguration

这里一是扫描并注册我们自己写的java类到spring容器,二是将注册springboot提供的自动配置类到spring容器

AutoConfigurationImportSelector类中存在 getAutoConfigurationEntry 获取配合实体的方法

在该方法内又调用了 getCandidateConfigurations 获取候选配置,而这些候选配置就是spring提供的默认配置

用 loadFactoryNames 方法去寻找配置文件的位置,找到 META-INF/spring.factories 的位置

AutoConfigurationImportSelector

getCandidateConfigurations

loadFactoryNames

FACTORIES_RESOURCE_LOCATION

找到 Spring 自动配置的模块,根据路径找到配置的文件,就会看到所有Spring为你配置好的所有配置

对于那么多的配置并不是所有的配置都会生效,它通过@ConditionalOnClass等注解来进行启用判断

而这里你也会发现其中的配置正是引用了一开始提到的 @ConfigurationProperties 注解来获取yaml配置文件参数

如果我们没有在yaml中自定义配置,就默认采用 Spring Boot 的配置,这也就实现了自动装配的效果

spring.factories


总结

Spring Boot 自动装配的大体流程就是以上所说的,其中用到的很多设计模式和思想都值得我们深究

如果想知道 Spring MVC 的 DispatcherServlet 工作流程,请看我的另一篇文章

https://www.cnblogs.com/bc-song/p/15511927.html

posted @ 2022-02-25 11:20  21岁还不是架构师  阅读(377)  评论(0编辑  收藏  举报