马士兵 springboot 源码分析
Spring发展历史
spring v3.0 注解
@ComponentScan
@Configuration
@Import
<import>
@ImportResource:过渡解决方案
@Import 引入配置类
@Import 将指定的类型注入到容器中去
@Import: ImportSelector接口
@Import: ImportBeanDefinitionRegistrar
@Enable*
以Redis
配置为例
-
添加
@Configuration
-
定义
@EnableRedisAutoConfiguration
注解
-
在配置类上添加注解
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
: 官方starterYYY-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
-
定义一个
XXXConfiguration
配置类。配合
@ConfigurationProperties 和@EnableConfigurationProperties
注解使用。
-
在
META-INF/spring.factories
中的org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
行后,添加步骤1
配置类全限定名称。
自定义配置项-自动提示: additional-spring-configuration-metadata.json
在自定义starter项目中,META-INF/additional-spring-configuration-metadata.json
添加如下形式信息: