【问题标题】:cleanest way to create multiple beans of the same class with different properties创建具有不同属性的同一类的多个 bean 的最干净的方法
【发布时间】:2015-06-17 00:58:28
【问题描述】:

假设我有这个属性文件:

students.bill.firstname=John
students.bill.lastname=Doe
students.bill.age=20
students.jim.firstname=Jim
students.jim.lastname=Wright
students.jim.age=21
.
.
.

我想要一个包含学生地图的 xml bean,其中学生的名字作为键。

对象示例:

学生.java

public class Student {
    String firstname;
    String lastname;
    Integer age;
}

教室.java

public class Classroom {
    Map<String, Student> students;
}

我正在寻找一种方法,可以说是从属性 students.bill.* 创建一个学生 bean 并将其添加到教室 bean 映射中。然后为students.jim.*制作一个并将其添加到教室bean地图中。我真的不想为每个学生创建一个 bean,然后将每个值都放入其中。

【问题讨论】:

  • 我会直接做你提到的“为每个学生创建一个 bean”,它会非常快速且易于维护。
  • 唯一不好的是,如果我想在未来添加一个新属性,我将不得不将它添加到属性和每个 bean 中,而不仅仅是属性和一个模板 bean跨度>
  • 使用docs.oracle.com/javase/7/docs/api/java/util/…,然后解析键提取所有值。
  • 说这些都是全局会话 bean。我将如何使用 propertyNames 来初始化它们?我是春天的新手。我会在哪里做这个逻辑?

标签: java spring dependency-injection spring-bean spring-properties


【解决方案1】:

自 Spring 0.9 起,Spring 已经开箱即用地支持这一点(但知道这一点的人并不多)。

您需要稍微修改您的属性文件。

student.(class)=your.package.here.Student
student.(abstract)=true

jim.(parent)=student
jim.firstname=Jim
jim.lastname=Wright
jim.age=21
... Other student based definitions here.

现在您可以将BeanFactoryPropertiesBeanDefinitionReader 一起使用

DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(bf);
reader.loadBeanDefinitions(new ClassPathResource("students.properties"));
Map<String, Student> students = bf.getBeansOfType(Student.class);

现在,如果您有一个新学生,只需将其添加到属性文件并重新加载。

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多