如何在运行时设置bean类

时间:2015-06-23 16:52:05

标签: java xpages managed-bean

示例:我有一个抽象类"动物"和子类" lion"和老虎"。子类名称写在NotesDocument字段" Form"。我如何使用class" Tiger"创建名为animal的bean。或者"狮子"在运行时。

我的计划是:我用一个bean-name" animal",managed-bean-class" AnimalFactory"来制作一个bean。然后某处,哪里?,我想(伪代码)

Document doc = database.getDocById("AAAA"); //from docId parameter
String animalType = doc.getItemValueString("Form");
if (animalType.equals("Lion") return makeLionInstance();
else return makeTigerInstance();

有人能指出我正确的方向还是举个例子?

修改

我没有研究提供的任何答案......明天会这样做。

问题是我们有100k-300k的LoC项目,没有人知道它到底在做什么。它已有15年历史,有30-50名开发人员。无论如何,我们决定去网络。在java中,我们看到了将项目重写为java(很多人已经完成),删除冗余代码,定义接口等(后来,没有涉及MS对象,用LS代码替换java代码)的很好的机会......我们有6个不同的(具有类似基础)doc(form)类型与子类型,每种类型有5个不同的工作流程,这是独家的。

我不知道如何在运行时从notesdocument实例化特定的类。一种解决方法是向基类提供变量,并在运行时基于字段" Form"实例化它们。我有一种感觉,从长远来看这是不够的。

正如在我的"计划"中,我认为我对必须做的事情有一个模糊的概念。我不知道在哪里插入代码,也不知道我必须小心。

TL:DR

如何在文档字段中定义类型实例" Form"在运行时解析为托管bean。

4 个答案:

答案 0 :(得分:1)

我认为this article当时是革命性的。它帮助我控制了托管bean。从中受到启发并使工厂bean Zoo实现Map接口。您的get(String)方法将根据动物对象的名称进行实例化或检索。

您的EL / SSJS将很容易:

#{zoo.lion}
#{javascript:zoo.get("Lion").roar()}

答案 1 :(得分:0)

工厂模式就足够了,对此的增强就像用动画子类名称和值作为实际实例初始化地图一样。

animalMap.put("Lion", LionObject);
animalMap.put("Tiger", TigerObject);

从表单获取密钥并返回实例。例如,如果表单中的值是Tiger,那么您可以获得类似

的实例
animalMap.get("value passed from the map") --> animalMap.get("Tiger").

答案 2 :(得分:0)

针对特定问题有很多解决方案,它们取决于你要去哪里。

我首先要创建一个AnimalFactory接口。

interface AnimalFactory<T extends Animal> {
    T create();
}

然后,我会创建一个映射:

private final Map<String, AnimalFactory<?>> factories = initFactories();

private Map<String, AnimalFactory<?>> initFactories() {
   final Map<String, AnimalFactory<?>> factories = new HashMap<>();
   // Note, in Java 8, you can simplify these anonymous classes to "Tiger::new" and "Lion::new".
   factories.put("lion", new AnimalFactory<Lion>() {
        public void create() { return new Lion(); }
   }); 
   factories.put("tiger", new AnimalFactory<Tiger>() {
        public void create() { return new Tiger(); }
   }); 
   return map;
}

public Animal createAnimal(String type) {
   final AnimalFactory<?> factory = factories.get(type.toLowercase());
   if (factory == null) { return null; }
   return factory.create();
}

答案 3 :(得分:0)

您可以将enums用作factory模式,它们也是singleton

package com.test;

public enum AnimalFarm {

    LION(new Lion()),
    TIGER(new Tiger());

    private Animal animal;
    private AnimalFarm(Animal animal) {
        this.animal = animal;
    }

    private static Animal getAnimalByName(String name) {
        return AnimalFarm.valueOf(name.toUpperCase()).animal;
    }
}
相关问题