How to use maru-dogデータバインドライブラリ (1)
maru-dogデータバインドライブラリはインスタンス間でプロパティのデータのコピーを行うライブラリです。
apache-commonsのBeanUtilsによく似ていますが、アノテーションによるバインド制御や、複数のJavaBeansインスタンスのプロパティの値を1つの結果オブジェクトに集約することができる等、より柔軟な制御を行うことが可能です。
それでは最もシンプルなサンプルを例に解説します。
import org.maru.dog.Director; import org.maru.dog.Marudog; import org.maru.dog.annotation.Bind; import org.maru.dog.annotation.Bound; public class Main { public static void main(String[] args) { Director director = Marudog.getDirector(); UserMaster master = getUserMaster(); UserProfile profile = getUserProfile(); UserBean user = new UserBean(); director.bind(user, master, profile); System.out.println(user); } private static UserMaster getUserMaster() { UserMaster master = new UserMaster(); master.userId = "ABC123"; master.password = "PASSWORD"; return master; } private static UserProfile getUserProfile() { UserProfile profile = new UserProfile(); profile.address = "Tokyo/Japan"; profile.age = 25; profile.gender = 1; profile.userName = "Maru dog"; return profile; } static class UserBean { @Bound private String userId; @Bound private String userName; @Bound String address; @Bound private short age; @Bound private byte gender; @Override public String toString() { return "UserBean [userId=" + userId + ", userName=" + userName + ", address=" + address + ", age=" + age + ", gender=" + gender + "]"; } } static class UserMaster{ @Bind private String userId; private String password; } static class UserProfile { @Bind private String userName; @Bind String address; @Bind private short age; // 1:man, 2:woman @Bind private byte gender; } }
上記プログラムの実行結果は以下のようになります。
UserBean [userId=ABC123, userName=Maru dog, address=Tokyo/Japan, age=25, gender=1]
まずバインド先のUserBeanクラスのフィールドに@Boundというアノテーションが付与されています。このアノテーションをMarudogが読み取りバインド先の情報を構築します。
次にバインド元となるUserMaster、UserProfileクラスに@Bindというアノテーションが付与されています。このアノテーションを読み取り、Marudogはバインド元の情報を構築します。
mainメソッドの中でMarudog.getDirector()でDirectorオブジェクトを取得しています。このDirectorオブジェクトがバインドの制御を管理するクラスです。director.bind(user, master, profile)でuserクラスの@Bound付与されたフィールドにmasterとprofileの@Bindが付与されたフィールドの値がバインド(コピー)されます。
Director#bindメソッド内ではString型の名前解決を行いバインド対象を決定します。@Bind、@Boundはそれぞれname属性を持っていますが、ここでは何も指定していないためデフォルトでフィールド名がバインドを行う際の名前解決に用いられます。
Directorにはbind以外に次のようなメソッドを持っています。
Director#getInstance(Class
Director#getInstance(T target, K... inputs)
Director#bindByFieldName(T target, K... inputs)
2つのgetInstanceメソッドの違いは第一引数がClass型のメソッドの場合はそのクラスのインスタンスを生成してバインドを行い結果を返します。もう一方のメソッドは単純に第一引数で受け取ったインスタンスにバインドを行いそのインスタンスを返します。
bindByFieldNameはフィールド名による名前解決を行いバインドを実行します。当該メソッドを用いる場合@Bind、@Boundアノテーションは必要ありません。
詳細な利用方法は次の機会に解説したいと思います。
プロジェクトサイト:http://maru.sourceforge.jp/index.html
ドキュメント:http://maru.sourceforge.jp/document_dog.html