当前位置: 首页 > 知识库问答 >
问题:

是否可以根据应用程序中的前缀创建多个bean。springboot中的属性

蒋啸
2023-03-14

我有以下在我的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?

共有3个答案

孔斌
2023-03-14

由于您使用的是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。

贝杜吟
2023-03-14

我也尝试过类似的方法,据我所知,创建多个实例的唯一方法是获取具有指定前缀的所有属性,然后自己解析它们。对于您的示例,您可以构建一个@配置,如下所示:

@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());
    }
}

在这个简单的例子中,@QualifiermyObjects()参数列表中不需要,但是如果您在想要执行类似操作的地方引入第二个前缀,那么您需要限定要将哪个字符串映射传递到myObjects()方法中,因此我建议从一开始就包含它。

这是一个简单的示例,但更健壮的实现将检查缺少的属性和属性有效性等。我也不能说这个解决方案是否是良好实践/良好的Spring实践。

蓟浩旷
2023-03-14

您应该在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