讲讲springboot自动配置原理

讲讲springboot自动配置原理

讲讲springboot自动配置原理

file

上图是springboot自动配置大致流程图,我们都知道springboot框架使用起来非常方便,我们只要引入相关组件的maven包,然后配置少量的配置就可以正常使用了,不用像以前那样配置繁杂的xml配置文件。

自动配置jar包

file

 

这个是springboot自动配置的核心jar包,里面包含了所有的组件自动配置类,例如:RedisAutoConfiguration.java、WebMvcAutoConfiguration.java等一百多个自动配置类。

自动配置原理流程

问题:

  1. 从上面的自动配置jar包里面,我们知道springboot已经提前这些组件准备好相关的配置自动配置类,但是接下来springboot是怎么知道需要引入那些配置类呢?

  2. 这些自动配置类是如何被加载到项目中的?

加载自动配置类

首先我们来看下它是如何将这些配置类找到并加载的,我们从启动类的@SpringBootApplication开始,点进去后我们可以看到@EnableAutoConfiguration,这个@EnableAutoConfiguration注解就是开启自动配置的。接下来再点进去,如下图:

 

file

 

我们主要关注这个@Import(AutoConfigurationImportSelector.class)注解

@Import注解

我们在这里简单说明下@Import注解的作用,它的作用是将指定的类转换成spring的bean放入spring的IOC容器里面,它有以下3种方式创建bean:

    1.直接注入:@Import(bean.class)
    2.实现 ImportBeanDefinitionRegistrar 接口注入
    3.实现 ImportSelector 注入

上面的@Import(AutoConfigurationImportSelector.class)注解就是使用第三种方式实现注入的,为了方便理解,我举个第三种方式的小例子:

public class MyImprotSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        //bean的全限定名数组,将数组里面所有的类创建bean,并加入IOC容器
        String[] beanName = {"com.jiayuanhui.api.utils.http.HttpUtils"};
        return beanName;
    }
}

在这个selectImports重写方法里面返回类的全限定名数组,spring就会自动将这些类创建成bean放入IOC容器里面,我们来看下springboot里面的AutoConfigurationImportSelector类的selectImports方法:

file

 

源码里面的方法比较复杂,我们只要知道它同样是返回了一个字符串数组,而这些字符串就是这些我们需要加载的自动配置类。它是怎么得到这些配置类呢,它其实是加载了spring-boot-autoconfigure.jar包下面的spring.factories文件

file

这个文件里面有大量的自动配置类的全限定名,内容如下图:

file

 

 

现在我们得到了所有的自动配置类,但是我们不可能所有的都加载进IOC容器吧,所以还得根据我们引入的jar进行过滤,只加载我们需要的自动配置类。

过滤不需要的自动配置类

file

我们以这个RedisAutoConfiguration.java自动配置类为例,如上图,可以看到有个@ConditionalOnClass注解,这个注解的作用是当我们的项目环境下有某个类才会进行加载此bean,就是说如果我们没有引入redis的maven包,就不会存在RedisOperations这个类,所以此自动配置类就会被过滤掉,最后我们就得到所需要的配置类。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章