• SpringBoot 为什么能够自动的注入一些常用的Bean ?详细分析SpringBoot 自动配置的实现


    转载至: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

  • 相关阅读:
    矩阵乘法(二):利用矩阵快速幂运算完成递推
    更改codeblock编译后程序的图标
    如何在VS2008下使用FLTK
    Python type() 函数
    Python range() 函数用法
    Python len()方法
    Python filter() 函数
    Python bool() 函数
    数据类型
    JAVA标识符
  • 原文地址:https://www.cnblogs.com/mkl34367803/p/11629708.html
Copyright © 2020-2023  润新知