我有一个常见的情况:我有一个场景,其中对象创建由构建器处理。 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方法(不显式设置属性)并最终调用构建来获取服务对象来完成。如果可能的话,它将如何实现?
答案 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源代码: