您所在的位置: > 主页 > 玉溪信息港 > 资讯 > 正文
Spring Boot中ImportAutoConfiguration注解与Import注解的区别!来源: 日期:2020-11-19 10:36:31  阅读:-

    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注解的区别


    (正文已结束)

    免责声明及提醒:此文内容为本网所转载企业宣传资讯,该相关信息仅为宣传及传递更多信息之目的,不代表本网站观点,文章真实性请浏览者慎重核实!任何投资加盟均有风险,提醒广大民众投资需谨慎!