是否可以使用Spring Java @configuration避免编译时依赖关系



是否有一种方法可以使用基于Spring Java的配置来声明Bean而无需编译时间检查,以便我可以在运行时提供接口实现?

例如,当我编写JAX-RS客户端时,我使用JAX-RS API而不参考特定的API实现。在我的Spring XML配置中,我声明了我要使用的JAX-RS API的实际实现,例如泽西岛设置客户端bean时。由于在运行时使用(并进行了验证(基于XML的配置,因此我不需要对泽西岛的编译时间依赖性。这使我可以将<scope>runtime</scope> MAVEN依赖性与泽西岛(Jersey(相关,而我必须对JAX-RS API具有<scope>compile</scope>依赖关系。这种方法的好处是,如果我不小心使用该实现,我的应用程序将不会与Maven进行编译。

另一方面,如果我使用基于Java的弹簧配置(使用@Configuration(来声明我的bean,则我必须对API的实现具有编译时间依赖性,因为配置本身是编译的。

如果基于Java的配置无法实现这一点,是否有其他选择(除了使用基于XML和Java的配置的组合,我知道这是可能的(?

简短答案

是的:(

长答案

除了描述的方式外,Spring Boot从开箱即用。

这是Spring Boot的方式,其自动配置魔术。仅在编译时间内仅在Core Spring Boot启动库中提供很多选项。但是,当运行时的类路径上可以使用必要的库(或确切的类(时,可以使用实际实施。

Spring Boot为此提供了专门注释:@ConditionalOnClass。我建议阅读此部分弹簧靴文档以熟悉该主题。

供您的Java配置进行编译,其中包含的所有类都必须在编译时间访问。

您可以将@configuration root类移至另一个Maven模块,分别编译主模块和特定模块,并且没有您不想在主模块中拥有的依赖项;然后引用特定的@configuration root类加载您的春季上下文(例如,通过contextConfigLocation上下文参数(。

,或者您可以在@configuration中使用肮脏的Class.forName() newInstance()技术。

当然,您提到的选项(@configuration 基于XML的配置的混合(也是可能的。

最新更新