我查看了Dozer的常见问题解答和文档,包括SourceForge论坛,但我没有看到任何好的教程,甚至没有看到如何实现自定义 BeanFactory 的简单示例。
每个人都说,“只需实现一个BeanFactory”。你究竟是如何实现它的?
我用Google搜索,我所看到的只是罐子和罐子的来源。
答案 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?也许这有助于理解你的问题。