springboot 自动装配的原理
自动装配原理
问题就是为什么我们直接导入依赖就可以使用了,甚至不用配置web.xml,tomcat等,springboot内部是如何实现的?
主启动类上的注解@SpringBootApplication里有三个重要注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
1.@SpringBootConfiguration
这个注解的源码是@Configuration:表示该类为主配置类,可用来装配bean,进一步@Configuration的源码是@Component,说明Spring的配置类也是Spring的一个组件,
SpringBoot本质上就是一个Spring应用,通过这个注解来加载IOC容器的配置。所以在启动类里面标注了@Configuration,意味着它也是一个IOC容器的配置类
2.@ComponentScan
这个注解作用是扫描配置类下所有包的类,等价于SSM框架整合中springmvc.xml下的:
<context:component-scan base-package="com.lian.controller"/>
3.@EnableAutoConfiguration(重点)
该注解源码包含两个重要注解
first :@AutoConfigurationPackage:自动配置包
作用:给Spring容器中导入一个Registrar注册器组件,这个注解和@ComponentScan有类似作用,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但是区别是:
@AutoConfigurationPackage会扫描@Enitity、@MapperScan等第三方依赖的注解
@ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解。所以这两个注解扫描的对象是不一样的。
second:@Import(核心):
作用:通过import导入第三方提供的bean的配置类:AutoConfigurationImportSelector:给容器中导入组件,该类下的方法:getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes)作用是获取所有的配置
要重点关注:
其一
getSpringFactoriesLoaderFactoryClass()顾名思义能够返回spring自动装配的容器
其二
SpringFactoriesLoader.loadFactoryNames的方法读取项目资源和系统资源,从这些资源中遍历了所有的nextElement(自动装配),遍历完成后,封装为properties供我们使用
3个注解需要关注的所有类和方法:
注意点:所有的自动装配类都放在了spring.factories下:
所有的类并不是都生效的,只要导入了对应start核心注解:@ConditionalOnxx,这样自动装配类才能生效才能生效
总结:springboot自动装配通过三大注解完成,在spring.factories中保存了所有的自动装配类,只有拥有注解@ConditionalOnxx的类才拥有启动器,有了启动器才能实现自动装配,才能配置成功。
1.springboot在启动时,从类路径下/META-INF/spring.factories获得指定的值;
2.将这些自动装配成功的类导入IOC容器,自动装配即生效
3.springboot会把所有需要的组件导入,以类名的方式将这些组件添加到容器
4.容器中会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动装配
5.有了自动装配类,我们就不用再手写配置文件了
我的理解:自动装配类实现了我们之前手写的配置文件的内容以及配置文件之间的关联
有个小疑问:我在vue才刚接触到组件这个概念,之前ssm和springmvc印象都没有听过,为什么springboot会说到组件,是结合了前端的一些东西吗??
这个疑问我学几天后再反过来看。