是否可以根据springboot中application.properties中的前缀创建多个bean

时间:2018-03-09 00:18:44

标签: java spring spring-boot

我在springboot应用程序的application.properties中有以下内容(1.5.4.RELEASE)

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(前缀=" my.prefix.one"),那么我会得到一个带有id字段" id01"的MyClass bean。

有没有办法指示springboot扫描扫描所有带有前缀" my.prefix"的属性?并创建多个bean。在这种情况下,两个bean - 具有id字段的bean" id01"和带有id字段的bean" id02" ?

3 个答案:

答案 0 :(得分:0)

您应该使用spring @ConfigurationProperties并在MyClass

中使用嵌套类
@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();

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

如果一个,两个的属性相同,则只需使用相同的类。 Lombok帮助您自动创建getter / setter方法,以使其正常运行

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix="my.prefix")
public class MyClass {

  private Child one;
  private Child two;

  @Getter
  @Setter
  public static class Child {

    @NotNull
    private String id;
    @NotNull
    private String name;
  }
}