为啥 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 注解?的主要内容,如果未能解决你的问题,请参考以下文章
为啥dependencyManagement中有spring-boot-dependencies?
为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?