如何初始化遵循Builder模式的bean

时间:2015-03-22 19:10:13

标签: java spring

我有一个常见的情况:我有一个场景,其中对象创建由构建器处理。 e.g。

Class Client; // Creates a builder object.
Class Builder; // Can be used to set the desired params and then invoke build on it to return Service object.
e.g.-
client.createBuilder().withDefaultBinding(new StandardBinder())
            .withDefaultMetricsFactory(new StandardMetricsFactory())
            .withCacheSolution(cacheSolution)
            .build();

但是,Builder没有标准的setter。它执行一些任务,然后将结果设置为Builder的内部对象,因此不能将它们视为属性。

我读过:Spring: Using builder pattern to create a bean

我想调用构建器以使用Spring XML配置完全检索最终对象。 我不想自己创建一个工厂 - 我想知道是否有一种方法可以使用开箱即用的Spring XML配置来生成上述场景中的服务对象?我对Spring的理解给我的印象是,这可以通过在构建器对象上调用一组setter方法(不显式设置属性)并最终调用构建来获取服务对象来完成。如果可能的话,它将如何实现?

3 个答案:

答案 0 :(得分:8)

没有办法用XML开箱即用。为您需要的所有值定义具有适当属性(setter)的FactoryBean,并声明该自定义FactoryBean类型的bean。

答案 1 :(得分:0)

当我无法“修复”构建器,并且只能调整配置,而不能调整代码时,我已经使其正常工作。

  • 定义一个使用“客户端”作为工厂bean并使用“ createBuilder”作为工厂方法的bean。

  • 定义另一个使用该bean作为工厂bean并使用“ withDefaultBinding”作为工厂方法的bean。

  • 定义另一个使用该bean作为工厂bean并使用“ withDefaultMetricsFactory”作为工厂方法的bean。

  • 定义另一个使用该bean作为工厂bean并使用“ withCacheSolution”作为工厂方法的bean。

  • 最后定义您使用该bean作为工厂bean并使用“ build”作为工厂方法的构建bean。

  • 除最后一个bean以外的所有对象实际上都指向内存中的同一对象,但这并不重要。

答案 2 :(得分:0)

我确实有类似的情况:

@Value("${some.property}") 
String someProperty

@Bean
public JwtDecoder jwtDecoder() {
    NimbusJwtDecoder.withJwkSetUri(someProperty).build();
}

这就是我所做的:

<bean id="jwtDecoder" class="org.springframework.security.oauth2.jwt.NimbusJwtDecoder" factory-bean="jwtDecoderBuilder" factory-method="build"/> <!-- factory-bean -->

<bean id="jwtDecoderBuilder" class="org.springframework.security.oauth2.jwt.NimbusJwtDecoder" factory-method="withJwkSetUri">  <!-- NO factory-bean -->
    <constructor-arg name="jwkSetUri" value="${some.property}"/>
</bean>

NimbusJwtDecoder源代码:

https://github.com/spring-projects/spring-security/blob/5.2.2.RELEASE/oauth2/oauth2-jose/src/main/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoder.java