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项目控制台中文乱码