springboot自动状态原理

主要涉及的注解

  1. SpringBootApplication
  2. EnableAutoConfiguration
  3. Import

传递关系

	SpringBootApplication->EnableAutoConfiguration->Import

主要涉及的类

  1. AutoConfigurationImportSelector

import注解作用

@Import(AutoConfigurationImportSelector.class) 会将这个class到spring容器中

重要的方法

	//获取需要加载的class
   public String[] selectImports(AnnotationMetadata annotationMetadata) {
   	if (!isEnabled(annotationMetadata)) {
   		return NO_IMPORTS;
   	}
   	AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
   	return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
   }

   	/**
    * Return the {@link AutoConfigurationEntry} based on the {@link AnnotationMetadata}
    * of the importing {@link Configuration @Configuration} class.
    * @param annotationMetadata the annotation metadata of the configuration class
    * @return the auto-configurations that should be imported
    */
   protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
   	if (!isEnabled(annotationMetadata)) {
   		return EMPTY_ENTRY;
   	}
   	AnnotationAttributes attributes = getAttributes(annotationMetadata);
   	List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
   	configurations = removeDuplicates(configurations);
   	Set<String> exclusions = getExclusions(annotationMetadata, attributes);
   	checkExcludedClasses(configurations, exclusions);
   	configurations.removeAll(exclusions);
   	configurations = getConfigurationClassFilter().filter(configurations);
   	fireAutoConfigurationImportEvents(configurations, exclusions);
   	return new AutoConfigurationEntry(configurations, exclusions);
   }

   /**
    * Return the auto-configuration class names that should be considered. By default
    * this method will load candidates using {@link ImportCandidates} with
    * {@link #getSpringFactoriesLoaderFactoryClass()}. For backward compatible reasons it
    * will also consider {@link SpringFactoriesLoader} with
    * {@link #getSpringFactoriesLoaderFactoryClass()}.
    * @param metadata the source metadata
    * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation
    * attributes}
    * @return a list of candidate configurations
    */
   protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   	List<String> configurations = new ArrayList<>(
   			//FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";  
   			//EnableAutoConfiguration.class 加载的上面位置文件里的class
   			SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
   	ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
   	Assert.notEmpty(configurations,
   			"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
   					+ "are using a custom packaging, make sure that file is correct.");
   	return configurations;
   }

	
	
### Spring Boot 自动装配原理 Spring Boot自动装配功能是其核心特性之一,旨在简化传统的 Spring 应用程序配置流程。以下是对其工作原理的详细解析: #### 1. **@SpringBootApplication 注解的作用** @SpringBootApplication 是一个复合注解,由以下几个主要部分组成: - @SpringBootConfiguration:表明这是一个 Spring Boot 配置类。 - @EnableAutoConfiguration:启用自动配置机制,这是自动装配的核心所在[^2]。 - @ComponentScan:开启组件扫描,默认会扫描该注解所在的包及其子包内的所有组件。 通过在启动类上标注此注解,开发者无需额外配置即可完成大部分基础设置。 #### 2. **自动装配的核心 —— @EnableAutoConfiguration** @EnableAutoConfiguration 实际上是一个触发器,它通过将 AutoConfigurationImportSelector 类导入到容器中来实现自动化配置的功能[^4]。这个选择器负责收集所有的候选配置类,并决定哪些应该被加载进上下文中。 #### 3. **META-INF/spring.factories 文件的角色** Spring Boot 利用了 Java SPI(Service Provider Interface)机制,在 classpath 下寻找名为 META-INF/spring.factories 的资源文件。该文件定义了一系列扩展点与其对应的实现类映射关系。其中就包含了众多以 EnableAutoConfiguration 开头的关键条目[^3]。 例如: ```properties org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,... ``` 每当项目运行时,Spring Boot 就会读取这些信息并实例化相应的 Configuration Classes。 #### 4. **条件化装配 (Conditional Configuration)** 为了确保只有必要的依赖才会生效,Spring Boot 广泛采用了基于 Condition 的动态决策方式。这意味着即使存在某个特定的技术栈关联的 auto-configurator ,但如果环境不满足预设的前提条件,则不会激活相关联的服务初始化逻辑[^3]。 典型的应用场景包括但不限于检测是否存在某类 jar 包、属性值是否符合预期等等。常用的条件注解有如下几种形式: - @ConditionalOnClass 和 @ConditionalOnMissingClass :分别用于验证指定类型是否可获得或缺失; - @ConditionalOnBean / @ConditionalOnMissingBean : 检验 IOC 容器内部是否有某种 bean 对象注册成功与否; - @ConditionalOnProperty : 根据 application.properties 或 yml 文件里的键名匹配结果判定开关状态; #### 5. **总结** 综上所述,Spring Boot自动装配主要是依靠 @EnableAutoConfiguration 注解读入一系列预先定义好的 configuration classes 。再配合灵活多样的 conditional rules 设计思路,从而达到按需定制的效果。这种设计理念不仅减少了人为干预的成本开销,同时也提高了整体系统的稳定性和一致性水平。 --- ### 示例代码片段 以下展示了如何自定义一个简单的自动配置模块: ```java @Configuration @ConditionalOnClass(SomeThirdPartyLibrary.class) public class MyCustomAutoConfig { @Bean public SomeService someService(){ return new DefaultSomeServiceImpl(); } } ``` 在此基础上,还需记得更新 spring.factories 文件内容以便框架识别新增加的支持选项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值