SpringBoot
2020-11-11 21:46:51 0 举报
AI智能生成
SpringBoot自动装配原理解析
作者其他创作
大纲/内容
@SpringBootConfiguration SpringBoot的配置 作用:SpringBoot的配置类 ,标注在某个类上 , 表示这是一个SpringBoot的配置类;
@Configuration 配置
@Component 插件 @Component 这就说明,启动类本身也是Spring中的一个组件而已,负责启动应用!
@EnableAutoConfiguration 自动配置包 开启自动配置功能
AutoConfigurationPackage 自动配置包
@Import({Registrar.class}) 自动注册包 Spring底层注解@import , 给容器中导入一个组件 Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 ;
Import({AutoConfigurationImportSelector.class}) 自动导入包的核心
导入类 AutoConfigurationImportSelector 选择器
getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) 获得自动配置的实体
getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) 获取候选的配置
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
} 获得了EnableAutoConfiguration标注类(主启动类)
return EnableAutoConfiguration.class;
} 获得了EnableAutoConfiguration标注类(主启动类)
public static List loadFactoryNames(Class factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
} 获取所有加载的配置
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
} 获取所有加载的配置
loadSpringFactories(classLoader)
classLoader.getResources("META-INF/spring.factories") 获取项目资源 ClassLoader.getSystemResources("META-INF/spring.factories"); 获取系统资源
Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.3.RELEASE->>spring-boot-autoconfigure-2.3.3.RELEASE.jar ->>spring-boot-autoconfigure-2.3.3.RELEASE.jar->>META-INF->>spring.factories(所有的自动配置类全部都在)
虽然所有的自动化配置类都在但是有些不会生效原因是有 ConditionalOnXXX注解 的存在Conditional里面的所有条件都满足才生效
从这些资源中遍历了所有的nextElement()(自动配置) 遍历完成之后存入Map集合(为属性)中
@ComponentScan 扫描当前主启动类统计的包 作用: 自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中
SpringBoot执行步骤
1, 在启动时从类路径中META-INF/spring.factories获取指定值
2.将这些自动配置的类导入容器(Configuration),自动配置就会生效
3.以前需要配置的东西 如:Spring.xml(Application.xml)和SpringMvc.xml. 在SpringBoot都已经封装完成
4. 解决方案和自动配置所需要的东西都在 Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.3.RELEASE->>spring-boot-autoconfigure-2.3.3.RELEASE.jar这个包下
5. 它会将所有需要导入的组件,以全类名的方式返回,添加到容器
6. 容器中会存在很多org.springframework.boot.autoconfigure.XXX.XXXAutoConfiguration的全类名,就是这些类给容器(Configuration)导入了开发时所需的所有类组件(@Bean), 并自动配置 @Configuration
结论:SpringBoot所有的自动配置都是在启动时扫描并加载 spring.factories所有的自动配置类,但是因有ConditionalOnXXX注解的存在不是所有的配置类都自动生效,会判断的对应start(启动器)是否存在,存在生效,否则不生效

收藏
0 条评论
下一页