<返回更多

SpringBoot自动装配原理

2023-05-08  尚硅谷教育  
加入收藏

前言

我们早期在做Spring项目的时候,需要手动添加很多xml配置,比如整合SpringMVC的配置,开启事务,整合MyBatis等等。这些都需要我们手动编写大量的配置,简直就是配置地狱。

Spring官方也发现了这一个痛点,后面SpringBoot横空出世,解决了这一痛点。SpringBoot基于约定大于配置的理念,根据我们在依赖中的starter,自动的为我们把一些必要的组件装配到IOC容器中,并且这些组件在SpringBoot中基本上都有默认的配置,所以SpringBoot项目在启动的时候才可以为我们自动装配组件。

举个例子:比如我们要在项目中引入redis相关的组件,我们只需要在项目中加入一个Redis相关的starter即可。

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

只需要引入这个依赖,我们在项目中就可以使用RedisTemplate 来操作Redis了,不用做任何配置。

因为SpringBoot会默认连接 127.0.0.1:6379 这个服务,当然前提是我们本机启动了Redis服务。这个就是SpringBoot的默认配置,也就是约定。

一、SpringBoot自动装配过程解析

1.1源码分析

SpringBoot项目的启动类上都会有@SpringBootApplication注解,这个注解是一个复合注解。

重点是@EnableAutoConfiguration这个注解,这个注解也是一个复合注解。

@EnableAutoConfiguration注解导入AutoConfigurationImportSelector类,这个类中有一个selectImports()方法。

selectImports(),方法调用了getAutoConfigurationEntry()方法,这个方法里面又有一个关键的方法getCandidateConfigurations()

getCandidateConfigurations()方法借助SpringFactoriesLoader.loadFactoryNames()方法,扫描了所有包含META-INF/spring.factories的jar包,这些jar包实际上就是我们引入的starter中的依赖。

在loadFactoryNames()方法中加载spring.factories文件。

1.2Debug验证

getCandidateConfigurations()的第一行打上断点,然后debug模式启动SpringBoot项目。

我们发现 configurations集合中存储了许多全类名,这些就是SpringBoot帮我们把依赖中的相关的组件装配到了IOC容器中。

比如我们项目中添加了注册中心nacos相关的依赖,可以看到nacos依赖的库中META-INF文件夹中有spring.factories文件,这个文件中定义了一些必要的组件全类名,SpringBoot根据这些就可以利用JAVA的反射机制为我们创建出这些对象,然后放到IOC容器中。

总结

SpringBoot自动装配原理:

  1. @EnableAutoConfiguration注解导入AutoConfigurationImportSelector类。
  2. selectImports方法调用SpringFactoriesLoader.loadFactoryNames()扫描所有jar下面的对应的META-INF/spring.factories文件.
  3. 把所有在spring.factories文件中扫描到的全类名进行实例化加载到IOC容器中。

SpringBoot自动装配说白了就是自动帮我们把第三方的组件装配到IOC容器,不需要再手动的去写Bean相关的配置,因为大多数配置SpringBoot已经帮我们约定好了,也就是约定大于配置的理念。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>