springboot-自动装配原理
马士兵 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 : 官方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
- 定义一个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添加如下形式信息:
actuator
上一篇:
IDEA上Java项目控制台中文乱码
