问题标签 [component-scan]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
696 浏览

java - Spring 不能使用 @ComponentScan 中带有星号的 REGEX 类型的过滤器包含/排除 bean

我正在尝试使用@ComponentScan注释的 IncludeFilters 属性管理我的 spring 应用程序加载的 bean。我使用类型的过滤器FilterType.REGEX。我想匹配任何东西作为我模式的最后一部分,但我似乎根本没有那样工作。我有一个 bean 定义:

和配置类定义:

有了这样的配置,Spring 根本找不到任何 bean。

当星号不是用来匹配模式的最后一部分而是在两者之间的某个地方使用时,那么它似乎可以正常工作。

例如,以下配置匹配所有服务没有问题:

这是框架的设计行为还是应该可以使用这种“类似蚂蚁”的正则表达式模式来匹配模式的最后一部分?

0 投票
1 回答
458 浏览

spring-boot - 查找包名 - Spring Boot 库

我正在制作一个与 Spring Boot 一起使用的库。这个库定义了一些可以在方法中使用的注解。

如何(在运行时)找到正在使用该库的应用程序包?
我需要这个来扫描带注释的方法。

0 投票
0 回答
104 浏览

java - 在 SpringBoot 中使用 @ComponentScan 会导致错误

我已经构建了一个示例 Spring Boot 应用程序并且不想启用asset-pipeline。遵循本教程时,必须启用 @ComponentScan。但是启用它后,应用程序将无法启动并抛出以下异常:

还有我最小的工作示例:

src/main/java/hello/Application.java

src/main/java/hello/HelloController.java

构建.gradle

0 投票
2 回答
182 浏览

java - Spring Boot 组件扫描上下文

我有 10 多个 Spring Boot 应用程序,它们可以构建为 war 文件并部署在应用程序服务器中,或者单独运行。每个应用程序都包含业务运营所需的唯一代码、功能和 RESTful 服务。

我的包结构如下:

服务 A、B 和 C 都被打包并作为战争运行。

但是,我还想提供启动一个包含所有服务的“大型”服务器的选项,而不必单独启动每个应用程序或让主应用程序服务器陷入大型 Spring Boot 战争。

理想情况下,这将通过另一个 Spring Boot 应用程序使用 ComponentScan 来包含来自所有其他服务的功能。我打算让 Spring Boot 应用程序X引用服务ABC中的功能。

问题在于上下文。我的每个服务在通过应用程序服务器启动时,都会根据 war 文件的名称自动分配一个上下文。例如,如果我在应用程序A中具有安全功能,因为它包含我登录时使用的敏感信息:

/安全/登录

其中security是战争文件 (security.war) 的名称。

为了在独立运行时弥补这一点,我为上下文设置了一个应用程序属性以匹配 war 文件名server.servlet.context-path: /security。这使我可以维护使用我的任何一种部署方法部署的相同端点天气。

现在,当我使用组件扫描启动引用项目ABC的服务器X时,我失去了应用程序A中的安全上下文,我的端点现在被访问为:@ComponentScan(basePackages = {"com.package.a.*", "com.package.b.*", "com.package.c.*"})

/登录

应用程序ABC之间没有区别。

所以,我的问题是如何根据被扫描的组件维护单个上下文,甚至基于上下文的路由?

0 投票
1 回答
1129 浏览

spring-boot - 如何使用 @SpringBootApplication 注解自动检测 @ConfigurationProperties 标注的类

我正在学习 Spring Boot,并且对参考文档中的一个示例有疑问。文档的以下部分提到

6.使用@SpringBootApplication注解

单个 @SpringBootApplication 注解可用于启用这三个功能,即:

@EnableAutoConfiguration:启用 Spring Boot 的自动配置机制

@ComponentScan:对应用所在的包启用@Component扫描(见最佳实践)

@Configuration:允许在上下文中注册额外的bean或导入额外的配置类

以下示例用它启用的任何功能替换此单个注释对我来说有点混乱。这个例子

示例说明

在此示例中,Application 与任何其他 Spring Boot 应用程序一样,只是 不会自动检测 @Component-annotated 类和 @ConfigurationProperties-annotated 类, 并且显式导入用户定义的 beans(请参阅@Import)。

我在上面的示例代码中看到的唯一主要区别是它没有@ComponentScan注释。我还在 SO答案的评论部分(Stephane Nicoll 2017 年 5 月 5 日 11:07)读到 @Component 注释不建议正式自动检测 @ConfigurationProperties。所以我的假设是带有@ConfigurationProperties 的Spring 框架类没有用@Component 注释。

我还检查了@SpringBootApplication注释源,无法识别任何应该启用自动检测带@ConfigurationProperties注释的类的东西。

参考文件2.8.3。启用@ConfigurationProperties-annotated types部分显示以下扫描和自动检测@ConfigurationProperties 的方法

有了所有这些细节,我想了解

为什么在此示例中明确提到@ConfigurationProperties 注释的类不会自动检测到?以及使用@SpringBootApplication 时如何自动检测@ConfigurationProperties 注释类。

附加说明:我发现文档的先前版本当前版本之间存在细微差别。以下参考缺少当前参考

请记住,@EnableConfigurationProperties 注释也会自动应用于您的项目,以便从环境中配置任何使用 @ConfigurationProperties 注释的现有 bean

0 投票
1 回答
255 浏览

java - ComponentScan 忽略 excludeFilters(在测试中)

我不知道如何在测试中排除配置(例如,如此处 所述)。我真正想要的是忽略@WebMvcTest 中的配置,但即使是以下更简单的示例也不适合我:

为什么ExcludedBeantestExclusion()? 如何正确排除配置?

0 投票
3 回答
879 浏览

java - Spring Boot:如何包含不在我的基础包中的配置类?

我有一个相当标准的 spring boot 应用程序,它是用几个 gradle 模块的 gradle 构建的。这是目录布局:

我想做的是将共享模块中的类包含在. 请注意,并驻留在不同的基础包中。CommonSecurityConfigurationcommonserviceAServiceAApplicationCommonSecurityConfiguration

我尝试@Import(CommonSecurityConfiguration.class)在 my上使用ServiceAApplication,但这根本没有明显的效果。

唯一有效的是这样注释ServiceAApplication

这种方法有效,但对我来说似乎非常粗略- 它会导入它在org.example.common.

有一个更好的方法吗?我可以通过一一列出单个类来将它们包含到组件扫描中吗?

0 投票
0 回答
44 浏览

spring-boot - 如果我更改 basePackages,Spring 组件扫描不会加载自己的组件?

我正在尝试开始使用 Spring Boot,以便可以在未来的项目中使用它。

然而,在我实现了包含一些简单用户服务(的实现UserDetailsService)的“身份验证”库之后,我尝试将其集成到我的新 Spring Boot 应用程序中。

因为UserService它在一个单独的 JAR 中,所以我必须更改 Spring 查找的基本包,以便它们被加载。

一切都很好,我的应用程序启动,端点按预期工作。我被重定向到登录,并尝试从数据库中使用我的用户登录。这里问题就出现了。我明白了No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken

在四处挖掘之后,我发现如果删除基包类以扫描并使用内存 UserDetailService 一切都按预期工作。我想使用DaoAuthenticationProvider应该只使用我的UserDetailService实现的默认值。

当我改变basePackages或者我错过了其他东西时,Spring不会再加载这个了吗?

您可以在这里看到我尝试过的内容:(不要担心代码在 Scala 中,我只是在评估它们如何协同工作)

我也有一些简单的控制器,但我认为不值得看代码。另外...我可能可以提供自定义提供程序,但我的目的是使用现有的提供程序,因为对我来说似乎合适。

PS进一步调查1:

注 1 - 如果我使用@SpringBootApplication(scanBasePackageClasses = Array(classOf[UserService]))我可以看到DaoAuthenticationProvider加载到AuthenticationConfiguration. 但是我的WebSecurityConfigurerAdapter配置方法没有被调用。相反,org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration$DefaultConfigurerAdapter被使用。

注 2 - 如果我使用 @SpringBootApplication(scanBasePackageClasses = Array(classOf[UserService], classOf[WebSecurityConfig])) 强制加载我的WebSecurityConfig, authenticationProviders 列表为空。

所以这个WebSecurityConfig在实际使用的时候肯定是有问题的。但是......我想知道UserDetailsService如果不使用这个类,我的工作情况如何。这就是我提供它的地方,如下所示。可能 Spring 做了一些魔法并将其注入到其他地方。

PS进一步调查2:

我删除了上面的 @Bean 声明,一切都按预期工作。可能我已经自动装配我的 UserService 的事实足以让 Spring 将它注入它必须的地方。

无论如何,一些解释为什么当我使用覆盖方法时它不起作用会很有用。

0 投票
1 回答
387 浏览

spring - 从 Spring Boot 2.0.3 更新到 2.2.4 后,ComponentScan 找不到自己的自定义注解

在从 Spring Boot 2.0.3 更新到 2.2.4 之前,我们有一些注释,如下例所示:

在 ComponentScan 期间,使用此 Adapter 注释注释的类被拾取并添加到 Spring 上下文中。更新后有现在org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'XY' available

根据Spring Annotation Programming Model术语中关于 Stereotype Annotations 的一段话,我们的方法应该有效:

任何带有@Component 注解的组件都是组件扫描的候选对象。类似地,任何使用注释注释的组件本身也使用@Component 进行元注释也是组件扫描的候选对象。

我通读了 Spring Boot 2.1 和 2.2 的发行说明以及 Spring Framework 5.1 和 5.2 的发行说明,但没有发现原型注释的行为在这一点上发生了变化。

当我使用 Spring 提供的原型注释(除了我们自己的注释)来注释类时,它们会被 ComponentScan 拾取。

我也尝试@ComponentScan像这样设置自定义过滤器

但仍然得到NoSuchBeanDefinitionException

最后,我偶然发现了 Spring 框架中的这种“增强”,并想知道这是否是我问题的根源。

所以到目前为止没有任何效果,如果有人能指出我的方向来恢复我们自己的刻板印象注释再次起作用的原始行为,我会很高兴。提前致谢。

0 投票
0 回答
31 浏览

java - 组件为 HandlerExceptionResolver 扫描一个类

我有一个 HandlerExceptionResolver 类

我被告知需要对包进行组件扫描,我该怎么做?