要理解自动装配原理,首先要理解BeanDefinition的作用,在BeanDefinition里定义了一些属性,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,后面对Bean的操作就直接对BeanDefinition进行,例如拿到这个BeanDefinition后,可以根据里面的类名、构造函数、构造函数参数,使用反射进行对象创建,BeanDefinition是一个接口,是一个抽象的定义,实际使用的是其实现类,如 ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition等。

我们都知道@SpringBootApplication注解里面封装了@ComponentScan注解,这个注解默认情况下扫描main函数所在的包路径,把带有@Component, @Configuration, @Service, @Responsitory的类都加载到Spring 容器中,加载过程是怎么样的呢,在@SpringBootApplication注解上面有@EnableAutoConfiguration注解,在这个注解里面又一个很重要的注解,那就是@Import(AutoConfigurationImportSelector.Class), 这个注解的作用是加载META-INF/spring.factories文件里的内容,spring.factories文件里存储的内容是<key,value> 的键值对,key就是注解或者说配置类(XXXAutoConfiguration,比如@Import这个接口)的全路径,value就是需要自动配置的配置类(上面加上@Configuration的类),拿spring官方的spring-boot-autoconfigure下的spring.properties文件来看一下(部分配置):

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\    # key,下面的都是value
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\

在AutoConfigurationImportSelector类里面有一个getCandidateConfigurations方法,源码如下:

/*** Return the auto-configuration class names that should be considered. By default* this method will load candidates using {@link SpringFactoriesLoader} with* {@link #getSpringFactoriesLoaderFactoryClass()}.* @param metadata the source metadata* @param attributes the {@link #getAttributes(AnnotationMetadata) annotation* attributes}* @return a list of candidate configurations*/protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());Assert.notEmpty(configurations,"No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;}

我们进入loadFactoryNames方法查看:

public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {String factoryClassName = factoryClass.getName();return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());}private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);if (result != null) {return result;} else {try {Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");LinkedMultiValueMap result = new LinkedMultiValueMap();while(urls.hasMoreElements()) {URL url = (URL)urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);Iterator var6 = properties.entrySet().iterator();while(var6.hasNext()) {Entry<?, ?> entry = (Entry)var6.next();String factoryClassName = ((String)entry.getKey()).trim();String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());int var10 = var9.length;for(int var11 = 0; var11 < var10; ++var11) {String factoryName = var9[var11];result.add(factoryClassName, factoryName.trim());}}}cache.put(classLoader, result);return result;} catch (IOException var13) {throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);}}}

看到classLoader.getResources了吧,它会去找META-INF/spring.factories文件,加载进来,解析文件的内容,根据键值对对应关系,循环遍历spring.factories,把每个键值对解析为一个.property文件,然后再放到一个beanDefinitionMap里面,这个map的key是beanName,value是beanDefinition对象,有了这个beanDefinitionMap,spring会遍历这个map,对每个bean进行实例化(懒加载的除外),这样就得到了autoConfiguration里面每个bean的实例,可以对其进行属性的配置

标签: spring

好文要顶 关注我 收藏该文  

成功没有捷径
关注 - 0
粉丝 - 0

0

0

« 上一篇: 股票买到手想卖可以随时都能卖掉吗

posted on 2019-11-30 19:18  成功没有捷径  阅读(0)  评论(0)  编辑 收藏

刷新评论刷新页面返回顶部

发表评论

昵称:

评论内容:

     

退出

[Ctrl+Enter快捷键提交]

【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【推荐】腾讯云海外1核2G云服务器低至2折,半价续费券限量免费领取!
【推荐】阿里云双11返场来袭,热门产品低至一折等你来抢!
【推荐】天翼云双十一翼降到底,云主机11.11元起,抽奖送大礼
【推荐】流程自动化专家UiBot,体系化教程成就高薪RPA工程师
【活动】京东云服务器_云主机低于1折,低价高性能产品备战双11
【优惠】七牛云采购嘉年华,云存储、CDN等云产品低至1折

相关博文:
· SpringBoot自动装配原理解析
· SpringBoot自动装配原理
· SpringBoot自动装配源码解析
· SpringBoot自动装配的原理
· SpringBoot自动装配原理分析
» 更多推荐...

阿里技术3年大合辑免费电子书一键下载

最新 IT 新闻
· Infor转型十年启示录:ERP套件厂商为什么要做云平台? 
· 开拓创新十余年,中国移动IPv6项目获中国通信学会一等奖 
· 微软官宣,打开华为PC爆发式洪流之闸 
· 小米再次回购股份:4亿港元回购约4483万股 
· 拥抱云端,计算未来 
» 更多新闻...

昵称: 成功没有捷径 
园龄: 1年11个月 
粉丝: 0 
关注: 0

< 2019年11月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7

搜索

常用链接

我的标签

随笔分类

随笔档案

文章分类

阅读排行榜

Powered by: 博客园 模板提供:沪江博客 Copyright © 2019 成功没有捷径 
Powered by .NET Core 3.0.0 on Linux

SpringBoot自动装配原理解析相关推荐

  1. SpringBoot 自动装配原理解析

    自动装配是 Spring Boot 的核心部分,也是 Spring Boot 功能的基础,正是由于自动装配,才 将我们从 Bean 的繁复配置中解脱出来.那么 Spring Boot 中的自动装配指的 ...

  2. SpringBoot自动装配原理解析——面试可以这样会回答

    1. 前言 SpringBoot是目前软件中最主流的框架,无论是工作还是面试基本都有它的身影,SpringBoot主要解决了传统spring的重量级xml配置Bean,实现了自动装配:所以,我们也常在 ...

  3. 【理解springboot自动装配原理】

    理解springboot自动装配原理: 最近读了小马哥(mercyblitz)Springboot编程思想(核心篇),有了一些心得和感悟,分享给大家: 1. 官网介绍了激活自动装配的方法: * 文档提 ...

  4. SpringBoot自动装配原理浅析

    Springboot自动装配原理 SpringBoot是当下J2EE最为流行的框架,它有着轻量,快捷等特点,让程序员们可以专注在业务逻辑的编写上,而不用花太多的力气在一些环境的配置,整合组件的配置上面 ...

  5. 面试终极宝典:Springboot自动装配原理

    Springboot的自动装配过程,网上大多都是罗列代码,即使看完了,也还存在很多的疑点.下面,这是我总结的在面试过程中介绍SpringBoot自动装配原理的话术,拿来即用就可. Springboot ...

  6. 刨析 SpringBoot 自动装配原理,其实很简单

    J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...

  7. 淘宝(SpringBoot自动装配原理)

    什么是 SpringBoot 自动装配 通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能 SpringBoot 是如何实现自动装配的 SpringBoot 的核心注解 S ...

  8. 原理解析_SpringBoot自动装配原理解析

    自动装配是Spring Boot的核心部分,也是Spring Boot功能的基础,正是由于自动装配,才将我们从Bean的繁复配置中解脱出来.那么Spring Boot中的自动装配指的是什么?我们继 续 ...

  9. 面试题总结(mybatis一级缓存及二级缓存、springboot自动装配原理等)

    1.mybatis一级缓存及二级缓存 区别: 一级缓存的作用域是一个sqlsession内: 二级缓存作用域是针对mapper(Namespace)进行缓存: 一级缓存: 在参数和SQL完全一样的情况 ...

  10. springboot自动装配原理笔记一

    思维导图 太长放不了截图,就看大纲吧. 从启动类的@SpringBootApplication注解开始,探究其自动装配的原理 结论 整合javaEE,解决方案和自动装配的东西都在spring-boot ...

最新文章

  1. 图片缓存之内存缓存技术LruCache,软引用
  2. 用YII实现多重查询(基于tag)
  3. Oracle复杂查询21道题精析
  4. 全国计算机等级考试题库二级C操作题100套(第11套)
  5. php学习笔记细节部分。
  6. 收货地址列表html,收货地址.html
  7. 【离散数学】求闭包的例题
  8. EICU数据库安装教程
  9. “止于至善,彼岸可及”——记我在东大的这三年
  10. 计算机性能和拷机软件
  11. Scrapy 爬取今日头条街拍图片
  12. Pr 案例:制作快闪转场效果
  13. HTML+CSS实现心形效果
  14. 使用nid的修改数据库名
  15. java计算机毕业设计智能推荐电影网站源码+mysql数据库+系统+lw文档+部署
  16. JavaEE大型分布式电商项目 上海淘淘商城
  17. 区块链报错 5 | Contract has not been deployed to detect network (network/artifact mismatch)
  18. 情人节送男生的礼物,情人节送礼清单
  19. unittest自动化测试-requests库实现http请求与requests库离线安装
  20. 学生项目统计表及计划书模板

热门文章

  1. servlet中通过getWriter()获取out返回给浏览器出现中文乱码问题
  2. 一分钟看懂Docker的网络模式和跨主机通信
  3. Spark Streaming实例
  4. ROS Learning-008 beginner_Tutorials ROS话题
  5. 使用Linq作为rdlc报表的数据源
  6. Windows SharePoint Services Search和Office SharePoint Server Search的区别
  7. log4j日志输出配置
  8. EF Ccore 主从配置 最简化
  9. webpack 样式表抽离成专门的单独文件并且设置版本号
  10. 半边数据结构(The_Half-Edge_Data_Structure)