如果我有一组有用的可重用Spring组件,我如何将它们作为库提供,以便其他项目可以使用这些组件的任何子集对它们有用?
E.g。我有4个班级X1
,X2
,X3
和X4
,每个班级都注明了@Component
(或@Service
,@Controller
或其他)我想将它们捆绑到一个库中。
然后我有一个项目A,它只对使用X1
和X3
以及另一个只对使用X3
和X4
感兴趣的项目B感兴趣。
项目A和B如何选择性地仅启用他们感兴趣的组件?
我正在使用Spring Boot,所以我想我可以用@ConditionalOnProperty
注释我的每个组件,例如我可以这样注释X1
等:
@ConditionalOnProperty("x1.enabled")
@Component
public class X1 {
如果下游项目想要使用x1.enabled = true
,则必须将application.properties
添加到X1
文件中。
这是做事的方式还是有其他标准的方法来捆绑组件以供重用?
我可以想到其他方法,例如:
@ComponentScan
来扫描他们想要使用的组件包。@Component
并将它们标记为抽象,然后将其留给任何下游项目,以简单地子类化他们想要的组件并将@Component
添加到子类中。这些想法中的第一个听起来像是一个完整的黑客,第二个听起来不是那么糟糕,但是必须创建子类只是为了启用某些东西(但至少它是相当明确的你正在做的事情)。
请注意 - 我使用的是基于所有注释的配置,没有XML。
答案 0 :(得分:0)
您提出的第一个选项对我来说是个不错的选择。您可以将您的类放在不同的包中,并扫描您感兴趣的包。
但你不喜欢第一个选项,所以我建议你以下。
您可以取消类的@component并在配置中定义为bean(xml文件或@configuration类)。最后,每个项目都配置它需要的类。
然后,您可以将这些bean注入到每个项目的其他bean中。
答案 1 :(得分:0)
在阅读此问题时要消除一些困惑:
您确实可以使用@ComponentScan扫描提供的软件包名称下的每个@Component。
如果您不喜欢这样做,则可以在@Configuration中创建方法或参数,以创建要使用的每个@Component的实例。
如果创建bean的过程很复杂,则可以使用@Import从库中导入整个@Configuration。