springboot自动装配是怎么实现的

前言

在回答springboot自动装配如何实现前,先思考一个问题。那就是springboot自动装配有什么用?一句话概括,springboot自动装配技术可以将第三方库中的类实例化后得到的bean对象放入ioc容器中。

一、支持自动装配和不支持自动装配的第三方库

1.思考如下代码是否会报错

在这里插入图片描述
我用@Component注解向spring申明要为test类创建bean对象,并使用@Autowried注解对test类中的jsonArray属性进行依赖注入。但由于,JsonArray并不支持自动装配,所以在ioc容器中找不到JsonArray bean对象。于是,代码就会报错。程序无法启动。
在这里插入图片描述
可以看到,报错信息中提示要为JsonArray创建一个bean对象。

2.再思考如下代码是否会报错?

在这里插入图片描述
几乎同样的代码。唯一不同的是属性换成了支持自动装配技术的SqlSessionFactory类。而自动装配技术会将SqlSessionFactory类实例化后的bean对象放入ioc容器中。在使用autowired注解进行依赖注入时便不会像第一问那样在ioc容器中找不到类。所以代码可以正常运行。
在这里插入图片描述
这就引发了一个问题,同样是第三方库,SqlSessionFactory类是如何做到支持自动装配技术的?

二、SqlSessionFactory类是如何做到支持自动装配技术的

进入SqlSessionFactory类所在的第三方库中有一个spring.factories文件。而这个文件里的value就是配置类。
在这里插入图片描述
在这里插入图片描述
可以看到配置类有两个,进入第二个MybatisAutoConfiguration类中可以看到,该类被configuration注解修饰,所以它是一个配置类。其中的方法被@bean修饰,即为方法的返回值创建bean对象。如下图可以看到,SqlSessionFactory方法被bean修饰,固它的返回值即SqlSessionFactory对象会被放入ioc容器中。
在这里插入图片描述
但是,这又牵扯到一个问题。那就是springboot读到配置类路径后是怎么将这些路径对应的bean放入容器中的。要实现这一点,只需要用到@import注解可以了。

三、自动装配技术简单实现

解释清楚了为什么SqlSessionFactory类会支持自动装配。下面我们自己实现一下自动装配技术。
首先,这样的一个test类它是必然会报错的,原因在一章节中已经阐述。
在这里插入图片描述

于是,仿照MybatisAutoConfiguration类去写一个配置类。如下图所示。
在这里插入图片描述

然后再把配置类的相关信息写入配置文件中。vaule填的是配置类路径。如下图所示。
在这里插入图片描述

接下来,读取到配置文件中的vaule信息。将这些value信息存于数组中。如下图所示。getConfiguration()方法就是获取到一条条配置类路径信息。
在这里插入图片描述

虽然获取到了配置类路径信息,但要怎么把这一个个的配置类导入ioc容器中呢,就是使用@import注解。但因为getConfiguration()方法返回的是一个数组,所以这里要使用importSelector接口,如下图所示。
在这里插入图片描述
再在启动类上使用@import注解进行导入。
在这里插入图片描述
点击运行,可以看到代码顺利启动了。这就是自动装配技术的模拟实现。
在这里插入图片描述

四、自动装配技术实现步骤小结

spring.factories中会定义配置类路径。配置类中使用@configuration注解和@Bean注解定义了一个个bean对象。spring实现importSelector接口并重写其中的selectimports方法获取到spring.factories中会定义的配置类路径,最后使用@import方法将这些bean对象导入到ioc容器中·。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值