SpringBoot自动装配
最近面试经常遇到一个问题:是否了解SpringBoot的自动装配?被问的次数多了自然就开始注意到这个问题了,于是就去了解怎么实现的自动装配。
@SpringBootApplication
public class DemoJyhApplication {
public static void main(String[] args) {
SpringApplication.run(DemoJyhApplication.class, args);
}
}
首先是我们进入我们的SpringBoot的启动类XxxApplication,找到@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}
)}
)
public @interface SpringBootApplication {
......
}
可以看到一个很重要的注解@EnableAutoConfiguration,翻译过来就是‘启动自动配置 ’,说明这里就是实现自动装配的核心,继续向下看。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
其中单看名字直译过来的含义的话,@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})与自动装配比较直接相关。
1、@AutoConfigurationPackage:将添加该注解的类所在的package作为自动配置的package进行管理,也就是说当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package。
2、@Import({AutoConfigurationImportSelector.class}):将需要装配的类装配到IoC容器中。
它主要是读取META-INF/spring.factories文件,经过去重、剔除排除值、过滤,返回需要装配的配置类集合。
扫描classpath下的META-INF/spring.factories文件,里面是以key=value形式存储,读取其中key=EnableAutoConfiguration,value就是需要装配的配置类,也就是getCandidateConfigurations返回的值。