Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将包添加到组件扫描_Java_Spring_Component Scan - Fatal编程技术网

Java 将包添加到组件扫描

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> 这当然会奏效,但似乎相当脆弱。有没有更优雅的解决方案?在我看来,试图通过组件扫描从库中实现组件注册总是很

我有一个带有Spring容器的项目。假设此项目名为
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
   )
)