1.什么是自动装配
简单来说就是,通过SpringBoot提供的自动装配机制可以简化对接Spring的配置,减少配置文件,只需要配置到application.properties一个文件里就行了。
2.有什么好处
就是简化配置
例如以前要用mybatis,不仅要配Spring的配置文件,还要配置mybatis的配置文件,很麻烦。现在只需要引入自动装配的starter就行了,直接配置几个参数就行。
3.原理是什么
基于Spring的spi机制来实现。
a.实现自动装配的属性类。
b.实现自动装配的类。
c.META-INF\spring.factories 配置自动装配的类
--------------------------------------------------------------------------------------------------
自动配置SPI机制:
SpringApplication.run()
启动springboot
启动spring
加载配置,调用ImportSelector接口的实现类selectImports()方法
扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,查找自动装配类,注入到spring
OJBK
从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中
SpringBootApplication
@EnableAutoConfiguration
@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector->DeferredImportSelector->ImportSelector
selectImports()
getAutoConfigurationEntry()
getCandidateConfigurations()
ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader())
private static final String LOCATION = "META-INF/spring/%s.imports";
org.springframework.boot.autoconfigure.AutoConfiguration.imports
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
--------------------------------------------------------------------------------------------------
Spring Boot 2.7.0 通过spring.factories加载自动配置类的方式成为过去式(弃用从spring.factories加载自动配置类),采用全新的方式加载自动配置类:需要被自动加载的类写在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件里,每一行是配置类的全类名。
--------------------------------------------------------------------------------------------------
mybatis自动装配:
1.实现配置类MybatisProperties 通过@Configuration、@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)注解,用于配置属性。
2.实现自动装配的类,MybatisAutoConfiguration,实现bean的注入,包括sqlSessionFactory、sqlSessionTemplate。
3.META-INF\spring.factories 配置自动装配的类。
4.AutoConfiguredMapperScannerRegistrar该类实现ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法来实现MapperScannerConfigurer的注入。
5.MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法,这个方法里面实现了@Mapper标签的扫描和注入。
--------------------------------------------------------------------------------------------------