手动实现一个springboot的简单自动配置,浅谈原理分析

516 阅读3分钟

什么是springboot的自动配置,有什么作用?

在我看来springboot的自动配置就是把别人开发的第三方的jar包中的bean加入到ioc的容器中,把这些bean进行统一的管理。在我们开发业务代码时我们只需要在类上面打上@Component等注解就可以把bean进行托管,但是如果我们要使用一个第三方的工具比如mongo等,我们不可能把mongo的所有的源码放入到自己写的项目中在给他们加上注解,但是有了自动配置后在服务启动的时候springboot就已经把这些第三方的bean加入到了ioc的容器中,我们就可以很方便的使用它们。这对于开发者而言是极为方便的,对于这些第三方工具的开发者而言只要遵从springboot的原则,并进行适当地配置就可以跟方便的加入到springboot的托管中。

原理分析

我们首先来看springboot的启动类:

图片.png 上面有一个关键注解@SpringBootApplication我们继续来看它的构成:

图片.png 我们可以很直观的看到一个非常关键的注解:@EnableAutoConfiguration,这就是实现自动配置的关键注解,继续看它的构成:

图片.png 可以看到在这个注解的上面加上了一个@Import注解,并且把一个叫做AutoConfigurationImportSelector的类引入了,这个类非常的关键,可以理解为这个类把一些第三方的bean的配置文件都读取并且加入到了ioc中我们继续看这个类:

图片.png 可以很直观的看到它实现了一个DeferredImportSelector这个里面有一个关键的方法我们继续看(怎么感觉像套娃dog):

图片.png 没错这里才是关键!这个方法返回一个String[]数组,那么可能有同学会有疑问,这个String的数组储存的是什么东西呢?这里面储存的是:很多很多的配置类的全路径!!! 通过这个类就可以把第三方的bean管理了,这个是一个很重要的方法,我们继续往下看这个叫做getAutoConfigurationEntry的方法干了什么把

图片.png 这个方法中调用了getCandidateConfiguration获取到了配置的第三方bean我们继续看这个方法里面干了什么

图片.png 好了好了不套娃了,到这里SpringFactoriesLoader从Spring.factories这个配置文件中获取到了很多第三方配置类的全路径

图片.png 没错就是这里!!接下来我们来看这个配置文件: 我们找到springboot的自动配置的源码包查看配置文件里面有什么:

图片.png

是不是一目了然了呢?这里面是很多很多的配置类的全路径springboot拿到这些配置类并且放入到ioc容器中进行管理。

实现一个自动配置

好了原理大概清楚了那么我们来手动实现一个吧

图片.png

假如jojo这个类是一个第三方的类库(假如!!)我们要把他假如到ioc中,那么它的配置类肯定是不能少的如下图所示:

图片.png

之后写一个启动类:

图片.png

这时还得写一个关键注解:@EnableJojoConfiguration

图片.png 可以看到里面的JojoConfiguration就是获取jojo配置类的类了,下面是他的代码:

图片.png 这里我们实现了ImportSelector也没有关系源码中的DeferredImportSelector接口实际上是继承的ImportSelector接口,并且获取到了jojo的配置类

我们用JojoApplication启动一下:

图片.png

可以看到jojo这个类已经放到了ioc容器中

注意:一定要把jojo看做是第三方的类 以上简单的分析了springboot的自动配置,还会手动实现 如有错误请见谅!