将 Spring 组件捆绑到一个库中以便其他项目可以选择使用其中的一些组件?

Geo*_*ins 5 java spring spring-boot

如果我有一组有用的可重用 Spring 组件,如何将它们作为库提供,以便其他项目可以使用这些组件中对它们有用的任何子集?

例如,我有 4 个类,X1X2X3,每个类都用(或,或其他)X4注释,我想将它们捆绑到一个库中。@Component@Service@Controller

然后我有一个项目 A 只对使用X1和感兴趣X3,另一个项目 B 只对使用X3和感兴趣X4

项目 A 和 B 如何选择性地启用他们感兴趣的组件?

我正在使用 Spring Boot,所以我想我可以用 注释我的每个组件@ConditionalOnProperty,例如我可以注释X1等,如下所示:

@ConditionalOnProperty("x1.enabled")
@Component
public class X1 {
Run Code Online (Sandbox Code Playgroud)

然后下游项目x1.enabled = true如果application.properties想要使用X1.

这是做事的方式还是有其他一些标准方法来捆绑组件以供重用?

我可以想到其他方法,例如:

  • 将每个组件放在自己的包中,然后下游项目可以用来@ComponentScan仅扫描他们想要使用的组件的包。
  • 我可以放弃@Component组件类并将它们标记为抽象,然后将其留给任何下游项目,以简单地对它们想要的组件进行子类化并添加@Component到子类中。

第一个想法听起来像是一个完整的黑客,第二个听起来并没有那么糟糕,但人们必须简单地创建子类才能启用某些功能(但至少它相当明确你正在做什么)。

请注意 - 我使用的是完全基于注释的配置,没有 XML。

reo*_*eos 0

您提出的第一个选项对我来说是一个不错的选择。您可以将类放在不同的包中,然后扫描您感兴趣的包。

但您不喜欢第一个选项,所以我建议您执行以下操作。

您可以去掉类的@component,并将其定义为配置中的bean(xml 文件或@configuration 类)。最后,每个项目配置它需要的类。

然后,您可以将这些 Bean 注入到每个项目的其他 Bean 中。