为啥 Spring Boot Application 类需要有 @Configuration 注解?

Posted

技术标签:

【中文标题】为啥 Spring Boot Application 类需要有 @Configuration 注解?【英文标题】:Why Spring Boot Application class needs to have @Configuration annotation?为什么 Spring Boot Application 类需要有 @Configuration 注解? 【发布时间】:2017-01-07 22:03:12 【问题描述】:

我正在学习 Spring 框架,但我无法理解 @Configuration 注释的确切含义以及应该对哪些类进行注释。在 Spring Boot 文档中,据说 Application 类应该是 @Configuration 类。

Spring Boot 支持基于 Java 的配置。虽然有可能 使用 XML 源调用 SpringApplication.run(),我们通常 建议您的主要来源是 @Configuration 类。

尝试了解@Configuration 我发现用@Configuration 注释一个类表明该类可以被Spring IoC 容器用作bean 定义的来源。

如果是这样,那么这个应用程序类如何成为 bean 定义的来源?

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class App 

    public static void main(String[] args) throws Exception 
        SpringApplication.run(App.class, args);    
    

我已经非常了解有关 Spring 的大多数其他基本概念,但我无法理解 @Configuration 的用途或哪些类应该是 @Configuration 类?有人可以帮忙吗。谢谢!!

【问题讨论】:

【参考方案1】:

你没看错。

@配置

@Configuration 是 xml 文件的模拟。通过使用@Bean 注解定义方法,此类类是 bean 定义的来源。

@Configuration 是:

不需要,如果你在调用SpringApplication.run()方法时已经在sources参数中传递了注解类; 必需,当您没有显式传递带注释的类,但它位于主配置类的 @ComponentScan 注释中指定的包中。

为了可读性,即使是显式传递为 sources 的类也可以使用 @Configuration 进行注释 - 只是为了更清楚地显示意图。

您当前的类并不是真正的 bean 定义源,因为它没有任何定义,但如果您有 @Bean 注释方法,Spring 会看到它们。

@EnableAutoConfiguration

可以在有或没有@Configuration 的情况下使用。它告诉 Spring 根据你在类路径中的内容来设置一些基本的基础设施。这是通过调用一个所谓的导入类来完成的,该类派生自@EnableAutoConfiguration 包含的@Import 注释的值。只有一个类应该用@EnableAutoConfiguration 注释,复制它不会做任何事情。

这个答案也可能有助于理解Spring Boot初始化过程:Which piece of code in Spring Boot actually registers dispatcher servlet for SpringMVC?

【讨论】:

感谢您及时明确的回答。现在很有意义。那么在这种情况下这个注释是可选的吗?事实上,我看到这个注释有点过度使用,比如在 Spring Security 中,SecurityConfig 类也用 @Configuration 注释,即使它没有任何 bean docs.spring.io/spring-security/site/docs/3.2.x/guides/… 你是对的。这是可选的,除非您希望它被自动扫描(请参阅我更新的答案)。 SecurityConfig 就是这种情况——他们对此进行了注释,以防它被自动扫描。 @ArtemNovikov 您将如何以及何时考虑/知道您的应用程序何时成为完整的 Spring Boot 应用程序?【参考方案2】:

我认为 Spring Boot 的 @SpringBootApplication 注释自动应用 @Configuration 的主要原因是允许在同一个类中添加 bean 定义。 Spring Boot 的主要目标之一是允许您快速创建应用程序而无需额外的动作。因此,通过允许您将 bean 定义直接添加到应用程序的类中,您无需创建额外的类来保存您的配置。你只有 1 节课,仅此而已。

【讨论】:

以上是关于为啥 Spring Boot Application 类需要有 @Configuration 注解?的主要内容,如果未能解决你的问题,请参考以下文章

停止许多特定的 Spring Boot 应用程序

为啥dependencyManagement中有spring-boot-dependencies?

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

在内存数据库中使用 Spring Boot 测试

不能在 Spring Boot 2(版本 2.0.0.M7)中包含 Prometheus 指标

为啥我用 spring-boot 得到 404 休息