2010-12-09 3 views
1

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

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

У меня Googled, и все, что я вижу, это просто банки и источники банок.

ответ

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> 

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

0

Пользовательская фабрика bean - это класс, который имеет метод, который создает компонент. Есть два «ароматы»

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

SomeBean x = SomeBeanFactory.createSomeBean(); 

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

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

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

+0

Спасибо за ответ. Я думаю, что я не очень понял свой вопрос. Я действительно искал фактическую реализацию. Трудная часть - сложная логика. – chris 2010-12-10 01:05:01

+0

Рассмотрим пример реального мира: Spring Framework. Когда ваше приложение нуждается в определенном компоненте, оно вызывает (косвенно) BeanFactory.getBean (имя строки). BeanFactory обладает знаниями обо всех определениях бобов (обычно загружается из файла XML) и выполняет все необходимые настройки проводки/свойств. Когда BeanFactory.getBean() вернется, вы получите компонент со свойствами, совместимыми с определением bean из файла XML. – 2010-12-10 10:20:17

0

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

public class ComponentBeanFactory implements BeanFactory { 

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

} 

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

+0

Когда у вас есть интерфейс Cat , который простирается от типичного типизированного интерфейса Animal свойства, объявленные в Animal, недоступны при использовании Dozer. Только свойства, объявленные в Cat, доступны во время отображения. Основываясь на том, что я прочитал, я должен реализовать BeanFactory. Но я не могу найти подобный образец. Тот, который вы предоставили, хорош, но он не работает для универсальных типизированных интерфейсов, или, может быть, я ошибаюсь – chris 2010-12-18 04:43:29

Смежные вопросы