私はSourceForgeフォーラムを含むDozerのFAQとドキュメントを見てきましたが、カスタムBeanFactoryを実装する方法についての良いチュートリアルや簡単な例さえ見ませんでした。
誰もが「BeanFactoryを実装するだけ」と言っています。どのくらい正確に実装しますか?
私はグーグルで検索しましたが、表示されるのはjarファイルとjarファイルのソースだけです。
これが私のBeanFactoriesの1つです。これが、一般的なパターンの説明に役立つことを願っています。
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());
}
したがって、 Object sourceはマップされるソースBeanであり、Class sourceClassはソースBeanのクラスです(これは常にLineDtoインスタンスになるため、無視します)。文字列targetBeanIdは、宛先BeanのIDです(無視されすぎます)。
カスタムBeanファクトリは、Beanを作成するメソッドを持つクラスです。2つの「フレーバー」があります
a)静的作成メソッド
SomeBean x = SomeBeanFactory.createSomeBean();
b)インスタンス作成メソッド
SomeBeanFactory sbf = new SomeBeanFactory();
SomeBean x = sbf.createSomeBean();
Beanの作成と設定にトリッキーなロジックが必要な場合、たとえば特定のプロパティの初期値が外部構成ファイルに依存する場合は、Beanファクトリを作成します。Beanファクトリクラスを使用すると、このようなトリッキーなBeanの作成方法に関する「知識」を一元化できます。他のクラスは、そのようなBeanを正しく作成する方法を気にせずにcreateメソッドを呼び出すだけです。
これが実際の実装です。DozerはBeanFactoryなしでも同じことを行うので、明らかにそれはあまり意味がありませんが、オブジェクトを返すだけでなく、何らかの方法で初期化することができます。
public class ComponentBeanFactory implements BeanFactory {
@Override
public Object createBean(Object source, Class<?> sourceClass,
String targetBeanId) {
return new ComponentDto();
}
}
とにかくBeanFactoryが必要なのはなぜですか?多分それはあなたの質問を理解するのに役立つでしょう。