SpringBoot的自动装配原理(含例子和源码分析)

Posted 若曦`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot的自动装配原理(含例子和源码分析)相关的知识,希望对你有一定的参考价值。

1. SpringBoot的自动装配原理总结

① SpringBoot应用在启动后,回先加载所有的自动配置类,也就是xxxxxAutoConfiguration类,并加载到ioc容器中成为组件

② 这些配置组件从xxxxxProperties类中获取数据(一些有默认信息)

③ 组件获取信息后,就会转移到application.yaml或.properties配置文件中,成为springboot核心配置文件中的内容

④ 如果application.yml中有对应的配置信息,那么就会直接读取配置信息,不会覆盖配置信息

流程总结:xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

在SpringBoot的源码中,我们可以看见一个autoconfigure的包,这就是自动装配的包
在这里插入图片描述
打开继续看,会发现有很多以AutoConfiguration结尾的类,这就是自动配置类
在这里插入图片描述

@EnableConfigurationProperties(xxx.class)的作用

表示开启某个类的自动装配属性功能,该类需要使用@ConfigurationProprties注解

@ConfigurationProprties(prefix=“xxx”) 的作用

表示这个类是一个需要装配属性的类,这里的perfix前缀值就是代表的在application.properties中的key

@Import({xxx,class})的作用

让容器中自动创建出这个类的组件、默认组件的名字就是全类名

以DataSource的自动装配为例

在这里插入图片描述
可以看见类上面有一个@EnableConfigurationProperties注解,指定了DataSourceProperties.class

进入DataSourceProperties.class,就可以看见类上的@ConfigurationProperties注解,设置了前缀为spring.datasource,类中的属性就是在application.properties中去设置的

在这里插入图片描述
在这里插入图片描述
上述的前缀也就是在application.properties中对应的key值,通过在配置文件中使用key-value形式赋值

DataSource的自动装配流程如下:

① springboot启动后,先加载DataSourceAutoConfiguration类

②从注解@EnableConfigurationProperties(DataSourceProperties.class),找到对应的属性类

③ 从application.properties中读取信息,配置到该类的属性中(如果配置文件没有则使用默认信息)

2. 自定义一个自动装配的类

SpringBoot可以采用俩种方式自动装配类的属性

(1) 在xxxxxAutoConfiguration类上使用@Component+@ConfigurationProprties

@Component用其他容器注解也可以,就是代表要注入到ioc容器中

① 创建一个CarAutoConfiguration类,并使用上述注解

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "car")
public class CarAutoConfiguration {
    int carId;
    String carName;
}

@ConfigurationProprties(prefix=“car”) 这里的perfix前缀就是代表的在application.properties中的key

② 在application.properties中编写配置

server.port=8080

car.carId=123
car.carName=小明

③ 创建一个controller测试

@RestController
public class TestController {
    @Autowired
    CarAutoConfiguration car;

    @RequestMapping("/test")
    public String testMyCar(){
        return car.getCarId()+"==="+car.getCarName();
    }
}

在这里插入图片描述
发现car的信息通过application.properties成功配置

(2) 在xxxxxAutoConfiguration类上使用@EnableAutoConfiguration,并在xxxxxProperties类上使用@ConfigurationProprties和@Component

@EnableConfigurationProperties(xxx.class) 就是代表开启某个类的属性装配

① CarAutoConfiguration.class


@EnableConfigurationProperties({CarProperties.class})
public class CarAutoConfiguration {
}

② CarProperties.class

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "car")
public class CarProperties {
    int carId;
    String carName;
}

测试同样成功
在这里插入图片描述

3. @Configuration、@Import、@Conditional的作用

(1) @Configuration 作用于类上,告诉springboot这是一个配置类

//proxyBeanMethods:代理bean的方法
//        *      Full模式(proxyBeanMethods = true) :单例模式 (默认)
//        *      Lite模式(proxyBeanMethods = false) : 多例模式

@Configuration(proxyBeanMethods = true)
public class MyConfig {}

(2) @Import(xxx.class)

表示往容器中注入xxx.class这个组件

(3) @Conditional

作用于类上,表示条件注入:当满足某种条件才将该类注入到ioc容器中

@ConditionalOnMissingBean(name = "config") //表示ioc容器中没有config这个组件才将MyConfig类注入到ioc容器中
public class MyConfig {}

4. 替换springboot的默认组件

在配置类中,使用@Bean注解,可以使用自定义组件,覆盖掉springboot的默认组件

@Configuration(proxyBeanMethods = true)
//代表往容器中注入CarProperties.class这个类
@Import(CarProperties.class)
@ConditionalOnMissingBean(name = "config") //表示ioc容器中没有config这个组件才将MyConfig类注入到ioc容器中
public class MyConfig {
    @Bean
    public CharacterEncodingFilter filter(){
    	//可以在这里覆盖掉springboot的默认CharacterEncodingFilter组件,返回自己的
        return null;
    }
}

5. SpringBoot初始加载的自动配置类流程(源码分析)

在这里插入图片描述
进入@SpringBootApplication注解查看步骤

可见SpringBootApplication是一个复合注解
在这里插入图片描述进入@EnableAutoConfiguration注解
在这里插入图片描述
进入AutoConfigurationImportSelector.class

在该类中可以看见有一个getAutoConfigurationEntry方法,用于获取自动配置项,该方法又调用了 getCandidateConfigurations()方法,获取候选配置
在这里插入图片描述

进入getConfigurations()方法,可以看见获取了spring的加载工厂
在这里插入图片描述
进入spring工厂加载类,可以看见工厂资源位置是在META-INF下的spring.factorys中
在这里插入图片描述
spring.factorys是在springboot的自动装配包中
在这里插入图片描述
进入spring.factorys

在该工厂文件中,可以看见开启了一大堆的自动配置
在这里插入图片描述
spring.factories的语法解释

factories和properties的语法是完全一致的,一般情况下是:

com.xxx.Interface = com.xxx.Impl

出现多个时
com.xxx.Interface =
com.xxx.Impl1,
com.xxx.Impl2,
com.xxx.Impl3

key一般是接口,而value是接口的实现

springboot初始加载的自动配置类流程总结

① 通过SpringBootApplication找到springboot应用的入口

② 获取默认配置项,从/META-INF/spring.factories中获取

③ 获取到自动配置项后,进行解析,将其中的自动配置类加载到ioc容器

(在spring.factorys中写死了spring-boot一启动就要给容器中加载的所有配置类)

以上是关于SpringBoot的自动装配原理(含例子和源码分析)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot自动装配原理

SpringBoot启动流程分析:SpringBoot自动装配原理实现

SpringBoot自动装配原理

程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!

程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!

SpringBoot——SpringBoot四大核心之自动装配(源码解析)