SpringBoot自动注入浅析

本文探讨了SpringBoot如何实现自动注入,揭示了@EnableAutoConfiguration注解背后的SPI机制。通过分析Java的SPI服务,理解SpringBoot如何加载自动配置类,并对比了SpringBoot不同版本的自动配置加载方式,总结了两种方法的异同。
摘要由CSDN通过智能技术生成

在Spring和SpringMvc中,如果我们要使用外部的bean,那么就要手动写一个Java配置类,然后用@Bean的方式把他们注入到容器里。

但是在SpringBoot中,如果要使用一个Mybatis,我们只要一个Mybatis的starter就可以了,这就是自动配置。

首先明确一点:为什么第三方的代码上也加了@Component却无法和我们的Bean一起注入容器。这是因为SpringBoot默认的ComponentScan范围是我们的启动类所在目录及其子目录,所以第三方包无法被扫描到。

1.@EnableAutoConfiguration

在使用springboot时,我们并没有在Java配置类里面注入外部的bean,也不能在外部类上加@Component,而且这些类也不在我们的项目范围内,所以它们是如何加入到我们的容器中呢?

@EnableAutoConfiguration能把第三方bean注入到springboot中,借鉴了JDK的SPI机制。

2.Java的SPI

(19条消息) 浅谈SPI扩展机制_&一步的博客-CSDN博客_spi扩展

SPI就是:服务使用者定义接口,服务提供者实现接口并描述实现信息,Java负责类加载工作

就比如Java的Driver就是一个SPI,Java让各个数据库厂商去根据这个接口实现驱动,然后我们Java用户导一个驱动的jar包就可以获得服务

服务提供者将接口的实现信息写在resources/META-INF/services下,文件名为接口的全类名,内容为实现类的全类名。

//接口定义
void print();
//服务获取过程
ServiceLoader<Interface1> load = ServiceLoader.load(Interface1.class);
for (Interface1 interface1:load){
   
    interface1.print();
}
文件格式,内部是实现类的全类名
com.example.demo.ClassA
com.example.demo.ClassB

在这里插入图片描述

流程:在这里插入图片描述

3.SpringBoot的SPI
  1. 首先明确SpringBoot已经有两种自动装入的方式了,一种依赖Factories文件(1.0开始),一种依赖Imports文件(2.7开始)

  2. 直接跳到AutoConfigurationImportSelector,这个类就是专门用来加载自动装入的bean的。

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
         
        //这一步就是老的关键的自动装入过程
        List<String> configurations = new ArrayList<>(
       SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值