springboot-自动装配原理

马士兵 springboot 源码分析

Spring发展历史

spring v3.0 注解

@ComponentScan

@Configuration

@Import

<import>

@ImportResource:过渡解决方案

@Import 引入配置类

@Import 将指定的类型注入到容器中去

@Import: ImportSelector接口

@Import: ImportBeanDefinitionRegistrar

@Enable*

以Redis配置为例

  1. 添加@Configuration
  2. 定义@EnableRedisAutoConfiguration注解
  3. 在配置类上添加注解

Spring 4.0 注解

@Conditional 条件注解

决定是否将bean注入到容器中去。

@Conditional 注解定义

@Target({
          
   ElementType.TYPE, ElementType.METHOD}) //注解可以添加在类 or method上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
          
   
    Class<? extends Condition>[] value();
}

Condition

@FunctionalInterface
public interface Condition {
          
   
	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);  
}

例1

MyCondition


Spring5.0 注解

@Indexed

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Indexed {
          
   
}

作用 为了解决@ComponentScan扫描jar的多次IO 带来的性能问题,将所有的bean通过索引的方式,记录在索引文件中。 META-INF/spring.components.



SpringBoot

SpringBoot启动时注解类

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
          
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
          
   


}


@Target({
          
   ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
          
   

}


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
          
   
}

自动装配原理: spring-boot-XXX-starter

spring-boot-XXX-starter : 官方starter YYY-spring-boot-starter: 非官方

spring.factories

AutoConfigurationImportSelector 中调用SpringFactoriesLoader.loadFactoryName()方法,加载自动配置类。 最终通过,读取META-INF/spring.factories文件,获取所有的配置信息。

不同的XXX-springboot-starter包中,会存在各自的spring.factories文件。

spring-autoconfigure-metadata

用META-INF/spring-autoconfigure-metadata.properties来限定 autoconfig的加载条件。

手写一个starter

  1. 定义一个XXXConfiguration配置类。 配合@ConfigurationProperties 和@EnableConfigurationProperties 注解使用。
  2. 在META-INF/spring.factories 中的org.springframework.boot.autoconfigure.EnableAutoConfiguration= 行后,添加步骤1 配置类全限定名称。

自定义配置项-自动提示: additional-spring-configuration-metadata.json

在自定义starter项目中,META-INF/additional-spring-configuration-metadata.json添加如下形式信息:



actuator

经验分享 程序员 微信小程序 职场和发展