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

时间:2017-03-15 15:58:24

标签: java spring spring-boot

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

E.g。我有4个班级X1X2X3X4,每个班级都注明了@Component(或@Service@Controller或其他)我想将它们捆绑到一个库中。

然后我有一个项目A,它只对使用X1X3以及另一个只对使用X3X4感兴趣的项目B感兴趣。

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

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

@ConditionalOnProperty("x1.enabled")
@Component
public class X1 {

如果下游项目想要使用x1.enabled = true,则必须将application.properties添加到X1文件中。

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

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

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

这些想法中的第一个听起来像是一个完整的黑客,第二个听起来不是那么糟糕,但是必须创建子类只是为了启用某些东西(但至少它是相当明确的你正在做的事情)。

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

2 个答案:

答案 0 :(得分:0)

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

但你不喜欢第一个选项,所以我建议你以下。

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

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

答案 1 :(得分:0)

在阅读此问题时要消除一些困惑:

  • 在方法/参数名称之前(在您的@Configuration中)使用@Bean将创建一个与该方法/参数相同的bean(默认情况下)。名为myThing()的函数将创建一个名为“ myThing”的bean
  • 在类名之前使用@Component将创建一个具有相同名称的bean,但首字母小写。名为MyThing的类将创建一个名为“ myThing”的bean

您确实可以使用@ComponentScan扫描提供的软件包名称下的每个@Component。

如果您不喜欢这样做,则可以在@Configuration中创建方法或参数,以创建要使用的每个@Component的实例。

如果创建bean的过程很复杂,则可以使用@Import从库中导入整个@Configuration。