前言
在回答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容器中·。