组件扫描应该放在哪里?

3

我有一个使用完整注释的Spring MVC应用程序。在哪里添加@componentScan最好?请告诉我这些推荐中的任何一个:

  1. 扩展AbstractAnnotationConfigDispatcherServletInitializer类的类?
  2. 扩展WebMvcConfigurationSupport类的类?
  3. 扩展WebSecurityConfigurerAdapter类的类?

我将其放置在2中,并且没有安全性问题,一切正常。当我添加了安全性之后,我遇到了无法找到userdetails服务的安全性配置问题。然后我将其移动到3。我发现其他安全性问题,并将代码放在getRootConfigClasses()方法中返回null而不是securityconfig对象。然后我遇到了控制器未找到的问题。我能够通过将componentscan放置在2中来解决它。

我想知道任何链接以及它如何工作。在这3个类中都放置@componentscan是否可以?感谢您的帮助。

1个回答

2
这取决于您项目的包树和您想要扫描的内容。如果您想要扫描所有带有这些注释的注释类,例如:@Configuration, @Component, @Repository等,请将@ComponentScan放在您的包树顶部。
您还可以使用basePackages属性来指定从哪里开始扫描。
假设您有一个应用程序包组织如下: com.app.configcom.app.config.webcom.app.servicescom.app.web.controllers 如果您想要扫描所有注释类,请将带有@ComponentScan注释的类放在com.app包中。
如果您只想扫描控制器,请添加@ComponentScan(basePackages="com.app.web.controllers") 这取决于您自己的决定。

感谢详细的回复。我能否在包com.app中只使用注释@ComponentScan放置虚拟类MyClass以扫描所有内容?还是它会从主类扫描,例如实现AbstractAnnotationConfigDispatcherServletInitializer的类?我正在尝试理解如何在不依赖于返回安全配置对象或null的情况下创建所有bean。 - chinni
1
是的,你可以这样做,同时在这个类中添加 ˋ@Configuration`。所有在 com.app 包及其子包中声明的 bean 都将被发现。如果有一天你要使用 Spring Boot 工作,最重要的是要理解这一点。 - akuma8
谢谢。我会尝试的。现在我在两个类中都放置了@componentScan。因此,无论对象以任何顺序创建,bean 都可以正常使用。 - chinni
1
如果它解决了你的问题,请接受该响应以供其他用户参考。 - akuma8

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