デザインパターンの世界を少し読んだりダイビングしたりして、私は次のことをして自分の経験を共有することにしました(参考までに私の最初の記事をご覧ください)。
私はストラテジーパターンを使用しましたが、あなたはgoogleにしたい場合はDAOFactory-Patternと呼ぶこともできます([5]、[6]、[7]など)。それに関連して、私はGenericDAO-Patternを使用しました。これは、「Java Persistence with Hibernate」という本で非常によく説明されています。
ストラテジーパターンは基本的に、私のケースではPersistenceStrategyと呼ばれる実際の永続性実装を抽象化したインターフェースで構成されています。さらに私はその永続性戦略を包括するサービスPersistenceServiceを持っています。
public interface PersistenceStrategy {
public void persist(BaseEntity object);
...
}
PersistenceService:
public class PersistenceService {
private PersistenceStrategy persistenceStrategy;
public void setPersistenceStrategy(PersistenceStrategy strategy) {
this.persistenceStrategy = strategy;
}
public PersistenceStrategy getPersistenceStrategy() {
return this.persistenceStrategy;
}
}
実際の永続クラス[6]及び[7](例えばPersistenceStrategyHibernate)など、このインタフェースを実装し、Iは、Spring Beanとしてそれらを宣言しました。また、PersistenceServiceをBeanとして宣言しました。実際のPersistenceStrategyはPersistenceServiceに注入されます。このBean定義はwebappプロジェクト[4]ではなく、例えば[5]と[6]の実際の永続化実装にあります。
<bean id="hibernatePersistenceStrategy" class="org.myProject.persistence.relational.HibernatePersistenceStrategy" />
<!-- PersistenceService is instantiated here with the actual persistence strategy implementation -->
<bean id="persistenceService" class="org.myProject.persistence.PersistenceService">
<property name="persistenceStrategy" ref="hibernatePersistenceStrategy"></property>
</bean>
私のwebapp mavenプロジェクト[4]では、実際の永続化実装を参照しています。 [5]または[6]。
<dependency>
<groupId>org.myProject</groupId>
<!-- this is where the persistence module is referenced.
if you want to change the type of persistence you can do it here. -->
<artifactId>persistence-relational</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
私のコントローラクラスでは、PersistenceServiceとPersistenceStrategyを参照できます。
@Controller
public class NewDatasetController {
@Autowired
PersistenceStrategy persistenceStrategy;
@RequestMapping("/")
public String landing() {
...
}
}
これらのパターンは、私の意見ではかなりいいです。この投稿に何かを追加したい場合は、気軽にご利用ください。
PersistenceServiceの使用方法がよく分かりません –
PersistenceServiceの利点は、persistenceStrategyオブジェクトを取得するための中央オブジェクトを持つことです。しかし、あなたは正しいです。私は 'hibernatePersistenceStrategy' Beanの名前を 'persistenceStrategy'に変更し、必要な場所で@Autowireを実行し、そのような方法で実際の実装にも抽象的に留まることができると思います。 – matthaeus