org.springframework.boot.autoconfigure.ImportAutoConfiguration
是否是org.springframework.context.annotation.Import
的改进替代品,因为它具有相同的作用并且另外尊重
@AutoConfigureBefore
、@AutoConfigureAfter
和 @AutoConfigureOrder
?
这是真的吗
是 改进的替代品org.springframework.boot.autoconfigure.ImportAutoConfiguration
?
org.springframework.context.annotation.Import
不,它不是替代品,因为
@ImportAutoConfiguration
是 Spring Boot 特定的注释,我可能将其称为增强。但是,尽管在使用 Spring Boot 时似乎可以互换使用它们,但我不建议这样做。按照预期用途使用它们。
@ImportAutoConfiguration
启用默认自动配置时,可以使用 @EnableAutoConfiguration
。您可能知道,@EnableAutoConfiguration
尝试配置位于类路径上的 bean,例如 tomcat-embedded.jar。而 @ImportAutoConfiguration
仅运行您在注释中提供的配置类。
这是一个带有
@ImportAutoConfiguration
: 的 Spring Boot 应用程序 main 方法的示例
@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);
}
}
您可能会说这是使用
@EnableAutoConfiguration
的替代方案。在本例中配置准系统嵌入式 Tomcat 和 Spring WebMVC。
@Import
用于导入标有 @Configuration
的 bean 配置类,其中包含您的自定义 bean 配置。
您检查过这两个注释的源代码吗?接口定义已经揭示了它们的相似之处和不同之处。截至今天,
@Import
注释的定义如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
而
@ImportAutoConfiguration
注释的定义如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({ImportAutoConfigurationImportSelector.class})
public @interface ImportAutoConfiguration {
@AliasFor("classes")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] classes() default {};
Class<?>[] exclude() default {};
}
正如您所看到的,它们有很多共同点。但是,
@ImportAutoConfiguration
注释还有一个 value
的别名,称为 classes
。此外,它还支持 exclude
类的属性。
另请注意
@Import
类的附加 ImportAutoConfigurationImportSelector
。