一文搞懂SpringBoot自动配置原理

前言

了解了SpringBoot中的bean配置以后,我们来看看springboot最核心的注解?@SpringBootApplication
,我们知道每个SpringBoot得启动类上都会标注这个注解,代表此类为主要运行类,似乎加上了这个注解以后,我们的一些bean就能自动的配置注入进ioc容器中了,到底是如何实现的呢?我们来点开此注解,看看内部的实现:一键获取spring全家桶福利

可以看到@Import注解给我们导入了一个AutoConfigurationImportSelector 类,这个类从名字上看起来就和自动配置选择有关系,我们继续点进去看看,发现了一个很重要的方法–selectImports ,如下:

可以看到其中有一个getCandidateConfigurations 的方法,看名称我们可以猜到此方法负责获取所有的自动配置的信息,而此方法的代码如图:

可以看到SpringBoot调用了SpringFactoriesLoader.loadFactoryNames方法获取其中的所有的名称列表,而此方法中我们可以看到一个查找路径的常量:

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
1.

SpringBoot会查找当前工程包括所有依赖的jar的META-INF路径下的

spring.factories文件,似乎所有的自动配置的类都是从这里读取来的,而加载的过程代码如下:

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
   		// 若缓存里有直接返回缓存的值
		MultiValueMap<String, String> result = cache.get(classLoader);
		if (result != null) {
   
			return result;
		}

		try {
   
            // 类加载器对象存在则用这个加载器获取上面说的常量路径里的资源,不存在则用系统类加载器去获取	
			Enumeration<URL> urls = (classLoader != null ?
			classLoader.getResources(FACTORIES_RESOURCE_LOCATION) ://当前classloader是appclassloader,getResources能获取所有依赖jar里面的META-INF/spring.factories的完整路径
			ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
			result = new LinkedMultiValueMap<>();
			while (urls.hasMoreElements()) {
    // 遍历上述返回的url集合
				URL url = urls.nextElement(); // URL类可以获取来自流,web,甚至jar包里面的资源
				UrlResource resource = new UrlResource(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值