gpt4 book ai didi

java - Spring Boot启动器根据属性注入(inject)bean

转载 作者:行者123 更新时间:2023-12-01 20:55:06 31 4
gpt4 key购买 nike

最近,我正在开发一个 Spring Boot 启动器,为客户端代码提供 ServiceA 。我想提供配置属性:

my.namespace.serviceA=impl1    #or other implemtations

my.namespace.serviceA.impl1.prop1=ServiceAImpl1Prop1Val
my.namespace.serviceA.impl1.prop2=ServiceAImpl1Prop2Val
# some other properties of ServiceA

我还为 ServiceA 的不同实现添加了几个带有注释 @ConfigurationProperties 的 Bean 类,因为 springboot 会自动将这些属性加载到这些 bean 中。

我的初学者想给客户端代码一个ServiceA的接口(interface),以便它可以用作:

@Autowire
private ServiceA serviceA;

我需要提供一个工厂方法,例如:

@Bean
public ServiceA serviceA() {
//TODO load my.namespace.serviceA and create the corresponding
//instance of ServiceA Implementation with given properties
}

由于属性根据不同的实现而变化,是否有一种优雅的方式来利用@ConfigurationProperties利用属性bean来实现此类工厂方法?

最佳答案

从表面上看,你的答案是 90%。

您可以将 ServiceA 标记为组件,而无需手动创建 bean,Spring 组件扫描将为您创建 bean。

查看 ServiceA 的实现

@ConfigurationProperties(prefix = "my.namespace.serviceA.impl1")
@Component
public ConcreteA implements ServiceA {
private String prop1;
private String prop2;
}

编辑

基于您想要一个 ServiceA 实例这一事实,您仍然需要使用 @ConfigurationProperties 注释您的类,但删除 @Component

@ConfigurationProperties(prefix = "my.namespace.serviceA.impl1")
public ConcreteA implements ServiceA {
private String prop1;
public void setProp1(String s) {
prop1 = s;
}
}

您的属性必须至少有 setter 。

然后在您创建 bean 的配置类中

@ConfigurationProperties(prefix = "my.namespace")
@Configuration
public SomeConfig {
private String serviceA;

public void setServiceA(String s) {
serviceA = s;
}

@Bean
public ServiceA serviceA() {
if (serviceA.equals("ConcreteA1")) {
return new ConcreteA1();
} else {
return new ConcreteA2();
}
}
}

使用 if 语句的方法实际上打破了开放/封闭原则,内省(introspection)是更好的方法,但我认为您明白了。

关于java - Spring Boot启动器根据属性注入(inject)bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504191/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com