转载至:https://blog.csdn.net/qq_29941401/article/details/79605388

有一个问题一直让我好奇,为什么在SpringBoot中有的bean 我们都没有配置却能够自动注入,这个比如说我们使用JdbcTemplate 的时候那个对象明明我们都没有配置但是却能获取到。再比如SpringBoot在结合Redis的时候,我们也没有注入redisTemplate的bean结果却能使用@Autowired 获取到具体的对象值。这一切究竟是怎么实现的???
@Autowired
private StringRedisTemplate stringRedisTemplate;

带着这个问题我们检查了一下启动类,发现了这个极为重要的注解:

@SpringBootApplication

这个注解实际上是一个组合注解:

我们发现这里面有一个注解:
@EnableAutoConfiguration
看看这个注解的定义:

我们发现这里使用@Import注解导入了一个类:AutoConfigurationImportSelector
这个类的代码很多,但是有这样一个显眼的方法:

显然这就是选择导入一些自动配置的bean。
注意到这个类是位于org.springframework.boot.autoconfigure; 包下,由此可见这个类就是我们自动配置实现的关键。
事实上,spring-boot-autoconfigure-版本号.jar 里就有一个spring.factories文件,这个文件中声明了有哪些要自动配置的类。该文件的大致内容如下:

可以发现这里面定义的类,名字大多都是以****AutoConfiguration 为主,在Spring的自动配置开启之后,会自动的去读取这些该文件的内容,从而进行对每一个类自动配置。

我们设置springBoot的开发模式为debug之后,在应用启动之后就会发现控制台有这样的输出:

这就说明在SpringBoot 正在按照spring.factories文件 中定义的各种类 进行判断和自动配置了。

我们随手打开一个RedisAutoConfigration的源码:

发现这里的内容很简单,就是使用@Configuration 来声明了一个配置,然后使用了条件判断,意思是要是没有名字redisTemplate 的bean 那就立刻新建一个bean。所以我们集成redis的时候导入依赖之后就可以直接使用@AutoWired来完成bean的注入了。

最后我们还可以发现在上面的 RedisAutoConfigration 类中 还有一个这样的注解:

@EnableConfigurationProperties(RedisProperties.class)

我们把RedisProperties 这个类打开一看:

原来 SpringBoot 集成Redis中的各种默认配置全部在这了.................

同时,这里还告诉我们如果要在application.properties 中自定义配置 只要设置前缀为 spring.redis 即可。

最后,注意下,如果我们要加入的组件不是在上面的自动配置列表之内,往往springBoot 会要求我们添加 @Enable*** 之类的注解, 实际上这些注解背后也是导入了一个类,然后注册了一个bean 。

比如典型的:@EnableScheduling 注解,他的定义是这样的:

打开SchedulingConfiguration 一看:

果然一切都很显然。。。。。
————————————————
版权声明:本文为CSDN博主「小火箭Coding」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29941401/article/details/79605388

SpringBoot 为什么能够自动的注入一些常用的Bean ?详细分析SpringBoot 自动配置的实现的更多相关文章

  1. SpringBoot 为什么能够自动的注入一些常用的Bean ?

    原文转载至:https://blog.csdn.net/qq_29941401/article/details/79605388 但是我一直没有搞懂druid是怎么自动配置的? 这个是properti ...

  2. SpringBoot之Spring@Value属性注入使用详解

    在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Va ...

  3. 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二) 上一篇分析了SpringBoo ...

  4. 全网最深分析SpringBoot MVC自动配置失效的原因

    前言 本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及官方文档都说明了原因,但还是想亲自看一看,本以为很简单的事 ...

  5. SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解

    SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...

  6. SpringBoot原理深入及源码剖析(一) 依赖管理及自动配置

    前言 传统的Spring框架实现一个Web服务需要导入各种依赖jar包,然后编写对应的XML配置文件等,相较而言,SpringBoot显得更加方便.快捷和高效.那么,SpringBoot究竟是如何做到 ...

  7. Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式

     本节主要内容:    1. 给MessageBean注入参数值    2. 测试Spring自动组件扫描方式    3. 如何控制ExampleBean实例化方式    4. 使用注解方式重构Jdb ...

  8. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  9. Spring 依赖注入(基本注入和自动适配注入)

    Spring 依赖注入 Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系. 属性注入 构造注入 内部注入 自动装配 1.属性注入 IService: public in ...

随机推荐

  1. beta版本——第一次冲刺

    第一次冲刺 (1)SCRUM部分☁️ ✨成员描述: 姓名 李星晨 完成了哪个任务 增加了个人中心返回主页按钮 花了多少时间 1h 还剩余多少时间 1h 遇到什么困难 没有遇到问题 这两天解决的进度 1 ...

  2. Codeforces C. Split a Number(贪心大数运算)

    题目描述: time limit per test 2 seconds memory limit per test 512 megabytes input standard input output ...

  3. BZOJ1485: [HNOI2009]有趣的数列(卡特兰数+快速幂)

    题目链接 传送门 题面 思路 打表可以发现前六项分别为1,2,5,12,42,132,加上\(n=0\)时的1构成了卡特兰数的前几项. 看别人的题解说把每一个数扫一遍,奇数项当成入栈,偶数项当成出栈, ...

  4. P1525 关押罪犯[扩展域并查集]

    题目来源:洛谷 题目描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1−N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整 ...

  5. P1941 飞扬的小鸟[dp]

    题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣 ...

  6. Topcoder10566 IncreasingNumber

    IncreasingNumber 一个数是Increasing当且仅当它的十进制表示是不降的,\(1123579\). 求 \(n\) 位不降十进制数中被 \(d\) 整除的有多少个. \(n\leq ...

  7. 获取国定字符的内容split

    a="Time:20190822_111655_554 Start Cloud new case, Num=1, Input=/data/voice/20190725_035326_2_vo ...

  8. pandas 6 时间

    类 备注 创建方法 Timestamp 时刻数据 to_datetime,Timestamp DatetimeIndex Timestamp的索引 to_datetime,date_range,Dat ...

  9. Dubbo源码分析:Server

    Server接口是开启一个socket服务.服务实现有netty,mina,grizzly的. 抽象时序图 获取NettyServer时序图 Transporter类图 Server 类图

  10. Kerberos身份验证流程

    介绍:Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议.它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证. 在 Kerberos 认证中,最主要的问题是如何 ...