什么是在Spring中将@Configuration与@ComponentScan一起使用的特定用例?

时间:2017-10-09 20:15:17

标签: java spring annotations

我正在尝试理解在Spring中使用xml注释到基于java的注释的过渡。我有这些定义

<context:annotation-config>: Scanning and activating annotations for already registered beans in spring config xml.

<context:component-scan>: Bean registration + <context:annotation-config>

是@Configuration,是@ComponentScan。

如果我说我用@Component声明我的所有bean(首先忽略像@ Repository,@ Service等更具体的那些)注释,并确保包被@ComponentScan注释扫描,具体用途是什么我仍然会使用@Configuration和@ComponentScan一起注释我的类?

我问这个问题,因为有时我会看到同时使用@Configuration和@ComponentScan注释的类。

2 个答案:

答案 0 :(得分:1)

首先仔细阅读以下内容:

Difference between <context:annotation-config> vs <context:component-scan>

因此<context:component-scan>执行扫描作业的工作与<context:annotation-config>相同,这意味着要解决DI问题。注释

然后考虑:

  • <context:component-scan>相当于@ComponentScan
  • <context:annotation-config>没有等效的注释。
  

什么是特定的用例,我仍然会对我的课程进行注释   同时使用@Configuration和@ComponentScan?

@Configuration用于定义有关 Infastructure 的bean,例如DatabaseJMS等...

是的,一个类可以同时使用它们,例如可以用于 MVC基础结构 @Configuration,例如:

@EnableWebMvc
@Configuration
@ComponentScan("com.manuel.jordan.controller", "com.manuel.jordan.rest")
public class WebMvcConfig extends WebMvcConfigurerAdapter {

因此,从该类开始,您正在配置MVC并指示来扫描您为“web side”创建的MVC类,例如:{{1} },@Controller

答案 1 :(得分:0)

这实际上取决于你的喜好和编码风格。文档说明:

  

可以指定basePackageClasses()或basePackages()(或其别名value())来定义要扫描的特定包。如果未定义特定包,则将从声明此批注的类的包中进行扫描。

因此,每次只看到@ComponentScan注释时,这意味着应扫描所有子包。对于每个功能布局,这是一种合理的方法:当您的功能具有@Configuration类时,以及与子包中的功能相关的所有@Components