Spring Boot的@Configuration和@AutoConfiguration有什么区别?

5

最重要的是,“Auto”前缀背后的原因是什么?用@Configuration注释的类而不是@AutoConfiguration的类是否不那么自动化或者其他原因?

2个回答

6

@Configuration是Spring框架的一个注解,与spring-boot没有严格的绑定关系。当Spring开始允许编程创建spring-beans时,引入了这个注解,以便从xml定义的bean中向前迈进。

@AutoConfiguration是一个spring-boot特定的注解,在Spring框架中通常不可用。它存在的原因是为了与spring-boot合作的外部提供者能够将他们提供的某些库中的一些类标记为这个注解,以便在Spring应用程序启动期间自动地进行一些初始化操作。

因此,如果一些普通程序员开发某个应用程序并使用kafka依赖项,则会自动创建一些bean并添加到应用程序上下文中,并准备好供程序员使用,尽管他没有为它们定义任何配置。Spring-boot已经知道这一点,因为kafka提供者已经通过在其提供的jar文件中标记某个类的注释@AutoConfiguration来通知了它。

出于这个原因,@AutoConfiguration有一些更强大的配置可用,如beforeafterbeforeNameafterName,以允许提供者在应用程序启动期间指定配置何时应用,如果需要某种顺序。

因此,这个注解不是为了从一些开发使用spring-boot的普通程序员那里使用。它是为那些开发可能与spring-boot一起使用的库的人准备的。其中一个例子是kafka库。

为了在spring-boot项目中使其工作,还需要使用@EnableAutoConfiguration来启用自动配置。

来自Spring文档

Spring Boot自动配置尝试根据您添加的jar依赖项自动配置您的Spring应用程序。例如,如果HSQLDB在您的类路径上,并且您没有手动配置任何数据库连接bean,则Spring Boot将自动配置内存数据库。

@Configuration则应该由一些使用spring-bootspring-framework的普通开发人员使用,以通知框架哪些bean应该被创建以及如何创建它们。


3

@AutoConfiguration 是在2.7版本中引入的,旨在使用其专用注释标记所有自动配置,并在3.0中摆脱spring.factories以进行自动配置导入,如Github issue所述。

根据Spring文档:

[@AutoConfiguration] 表示一个类提供了可以由Spring Boot自动应用的配置。自动配置类是常规的@Configuration,唯一的例外是Configuration#proxyBeanMethods() proxyBeanMethods始终为false。

通常,@AutoConfiguration 类会根据类路径上存在的依赖项自动配置应用程序。这些类通常标有@ConditionalOnClass@ConditionalOnMissingBean注释,以检测特定类的存在或缺失。

此外,如果需要按特定顺序应用配置,则可以在@AutoConfiguration上使用beforebeforeNameafterafterName属性,而@Configuration则不提供这些属性。

由于proxyBeanMethods始终为false是这两个注释之间的区别,我可以假设您添加的评论对两个注释都有效吗?如果是的话,它并没有真正回答“auto”前缀背后的含义。 - user13314823
我已经更新了我的答案,希望现在更加清晰明了。 - birca123
@DouglasMonteiro 请查看我下面的答案。最大的区别在于@Configuration是Spring注解,而@AutoConfiguration是仅适用于spring-boot的注解。从这一点出发,如果您阅读我的答案,您就可以理解auto前缀是如何发挥作用的。 - Panagiotis Bougioukos
@birca123 是的,现在更清楚了。谢谢你。但是我希望你能更深入地阐述两种注解之间的区别,而不是把重点放在AutoConfiguration的定义上。通过Panagiotis,我知道了Configuration用于bean初始化,而AutoConfiguration用于自动引导依赖项,也可以用于配置bean,但提供了特定选项来帮助设置引导步骤(我想)。 - user13314823

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接