SpringBoot自动装配原理解析
要理解自动装配原理,首先要理解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) 编辑 收藏
昵称: 成功没有捷径
园龄: 1年11个月
粉丝: 0
关注: 0
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
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 |
搜索
常用链接
我的标签
随笔分类
- C#
- DB2
- git(1)
- hibernate
- java(2)
- javaweb
- jsp
- mybatis(2)
- Myeclipse(1)
- mysql(2)
- oracle
- servlet
- sonatype nexus
- spring(1)
- springMVC
- Struts
- 股票(2)
- 生活
随笔档案
文章分类
阅读排行榜
- 1. sonatype nexus简介(转)(3814)
- 2. mysql 数据库的四种隔离级别(942)
- 3. 股票原理(666)
- 4. 股票买到手想卖可以随时都能卖掉吗(343)
- 5. Java 按照 map 的 key 或者 value 排序(183)
Powered by: 博客园 模板提供:沪江博客 Copyright © 2019 成功没有捷径
Powered by .NET Core 3.0.0 on Linux
SpringBoot自动装配原理解析相关推荐
- SpringBoot 自动装配原理解析
自动装配是 Spring Boot 的核心部分,也是 Spring Boot 功能的基础,正是由于自动装配,才 将我们从 Bean 的繁复配置中解脱出来.那么 Spring Boot 中的自动装配指的 ...
- SpringBoot自动装配原理解析——面试可以这样会回答
1. 前言 SpringBoot是目前软件中最主流的框架,无论是工作还是面试基本都有它的身影,SpringBoot主要解决了传统spring的重量级xml配置Bean,实现了自动装配:所以,我们也常在 ...
- 【理解springboot自动装配原理】
理解springboot自动装配原理: 最近读了小马哥(mercyblitz)Springboot编程思想(核心篇),有了一些心得和感悟,分享给大家: 1. 官网介绍了激活自动装配的方法: * 文档提 ...
- SpringBoot自动装配原理浅析
Springboot自动装配原理 SpringBoot是当下J2EE最为流行的框架,它有着轻量,快捷等特点,让程序员们可以专注在业务逻辑的编写上,而不用花太多的力气在一些环境的配置,整合组件的配置上面 ...
- 面试终极宝典:Springboot自动装配原理
Springboot的自动装配过程,网上大多都是罗列代码,即使看完了,也还存在很多的疑点.下面,这是我总结的在面试过程中介绍SpringBoot自动装配原理的话术,拿来即用就可. Springboot ...
- 刨析 SpringBoot 自动装配原理,其实很简单
J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...
- 淘宝(SpringBoot自动装配原理)
什么是 SpringBoot 自动装配 通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能 SpringBoot 是如何实现自动装配的 SpringBoot 的核心注解 S ...
- 原理解析_SpringBoot自动装配原理解析
自动装配是Spring Boot的核心部分,也是Spring Boot功能的基础,正是由于自动装配,才将我们从Bean的繁复配置中解脱出来.那么Spring Boot中的自动装配指的是什么?我们继 续 ...
- 面试题总结(mybatis一级缓存及二级缓存、springboot自动装配原理等)
1.mybatis一级缓存及二级缓存 区别: 一级缓存的作用域是一个sqlsession内: 二级缓存作用域是针对mapper(Namespace)进行缓存: 一级缓存: 在参数和SQL完全一样的情况 ...
- springboot自动装配原理笔记一
思维导图 太长放不了截图,就看大纲吧. 从启动类的@SpringBootApplication注解开始,探究其自动装配的原理 结论 整合javaEE,解决方案和自动装配的东西都在spring-boot ...
最新文章
- 图片缓存之内存缓存技术LruCache,软引用
- 用YII实现多重查询(基于tag)
- Oracle复杂查询21道题精析
- 全国计算机等级考试题库二级C操作题100套(第11套)
- php学习笔记细节部分。
- 收货地址列表html,收货地址.html
- 【离散数学】求闭包的例题
- EICU数据库安装教程
- “止于至善,彼岸可及”——记我在东大的这三年
- 计算机性能和拷机软件
- Scrapy 爬取今日头条街拍图片
- Pr 案例:制作快闪转场效果
- HTML+CSS实现心形效果
- 使用nid的修改数据库名
- java计算机毕业设计智能推荐电影网站源码+mysql数据库+系统+lw文档+部署
- JavaEE大型分布式电商项目 上海淘淘商城
- 区块链报错 5 | Contract has not been deployed to detect network (network/artifact mismatch)
- 情人节送男生的礼物,情人节送礼清单
- unittest自动化测试-requests库实现http请求与requests库离线安装
- 学生项目统计表及计划书模板
热门文章
- servlet中通过getWriter()获取out返回给浏览器出现中文乱码问题
- 一分钟看懂Docker的网络模式和跨主机通信
- Spark Streaming实例
- ROS Learning-008 beginner_Tutorials ROS话题
- 使用Linq作为rdlc报表的数据源
- Windows SharePoint Services Search和Office SharePoint Server Search的区别
- log4j日志输出配置
- EF Ccore 主从配置 最简化
- webpack 样式表抽离成专门的单独文件并且设置版本号
- 半边数据结构(The_Half-Edge_Data_Structure)