Dozer BeanFactory:如何实现它?

时间:2010-12-09 15:19:55

标签: javabeans factory dozer

我查看了Dozer的常见问题解答和文档,包括SourceForge论坛,但我没有看到任何好的教程,甚至没有看到如何实现自定义 BeanFactory 的简单示例。

每个人都说,“只需实现一个BeanFactory”。你究竟是如何实现它的?

我用Google搜索,我所看到的只是罐子和罐子的来源。

3 个答案:

答案 0 :(得分:1)

这是我的一个BeanFactories,我希望它有助于解释常见的模式:

public class LineBeanFactory implements BeanFactory {

    @Override
    public Object createBean(final Object source, final Class<?> sourceClass, final String targetBeanId) {

        final LineDto dto = (LineDto) source;

        return new Line(dto.getCode(), dto.getElectrified(), dto.getName());

    }

}

以及相应的XML映射:

<mapping>

        <class-a bean-factory="com.floyd.nav.web.ws.mapping.dozer.LineBeanFactory">com.floyd.nav.core.model.Line</class-a>
        <class-b>com.floyd.nav.web.contract.dto.LineDto</class-b>

</mapping>

这样我声明当需要一个 new Line实例时,它应该用我的BeanFactory创建它。这是一个单元测试,可以解释它:

@Test
public void Line_is_created_with_three_arg_constructor_from_LineDto() {

    final LineDto dto = createTransientLineDto();

    final Line line = (Line) this.lineBeanFactory.createBean(dto, LineDto.class, null);

    assertEquals(dto.getCode(), line.getCode());
    assertEquals(dto.getElectrified(), line.isElectrified());
    assertEquals(dto.getName(), line.getName());

}

所以对象源是映射的源bean,类sourceClass 是源bean的类(我忽略它,因为它总是会一个LineDto实例)。 String targetBeanId 是目标bean的ID(太被忽略)。

答案 1 :(得分:0)

自定义bean工厂是一个具有创建bean的方法的类。有两种“味道”

a)静态创建方法

SomeBean x = SomeBeanFactory.createSomeBean();

b)实例创建方法

SomeBeanFactory sbf = new SomeBeanFactory();
SomeBean x = sbf.createSomeBean();

如果创建和设置bean需要一些棘手的逻辑,那么您将创建一个bean工厂,例如某些属性的初始值取决于外部配置文件。 bean工厂类允许您集中关于如何创建这样一个棘手的bean的“知识”。其他类只调用create方法而不知道如何正确创建这样的bean。

答案 2 :(得分:0)

这是一个实际的实现。显然它没有多大意义,因为Dozer会在没有BeanFactory的情况下做同样的事情,但是不仅仅是返回一个对象,你可以用不同的方式初始化它。

public class ComponentBeanFactory implements BeanFactory {

    @Override
    public Object createBean(Object source, Class<?> sourceClass,
            String targetBeanId) {
        return new ComponentDto();
    }

}

为什么你还需要一个BeanFactory?也许这有助于理解你的问题。