Spring+HibernateEntityManager(Spring+DDDっぽく編 その2)
徹夜明けで満員電車で帰宅 orz
仮眠後出社 o...rz
なんだかなー。
サンプルをちょっとだけ現実的に変更
さすがに、クラス A とかだとリアリティにかけるので、ちょっと変更。
- User
- というインタフェースを作成。何のユーザーなのかよく分かりませんが、とりあえずユーザーということで(^^;
- UserService
- ユーザーに関するサービスです。何をどうサービスするのかよく分かりませんが、とりあえずユーザーサービスということでw
ドメイン層(API)
純粋にドメイン層のAPIを定義しています。インタフェースと javadoc の組み合わせは、結構シンプルです。おいらのお気に入りです。
domain.entity.User インタフェース(domain-api/src/main/java/domain/entity/User.java)
package domain.entity; import infrastracture.HasGlobalIdentity; /** * ユーザー * * @param <I> * ユーザーのグローバル・アイデンティティの型 * @author beyondseeker * @version $Id$ */ public interface User<I> extends HasGlobalIdentity<I> { /** * ユーザー名を返します。 * * @return ユーザー名 */ String getName(); /** * ユーザー名をセットします。 * * @param name * ユーザー名 */ void setName(String name); }
domain.entity.UserService インタフェース(domain-api/src/main/java/domain/service/UserService.java)
package domain.service; import domain.entity.User; /** * {@link User} 関連の Service です。 * * @param <I> * ユーザーのグローバル・アイデンティティの型 * @author beyondseeker * @version $Id$ */ public interface UserService<I> { /** * User を登録します。 * * @param user * User */ void registerUser(User<I> user); /** * 新規に作成された {@link User} インスタンスを返します。 * * @return 新規に作成された {@link User} インスタンス */ User<Integer> newUser(); }
ドメイン層(実装)
API の実装部です。インタフェースレベルの説明はインタフェースに書かれているので、実装クラスでは特に付加情報がない限りは {@inheritDoc} と書けばOK。ラクチンです。JPA 依存とか、フィールドとか、インタフェースレベルで考えてはいけないドロドロとしたイヤなものをここに書いています。
domain.entity.UserImpl クラス(domain-impl/src/main/java/domain/entity/UserImpl.java)
package domain.entity; import infrastracture.DomainEntityBaseWithSurrogateIntegerKey; import javax.persistence.Entity; /** * {@link User} の実装 * * @author beyondseeker * @version $Id$ */ @Entity(name = "User") public class UserImpl extends DomainEntityBaseWithSurrogateIntegerKey implements User<Integer> { /** * ユーザー名 */ private String name; /** * {@inheritDoc} */ @Override public Class<?> getDomainEntityInterface() { return User.class; } /** * {@inheritDoc} */ @Override public String getName() { return name; } /** * {@inheritDoc} */ @Override public void setName(String name) { this.name = name; } }
domain.entity.UserServiceImpl クラス(domain-impl/src/main/java/domain/service/UserServiceImpl.java)
abstract public User<Integer> newUser()
については、Lookup Method Injection による、ソースコードからDIコンテナへの依存の解消を参照のこと。
package domain.service; import infrastracture.ServiceBase; import domain.entity.User; /** * {@link UserService} の実装。 * * @author beyondseeker * @version $Id$ */ abstract public class UserServiceImpl extends ServiceBase implements UserService<Integer> { /** * {@inheritDoc} */ @Override public void registerUser(User<Integer> user) { getEntityManager().persist(user); } /** * {@inheritDoc} */ abstract public User<Integer> newUser(); }
links
第1回 Spring+HibernateEntityManager(HibernateEntityManager単体編)
第2回 Spring+HibernateEntityManager(とりあえずSpring編)
第3回 Spring+HibernateEntityManager(宣言的トランザクション編)
第4回 Spring+HibernateEntityManager(Spring+DDDっぽく編)
第5回 Spring+HibernateEntityManager(Spring+DDDっぽく編 その2)
第6回 Spring+HibernateEntityManager(Spring+DDDっぽく編 その3)
第7回 Spring+HibernateEntityManager(Spring+DDDっぽく編 その4)
第8回 Spring+HibernateEntityManager(@Transactionalアノテーション編)
第9回 Spring+HibernateEntityManager(@Required編)
第10回 Spring+HibernateEntityManager(XMLからの外部リソース参照編)
第11回 Spring+HibernateEntityManager(AspectJ AOP with Load-Time-Weaver編)
第12回 Spring+HibernateEntityManager(DBCPのvalidationQuery編)
第13回 Spring+HibernateEntityManager(@Resource編)
第14回 Spring+HibernateEntityManager(コンポーネント自動検出 with アノテーション編)
第15回 Spring+HibernateEntityManager(コンポーネント自動検出 without アノテーション編)