Spring Boot 核心注解之 @ImportAutoConfiguration 与 @Import 的区别

 2022-08-13
原文地址:https://cloud.tencent.com/developer/article/1557456

Spring Boot中提供了一系列的注解比如@ImportAutoConfiguration和@EnableAutoConfiguration,它们最终都组合了@Import注解,那么,它们之间有什么区别呢?

@ImportAutoConfiguration是否可以替代@Import注解?@ImportAutoConfiguration和@EnableAutoConfiguration是否效果相同?

从根本上来说,@ImportAutoConfiguration是@Import的增强,限制了它使用的特定范围。

使用@EnableAutoConfiguration时会扫描整个类路径下,包括依赖引入的jar包所有的自动配置类(被注解了@Configuration的类),尝试进行自动配置。比如,tomcat-embedded.jar。

而@ImportAutoConfiguration只运行在你注解中提供的配置类。下面是一个Spring Boot入口方法中使用@ImportAutoConfiguration的列子:

    @ComponentScan("path.to.your.controllers") 
    @ImportAutoConfiguration({WebMvcAutoConfiguration.class 
        , DispatcherServletAutoConfiguration.class 
        , EmbeddedServletContainerAutoConfiguration.class 
        , ServerPropertiesAutoConfiguration.class 
        , HttpMessageConvertersAutoConfiguration.class}) 
    public class App { 
        public static void main(String[] args) { 
        SpringApplication.run(App.class, args); 
        } 
    }

所以说,更准确的来说,@ImportAutoConfiguration与@EnableAutoConfiguration的功能更相似,而且能够更细粒度的控制导入的类。

@ImportAutoConfiguration在单元测试中也有应用场景,比如@AutoConfigureMockMvc注解便组合了@ImportAutoConfiguration。

    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @ImportAutoConfiguration
    @PropertyMapping("spring.test.mockmvc")
    public @interface AutoConfigureMockMvc {
     // ...
    }

这样,在单元测试的过程中既实现了自动配置的功能,又不必像@EnableAutoConfiguration那样扫描并尝试自动配置所有的自动配置类。

@ImportAutoConfiguration相关源码如下:

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @Import(ImportAutoConfigurationImportSelector.class)
    public @interface ImportAutoConfiguration {
    
    	/**
    	 * 导入的自动配置类
    	 */
    	@AliasFor("classes")
    	Class<?>[] value() default {};
    
    	/**
    	 * 导入的自动配置类。如果为空,则使用META-INF/spring.factories中指定的类,其中key为带注解的类的全限定名称。
    	 */
    	@AliasFor("value")
    	Class<?>[] classes() default {};
    
    	/**
    	 * 排除自动配置类
    	 */
    	Class<?>[] exclude() default {};
    }

原文链接:《SPRING BOOT中@IMPORTAUTOCONFIGURATION注解与@IMPORT和@ENABLEAUTOCONFIGURATION注解的区别

Spring技术视频

CSDN学院:《Spring Boot 视频教程全家桶》