我有以下在我的application.properties在我的启动应用程序(1.5.4.发布)
my.prefix.one.id=id01
my.prefix.one.name=one
my.prefix.two.id=id02
my.prefix.two.name=two
还有像下面这样的课
public class MyClass{
private String id;
private String name;
//getters and setters
}
如果我使用@ConfigurationProperties(prefix="my.prefix.one"),那么我得到一个带有id字段"id01"的MyClass bean。
是否有一种方法指示springboot扫描前缀为“my.prefix”的所有属性并创建多个bean。在本例中,有两个bean——id字段为“id01”的bean和id字段为“id02”的bean?
由于您使用的是springboot,您还可以执行以下操作:
@Configuration
public class AppBeanConfig {
@Bean
@ConfigurationProperties(prefix="my.prefix.one")
public MyClass myClassOne(){
return new MyClass();
}
@Bean
@ConfigurationProperties(prefix="my.prefix.two")
public MyClass myClassTwo(){
return new MyClass();
}
}
我不知道有什么有意义的方法可以避免配置单个bean。
然而,如果这是您真正想要做的,您可以访问ApplicationContext并手动处理属性并将bean注入ApplicationContext,我个人更喜欢向配置类添加多个bean方法,而不是直接操作ApplicationContext。
我也尝试过类似的方法,据我所知,创建多个实例的唯一方法是获取具有指定前缀的所有属性,然后自己解析它们。对于您的示例,您可以构建一个@配置
,如下所示:
@Configuration
public class MyConfig {
@Bean
@ConfigurationProperties(prefix = "my.prefix")
protected Map<String, String> myProperties() {
return new HashMap<>();
}
@Bean
public List<MyClass> myObjects(@Qualifier("myProperties") final Map<String, String> myProperties) {
final Map<String, Map<String, String>> mappedSources = new HashMap<>();
myProperties.forEach((key1, value) -> {
final String[] key = key1.split("\\.");
final Map<String, String> myInstanceParams = mappedSources.computeIfAbsent(key[0], s -> new HashMap<>(2));
myInstanceParams.put(key[1], value);
});
return mappedSources.values().stream()
.map(stringStringMap -> new MyClass(stringStringMap.get("id"), stringStringMap.get("name")))
.collect(Collectors.toList());
}
}
在这个简单的例子中,@Qualifier
在myObjects()
参数列表中不需要,但是如果您在想要执行类似操作的地方引入第二个前缀,那么您需要限定要将哪个字符串映射传递到myObjects()
方法中,因此我建议从一开始就包含它。
这是一个简单的示例,但更健壮的实现将检查缺少的属性和属性有效性等。我也不能说这个解决方案是否是良好实践/良好的Spring实践。
您应该在MyClass
中使用springs@ConfigurationProperties
和heve嵌套类
@ConfigurationProperties(prefix="my.prefix")
public class MyClass{
private One id01;
private Two id02;
//GETTER SETTER
public static class One {
private String id;
// GETTER SETTER
}
public static class Two {
private String id;
// GETTER SETTER
}
}
然后你可以像这样访问它
myClass.getOne().getId();
你最好通读https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties
更新:OP不想使用嵌套类来检索这些字段
@ConfigurationProperties(prefix="my.prefix")
public class MyClass{
private String id01;
private String id02;
@NotNull
private One one;
@NotNull
private Two two;
public getId01(){
return one.id;
}
public getId02(){
return two.id;
}
public static class One {
private String id;
// GETTER SETTER
}
public static class Two {
private String id;
// GETTER SETTER
}
}
现在你可以像这样使用它们
myClass.getId01();
myClass.getId02();
在AWS生命周期管理中,我们是否可以创建一个带有多个前缀的规则。我浏览了这个博客https://docs.aws.amazon.com/amazons3/latest/dev/manage-lifecycle-using-dot-net.html 但是这个文档只展示了一个规则和一个前缀的示例
我有两个版本的应用程序: > 没有广告。 我的应用程序中有订阅。我想在这些应用程序之间共享一个订阅。例如这样一个场景: 用户在应用程序中购买带有广告的订阅,然后购买没有广告的应用程序。我想将第一个应用程序中的订阅分享给第二个应用程序。有没有可能使用标准的谷歌账单库?
我必须根据tenantIdentifier创建一个数据源bean以实现多租户。我正在考虑开箱即用的解决方案,添加新租户就像在context.xml中添加配置和在应用程序属性文件中添加租户属性一样简单,公开一个API来刷新我的context.xml以便从spring cloud config和属性文件中加载。 目前,我被这个错误所困扰: 我的DataSourceFactoryBean如下所示: 我有
在我的默认SpringBoot应用程序中,它具有依赖项,调用(带有)返回以下信息 但是,我的机器上有两个驱动器,所以我想查看它们的磁盘空间详细信息。所以我添加了一个配置文件: 现在,我的健康endpoint返回以下数据 (稍后我将考虑如何抑制默认的“diskSpace”条目) 然而,由于我可能想在不同的机器上运行我的应用程序,我想配置磁盘驱动器,以便在我的文件。 还加上 配置在启动期间加载并记录到
由于我是JavaFx的新手,当然还有spring jdbc的新手,所以我处于阻塞状态。我的应用程序几乎准备就绪,我甚至使用inno setup为windows创建了安装文件。此安装文件在我的系统上运行良好,但当我在另一个系统上运行时,它不会运行;可能是由于缺少数据库及其服务器。因此,我需要一个独立的应用程序,通过安装程序管理所有数据库和其他需求。经过研究,我发现许多人建议使用Sqlite或hsql
嗨,我只是想知道有没有可能创建一个通用类来确认ObserveObject协议,它可以被多个ContentView使用。 如果我能做到这一点,那么我将能够使我的ContentView和Model类完全通用和可重用。 我希望实现的一个例子: 如果我能做到这一点,任何类都可以实现ContentViewModelType,并成为ContentView的模型,使其通用且可重用。举个例子 但是当我尝试初始化C