是否有一种方法可以使用基于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的配置的混合(也是可能的。