为什么Spring Boot应用程序类需要有@Configuration注解?

56

我正在学习Spring Framework,但是我不理解@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类?有人可以帮帮我吗?谢谢!!


我认为这个线程需要重新打开,因为从截图中可以看出,你应该始终具有源参数,否则它会失败: https://prnt.sc/gdFy9W1n0ncg - Stan
2个回答

48

你理解的没错。

@Configuration

@Configuration 是 xml 文件的一种模拟,这些类通过定义带有 @Bean 注释的方法来提供 bean 定义。

@Configuration

  • 在调用 SpringApplication.run() 方法时,如果已经将带有注释的类作为参数传递,则不需要使用 @Configuration
  • 如果未显式传递注释类,但它位于主配置类中指定的包中,则需要使用 @Configuration

为了提高可读性,即使明确作为 sources 传递的类也可以使用 @Configuration 进行注释 - 只是为了更清晰地展示意图。

您当前的类实际上并不是 bean 定义的源,因为它并没有任何 bean 定义,但如果您有使用 @Bean 注释的方法,Spring 将会看到这些方法。

@EnableAutoConfiguration

可以与或不与 @Configuration 一起使用。它告诉 Spring 根据类路径设置一些基本的基础设施。它是通过调用一个被称为导入类的东西来实现的,该导入类是从 @Import 注释的值派生而来,该注释包含在 @EnableAutoConfiguration 中。只应使用一个类来注释 @EnableAutoConfiguration,重复使用它不会产生任何效果。

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


感谢您的迅速和清晰的回答,现在我理解了很多。那么在这种情况下,这个注释是可选的吗?实际上,我发现这个注释有点过度使用,比如在Spring Security中,即使SecurityConfig类没有任何bean,也会被注释为@Configuration。http://docs.spring.io/spring-security/site/docs/3.2.x/guides/helloworld.html - varunkr
1
你说得对。这是可选的,除非你想让它自动扫描(请参见我的更新答案)。这就是SecurityConfig的情况 - 他们注释了这个只是为了以防它被自动扫描。 - Artem Novikov
我尝试过不传递源代码,但失败了。我认为这个答案并不比第二个更正确: https://prnt.sc/x7Etuf-_CaNz https://prnt.sc/gdFy9W1n0ncg - Stan
@Stan 你好,请注意我并没有说run()可以不带任何参数运行。请仔细检查,我是在提到Configuration和EnableAutoConfiguration的区别。 - Artem Novikov
1
@Stan 我的意思是 SpringApplication 不需要 @Configuration,因为该类已经在 run(...) 中传递。它接受数组,但至少需要一个项目。其他未包含在该数组中的类必须具有 @Configuration(并匹配 @ComponentScan 路径),以便它们被检测到。希望现在更清楚了。 - Artem Novikov
显示剩余3条评论

16

我认为,Spring Boot 的 @SpringBootApplication 注解自动应用 @Configuration 的主要原因是为了允许在同一个类中添加Bean定义。Spring Boot 的主要目标之一是让您快速创建应用程序,而无需额外的操作。因此,通过允许您在应用程序的类中添加Bean定义,您不需要创建额外的类来保存配置。您只需要一个类,就可以完成这个目标。


很抱歉,您的答案也不正确。从图片中可以看出,即使没有注释,bean 仍然被提供:https://prnt.sc/PoHYAgutmNXh - Stan

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