我正在尝试理解在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注释的类。
答案 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,例如Database
,JMS
等...
是的,一个类可以同时使用它们,例如可以用于 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
。