前言
我们早期在做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自动装配原理:
SpringBoot自动装配说白了就是自动帮我们把第三方的组件装配到IOC容器,不需要再手动的去写Bean相关的配置,因为大多数配置SpringBoot已经帮我们约定好了,也就是约定大于配置的理念。