gpt4 book ai didi

java - 将包添加到组件扫描

转载 作者:行者123 更新时间:2023-12-03 10:58:05 24 4
gpt4 key购买 nike

我有一个带有 Spring 容器的项目。假设这个项目名为 my-common-library并使用命名空间 my.common .它扫描此命名空间中的所有组件,如 common-context.xml 中所述。看起来像以下

<beans ...>
<context:component-scan base-package="my.common"/>
</beans>

除其他外,此扫描检测用 @MyComponent 注释的类。 .

现在我想尽可能充分地重用这个项目。假设我开始了一个新项目 my-client在命名空间 my.client 中使用. my-client主要由带有 @MyComponent 注释的组件组成.

在理想的世界中,我只会添加依赖项 my-common-library和所有 @MyComponent s 将被扫描和注册。唯一的问题是新的命名空间对于原始 my-common-library 来说是未知的。 .

我知道的一种解决方案是添加更新的 common-context.xmlmy-client看起来像
<beans ...>
<context:component-scan base-package="my.common,my.client"/>
</beans>

这肯定会奏效,但似乎很脆弱。也许有更优雅的解决方案?

最佳答案

在我看来,尝试通过组件扫描从库中实现组件注册总是很脆弱的。

如果您只是重用代码,我建议明确导入 my-common-library依赖性。例如,使用基于 Java 的 Spring 配置:

@Configuration
@ComponentScan("my.common")
public class MyCommonLibraryConfig {


}

在“我的客户”上:
@Configuration
@Import(MyCommonLibraryConfig.class)
@ComponentScan("my.client")
public class MyClientConfig {

}

my-client始终取决于 my-library ,最好明确定义依赖项。

另一方面,如果您真正想要实现诸如插件系统之类的东西,那么您将需要使用一些基于包的约定来发现依赖项,因为使用依赖项的组件直到运行时才知道它的依赖项是什么。

在这种情况下,我建议定义一个注册包名称,例如 my.plugin ,那么依赖插件的组件的Spring配置只需要在 my.plugin上定义组件扫描即可, 每个插件只需要定义它的 @Components或其 @Configurations bean 在同 my.plugin包裹。

如果你想要更多的控制,你可以在组件扫描中添加一个过滤器,这样你就可以只注册带有某个注解的 bean。例如,假设您定义了一个 @MyPlugin注解:
@ComponentScan(
basePackages = {"my.plugin"},
includeFilters = @ComponentScan.Filter(
value= MyPlugin.class,
type = FilterType.ANNOTATION
)
)

关于java - 将包添加到组件扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com