Dozer BeanFactory: как это реализовать? - PullRequest
1 голос
/ 09 декабря 2010

Я просмотрел часто задаваемые вопросы и документы по Dozer, включая форум SourceForge, но я не увидел ни одного хорошего руководства или даже простого примера того, как реализовать пользовательскую BeanFactory .

Все говорят: «Просто внедрите BeanFactory». Как именно вы это реализуете?

Я гуглил и вижу только банки и источники банок.

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Вот одна из моих 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>

Таким образом, я заявляю, что когда требуется новый экземпляр 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());

}

Итак, Источник объекта - это сопоставляемый исходный компонент, Класс sourceClass - это класс исходного компонента (я его игнорирую, потому что он всегда будет LineDto. пример). String targetBeanId - идентификатор целевого компонента (слишком игнорируется).

0 голосов
/ 17 декабря 2010

Вот фактическая реализация. Очевидно, это не имеет большого смысла, поскольку Dozer сделал бы то же самое без BeanFactory, но вместо простого возврата объекта вы могли бы инициализировать его как-то иначе.

public class ComponentBeanFactory implements BeanFactory {

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

}

Зачем вам нужен BeanFactory? Может быть, это поможет понять ваш вопрос.

0 голосов
/ 09 декабря 2010

Пользовательская фабрика бинов - это класс, у которого есть метод, который создает бин.Существует два «вкуса»

а) статический метод создания

SomeBean x = SomeBeanFactory.createSomeBean();

б) метод создания экземпляра

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

При создании и настройке вы бы создали фабрику компонентовДля вашего компонента требуется некоторая хитрая логика, например, начальное значение определенных свойств зависит от внешнего файла конфигурации.Класс фабрики бинов позволяет вам централизовать «знания» о том, как создать такой сложный бин.Другие классы просто вызывают метод create, не задумываясь о том, как правильно создать такой компонент.

...