我需要一些帮助来解决我在Spring中遇到的这个设计问题。我必须说我是Spring和Hibernate,JPA等的新手。
我们正在创建一个基于Spring的Web应用程序,它被分成不同的Maven模块。模块是(小箭头' - >;'表示“引用”):
我们想要创建一个抽象持久层,它定义了一些用于持久化业务对象的类或抽象服务(接口?)。
在[6]中应该是使用Hibernate / JPA来持久化业务对象的实现。据我所知,Maven可以在其他maven模块中使用JPA注释,这里[2]。此外,我们希望在[7]中有一个实现,它将业务对象持久存储到xml文件或其他源中,以及将来可能存在的任何内容。
您是否知道如何从Web应用程序模块隐藏实际的持久性实现?我需要在[4]和[5]中指定使用这样的架构吗?
我们的目的是让Web应用程序模块只知道抽象持久性模块,并在那里有一个配置文件,它定义了要使用的实际持久性类型或存储源。
有没有办法在[6]中使用Spring Data JPA,在[7]中使用其他东西?
提前谢谢。
答案 0 :(得分:2)
好的,经过一些阅读和潜入设计模式的世界,我决定做以下事情并分享我的经验(请参阅我的第一篇文章来解析参考文献)。
对于持久层([5],[6],[7]等),我使用了策略模式,但如果你想谷歌它,你也可以称之为DAOFactory-Pattern。与此相关,我使用了GenericDAO-Pattern,这在“使用Hibernate的Java持久性”一书中得到了很好的解释。
策略模式基本上由一个接口组成,在我的例子中称为 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)等实现了这个接口,我将它们声明为Spring bean。我还将PersistenceService声明为bean。实际的PersistenceStrategy是注入PersistenceService的。请注意,这个bean定义在[5]和[6]中的实际持久性实现中,而不是在webapp项目[4]中。
<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() {
...
}
}
在我看来,这些模式非常好。如果你想在这篇文章中添加一些内容,请随意。