时间过的真快,一年一度的春节又过去了。上班第一天比较轻松,整理下节前看的SpringBoot自动装配原理。
SpringBoot的核心注解大家应该都知道是@SpringBootApplication()注解,自动装配也和该注解有关。@SpringBootApplication()是一个复合注解,点进注解对应的接口类可以看见接口上面对应的注解。
@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}
)}
)
java原生注解这边不与讲解,主要是@ComponentScan这个注解是包扫描的注解,也就是扫描bean。与自动装配有关的注解看英文单词大家应该也可以看出来--->@EnableAutoConfiguration。
这个注解中文是开启自动配置,接下来点击进去对应的接口里面可以看出这个注解也是一个复合注解。下面是进去后接口上面的注解。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
这6个注解中一眼就可以看出@Import({AutoConfigurationImportSelector.class})是对应的自动装配注解,功能是导入一个类。接下来点击进入对应的类。
可以看到导入的这个类实现了DeferredImportSelector接口,接着点进去看。
显然可以看见DeferredImportSelector继承了ImportSelector接口。而ImportSelector接口中有一个selectImports方法需要去实现,这里也是关键的实现自动装配原理的方法。接下来我们返回到AutoConfigurationImportSelector类中,查看实现的ImportSelector接口中的selectImports方法。
可以看到对应的方法中进行了一个判断,重点是getAutoConfigurationEntry方法,点击进去看就可以看到又有一个获得配置的getCandidateConfigurations方法。
接下来点击进入红框的方法中可以看见下面代码。
可以很明显的看出该方法是将类路径下 META-INF/spring.factories 里面配置的所有AutoConfiguration的值获得返回。然后依次返回到容器中完成自动装配