【问题标题】:Add packages to component-scan将包添加到组件扫描
【发布时间】:2014-10-11 14:42:10
【问题描述】:

我有一个带有 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,所有@MyComponents 都将被扫描和注册。唯一的问题是原来的my-common-library 不知道新的命名空间。

我知道的一个解决方案是将更新后的 common-context.xml 添加到 my-client,看起来像

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

这当然可以,但看起来很脆弱。有没有更优雅的解决方案?

【问题讨论】:

    标签: java spring component-scan


    【解决方案1】:

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

    如果您只是重用代码,我建议显式导入 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 豆在同一个my.plugin 包中。

    如果你想要更多的控制,你可以在组件扫描中添加一个过滤器,这样你就可以只注册带有某个注解的 bean。例如,假设你定义了一个@MyPlugin 注解:

    @ComponentScan(
       basePackages = {"my.plugin"},
       includeFilters = @ComponentScan.Filter(
          value= MyPlugin.class, 
          type = FilterType.ANNOTATION
       )
    )
    

    【讨论】:

    • 有没有办法用 MyCommonLibrary 提供的自定义注释替换/包装@Import(MyCommonLibraryConfig.class)? (例如@MyCommonLibraryEnabled)
    【解决方案2】:

    我认为 Ricardo Veguilla 提出了不错的选择。但另一种(有时更好)的方法是为此目的使用弹簧启动器。您可以在依赖项中的 spring.factories 文件中声明您的 bean,并在主代码之外预配置所需的 bean。

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2019-09-26
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多