如何在Spring中创建抽象持久层?
我需要一些帮助与这个设计问题,我在春天。我必须说我是一个新手春天和冬眠,JPA等 我们正在创建一个基于Spring的web应用程序,它被分为不同的Maven模块。模块为(小箭头'->'表示“参考”):如何在Spring中创建抽象持久层?,spring,jpa,architecture,persistence,abstract,Spring,Jpa,Architecture,Persistence,Abstract,我需要一些帮助与这个设计问题,我在春天。我必须说我是一个新手春天和冬眠,JPA等 我们正在创建一个基于Spring的web应用程序,它被分为不同的Maven模块。模块为(小箭头'->'表示“参考”): [1] 项目(应用程序负责人;pom) [2] 核心模型(此处为jpa注释) [3] 核心业务逻辑(->核心模型) [4] webapp(->持久性,-->核心业务逻辑) [5] 持久性抽象(->核心模型) [6] 持久化impl关系数据库(->持久化抽象) [7] 持久性impl xml文件(
- [1] 项目(应用程序负责人;pom)
- [2] 核心模型(此处为jpa注释)
- [3] 核心业务逻辑(->核心模型)
- [4] webapp(->持久性,-->核心业务逻辑)
- [5] 持久性抽象(->核心模型)
- [6] 持久化impl关系数据库(->持久化抽象)
- [7] 持久性impl xml文件(->持久性摘要)
- [8] 持久性意味着
提前谢谢。好的,在阅读了一点设计模式并深入了解了设计模式之后,我决定做以下工作并分享我的经验(请参阅我的第一篇文章以了解参考资料) 对于持久层([5]、[6]、[7]等等),我使用了策略模式,但是如果您想用谷歌搜索它,也可以调用它。与此相关,我使用了,这在《Java持久化与Hibernate》一书中有很好的解释 策略模式基本上由一个接口组成,在我的例子中称为PersistenceStrategy,它抽象了实际的持久性实现。此外,我还有一个服务持久性服务,它包装了持久性策略
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)等实现了这个接口,我将它们声明为Springbean。我还将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>
在我看来,这些图案很好看。如果您想在此帖子中添加内容,请随意。我不太了解PersistenceService的用法PersistenceService的优点是有一个中心对象来获取persistenceStrategy对象。但你是对的。我想您也可以将“hibernatePersistenceStrategy”Bean重命名为“persistenceStrategy”,并在需要的地方@Autowire它,并以这种方式对实际实现保持“抽象”。
<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>
@Controller
public class NewDatasetController {
@Autowired
PersistenceStrategy persistenceStrategy;
@RequestMapping("/")
public String landing() {
...
}
}