Java 将包添加到组件扫描
我有一个带有Spring容器的项目。假设此项目名为Java 将包添加到组件扫描,java,spring,component-scan,Java,Spring,Component Scan,我有一个带有Spring容器的项目。假设此项目名为mycommonlibrary,并使用名称空间my.common。它扫描这个名称空间中的所有组件,如common context.xml中指定的,如下所示 <beans ...> <context:component-scan base-package="my.common"/> </beans> 这当然会奏效,但似乎相当脆弱。有没有更优雅的解决方案?在我看来,试图通过组件扫描从库中实现组件注册总是很
mycommonlibrary
,并使用名称空间my.common
。它扫描这个名称空间中的所有组件,如common context.xml
中指定的,如下所示
<beans ...>
<context:component-scan base-package="my.common"/>
</beans>
这当然会奏效,但似乎相当脆弱。有没有更优雅的解决方案?在我看来,试图通过组件扫描从库中实现组件注册总是很脆弱的 如果只是重用代码,我建议显式导入
mycommonlibrary
依赖项。例如,使用基于Java的Spring配置:
@Configuration
@ComponentScan("my.common")
public class MyCommonLibraryConfig {
}
关于“我的客户”:
@Configuration
@Import(MyCommonLibraryConfig.class)
@ComponentScan("my.client")
public class MyClientConfig {
}
由于myclient
始终依赖于mylibrary
,因此最好明确定义依赖关系
另一方面,如果您真正想要实现插件系统之类的东西,那么您需要使用一些基于包的约定来发现依赖项,因为使用依赖项的组件直到运行时才知道其依赖项是什么
在这种情况下,我建议定义一个注册包名称,例如my.plugin
,然后依赖于插件的组件的Spring配置只需要在my.plugin
上定义组件扫描,每个插件只需在相同的my.plugin
包中定义其@组件
或@配置
bean
如果您想要更多的控制,您可以在组件扫描中添加一个过滤器,这样您就只能用特定的注释注册bean。例如,假设您定义了一个@MyPlugin
注释:
@ComponentScan(
basePackages = {"my.plugin"},
includeFilters = @ComponentScan.Filter(
value= MyPlugin.class,
type = FilterType.ANNOTATION
)
)
我认为里卡多·维圭拉提出了一个好的选择。但另一种(有时更好)方法是使用弹簧起动器。您可以在依赖项内的spring.factories文件中声明bean,并在主代码外预配置所需的bean。是否有方法用MyCommonLibrary提供的自定义注释替换/包装
@Import(MyCommonLibraryConfig.class)
?(es.@MyCommonLibrary已启用)
@ComponentScan(
basePackages = {"my.plugin"},
includeFilters = @ComponentScan.Filter(
value= MyPlugin.class,
type = FilterType.ANNOTATION
)
)