SpringBoot自动装配原理

1、@SpringBootApplication

我们经常见到的的注解@SpringBootApplication
配置在类上方SpringBoot就会运行这个类的main方法来启动SpringBoot项目。

点进去看,发现他是一个组合的注解,他是这样的:
SpringBoot自动装配原理
其中@SpringBootConfiguration注解又包含了@Configuration注解,@Configuration注解又包含了@Component注解。我们使用Spring经常用的注解便是@Component,表明该类是一个Spring的配置类。受Spring容器管理生命周期。

SpringBoot自动装配用到的主要的注解便是@EnableAutoConfiguration
他长这个样子:
SpringBoot自动装配原理

2、@AutoConfigurationPackage

我们首先来看@AutoConfigurationPackage
SpringBoot自动装配原理
很明显,他导入了一个名字叫Resistrar的配置类,通过源码发现他只是注册了主配置类所在的包AutoConfigurationPackages到容器当中。
SpringBoot自动装配原理

3、@Import({EnableAutoConfigurationImportSelector.class})

因此,springboot自动配置的核心注解便是@Import({EnableAutoConfigurationImportSelector.class}),进入EnableAutoConfigurationImportSelector.class,发现他继承了AutoConfigurationImportSelector,入
SpringBoot自动装配原理
主要的方法是selectImports,他返回一个字符串数组,正好有一行代码返回一个字符串的List,调用了getCandidateConfigurations的方法:
SpringBoot自动装配原理
getCandidateConfigurations长这样:
SpringBoot自动装配原理
调用了loadFactoryNames方法,方法实现如下,他去从META-INF/spring.factories下获取资源,并且全部加载进来:
SpringBoot自动装配原理
META-INF/spring.factories中的内容为大概长这个样子:

SpringBoot自动装配原理
loadFactoryNames方法中的关键代码为properties.getProperty(factoryClassName);
SpringBoot自动装配原理
使用了Properties中的getProperty方法

getProperty(String key) : 在此属性列表中搜索具有指定键的属性。如果在此属性列表中找不到该键,则会检查默认属性列表及其默认值(递归)。如果未找到该属性,则该方法返回默认值参数。

他会过滤键为org.springframework.boot.autoconfigure.EnableAutoConfiguration类名的配置属性。到了这里便真相大白了。

4、总结

SpringBoot相当于使用了一种协议,他会默认寻找META-INF/spring.factories文件,并过滤键为org.springframework.boot.autoconfigure.EnableAutoConfiguration的属性值,并将值中的所有类自动装载。如果想要使用SpringBoot的自动装载功能,便需在META-INF/spring.factories文件中添加org.springframework.boot.autoconfigure.EnableAutoConfiguration的键,然后将需要自动装配的类作为值写进去。springboot便会将类进行自动装配。