
嗨,habrozhiteli! 我们出版了一本书,概述了Spring 5框架及其设计模式。 解释了依赖注入的原理,它在Spring框架中创建松散耦合的代码中起着关键作用。 然后,在Spring中设计应用程序时,将研究经典的“四人组合”模式。 在本书的以下各部分中,作者讨论面向方面的编程(AOP)模式和JDBC模式,这些模式使您可以抽象数据库访问。 在本书的最后几章中,作者探讨了使用MVC,反应式设计模式以及在Spring的并发和并行编程中使用的设计模式。
我们建议您熟悉“ Pattern”“数据访问对象”“
数据访问对象(DAO)是一种非常流行的设计模式,用于J2EE应用程序中的持久性级别。 它将业务逻辑级别与保留级别分开。 DAO模式基于封装和抽象的面向对象原理。 使用DAO模式的上下文取决于对数据及其存储的访问,具体取决于特定的实现和存储类型,例如,面向对象的数据库,非结构化文件,关系数据库等。基于DAO模式,您可以创建DAO接口并实现它,提取和封装对数据源的所有调用。 类似的DAO实现管理数据库资源,例如与数据源的连接。
DAO接口非常容易适应数据源的所有基础机制;无需在较低级别上用存储技术的更改来代替它们。 此模式使您可以实施各种数据访问技术,而不会影响公司应用程序的业务逻辑。 让我们考虑图。 8.1更好地理解DAO模式的原理。
如您在图中所看到的,该模式涉及以下对象。
BusinessObject-在业务级别工作的对象-数据访问级别的客户端。 他需要数据来模拟业务流程,以及为辅助功能或应用程序控制器准备Java对象。
DataAccessObject是DAO模式的主要对象。 从BusinessObject隐藏基础数据库的整个低层实现。
数据源也是一个对象,它包含有关底层数据库到底是什么的所有低级信息:RDBMS,非结构化文件或XML。
TransferObject-用作存储介质的对象。 由DataAccessObject用于将数据返回到BusinessObject。
考虑以下DAO模式的示例,其中AccountDao是DataAccessObject的接口,而AccountDaoImpl是实现AccountDao接口的类:
public interface AccountDao { Integer totalAccountsByBranch(String branchName); } public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { @Override public Integer totalAccountsByBranch(String branchName) { String sql = "SELECT count(*) FROM Account WHERE branchName = "+branchName; return this.getJdbcTemplate().queryForObject(sql, Integer.class); } }
使用Factory设计模式在Spring中创建DAO对象
如您所知,Spring框架涉及很多设计模式。 “工厂”模式是一种生成设计模式,用于创建对象而不向客户端透露底层逻辑,以及使用公共接口或抽象类将新对象分配给调用方。 借助工厂方法和抽象工厂设计模式,可以实现DAO模式的非常高的灵活性。
我们将在示例中找到在哪里实施策略,在该策略中工厂生产DAO对象以实现公共数据库(图8.2)。
您可以在前面的图中看到AccountDaoFactory生成一个AccountDao对象,即它是一个工厂。 可以随时替换基础数据库,而无需更改业务代码-工厂负责这项工作。 Spring支持将所有DAO存储在组件工厂以及DAO工厂中。
数据映射模式
ORM框架提供了对象和关系数据库之间的映射,因为关系数据库的对象和表以不同的方式存储应用程序数据。 此外,对象和表具有各种结构化数据的机制。 在Spring应用程序中使用任何ORM解决方案(例如Hibernate,JPA或JDO)时,无需担心对象与关系数据库之间的映射机制。
让我们考虑图。 8.3更好地了解“数据映射器”模式。
在该图中,使用AccountMapper接口将Account对象映射到关系数据库。 AccountMapper在Java对象和基础数据库之间的应用程序中扮演中介角色。 考虑在数据访问级别使用的另一种模式。
模式“域模型”
域模型是具有数据和行为的对象,其中行为决定公司应用程序的业务逻辑,数据表示有关业务结果的信息。 领域模型将数据和流程结合在一起。 在公司应用程序中,数据模型位于业务级别下方,并定义业务逻辑,并返回业务行为的结果。 为了清楚起见,请考虑以下图表(图8.4)。
从图中可以看出,该应用程序根据业务需求定义了两个域模型。 TransferService类中描述了用于将资金从一个帐户转移到另一个帐户的业务算法。 TransferService和AccountService类与企业应用程序中的“域模型”模式相关。
延迟下载模式的代理
“延迟加载”是企业应用程序中的某些ORM解决方案(例如Hibernate)使用的一种设计模式,用于将对象的初始化延迟到另一个对象(即需要它)访问它之前。 此设计模式的目的是优化应用程序中的内存。 Hibernate的延迟加载设计模式是使用虚拟代理对象实现的。 为了演示延迟加载,我们使用了代理,但不适用于“代理”模式。
Spring中支持Hibernate的模板方法模式
Spring框架基于GoF模式方法设计模式,提供了一个用于在DAO级别访问数据的帮助程序类。 Spring框架的HibernateTemplate类支持数据库操作,例如保存,创建,删除和更新。 此类确保每个事务仅使用一个Hibernate会话。
与Spring的Hibernate集成
Hibernate是一个开源的ORM持久性框架,它不仅提供Java对象与数据库表之间的简单对象关系的映射,而且还提供许多高级功能来提高应用程序性能,还有助于提高资源利用率,例如缓存。 ,延迟加载,立即数据检索和分布式缓存。
Spring提供了对与Hibernate框架集成的全面支持,它具有几个内置库,这些库可以100%使用Hibernate。 要在应用程序中设置Hibernate设置,可以使用依赖注入模式和Spring框架的IoC容器。
在下一节中,我们将说明如何在Spring框架的IoC容器中正确配置Hibernate。
在Spring容器中定义SessionFactory休眠对象设置
在任何企业应用程序中配置Hibernate和其他存储技术的最佳方法是使用硬连接的资源目录来分隔业务对象,例如JDBC中的DataSource或Hibernate中的SessionFactory。 这些资源可以描述为Spring容器中的组件。 但是,业务对象对它们的访问需要引用它们。 考虑下面的DAO类,该类使用SessionFactory对象为应用程序检索数据:
public class AccountDaoImpl implements AccountDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } // ... }
如您所见,DAO类AccountDaoImpl遵循了依赖项注入模式。 为了访问数据,Hibernate框架的SessionFactory对象被嵌入其中,在IoC Spring容器中感觉很好。 Hibernate框架的SessionFactory对象是单个对象;它生成Hibernate接口org.hibernate.Session的主要对象。 SessionFactory对象管理Session对象,还负责打开和关闭它。 会话界面包含真正的数据访问功能-从数据库中保存(保存),更新(更新),删除(删除)和加载(加载)对象。 在应用程序中,AccountDaoImpl类的对象或任何其他存储库都使用此Session对象执行所有必要的数据存储操作。
Spring框架提供了Hibernate内置模块,因此您可以在应用程序中使用SessionFactory Hibernate组件。
org.springframework.orm.hibernate5.LocalSessionFactoryBean组件是Spring FactoryBean接口的实现。 LocalSessionFactoryBean基于抽象工厂模式;它在应用程序中生成一个SessionFactory对象。 可以在Spring应用程序的上下文中将该对象配置为组件,如下所示:
@Bean public LocalSessionFactoryBean sessionFactory(DataSource dataSource) { LocalSessionFactoryBean sfb = new LocalSessionFactoryBean(); sfb.setDataSource(dataSource); sfb.setPackagesToScan(new String[] { "com.packt.patterninspring.chapter8.bankapp.model" }); Properties props = new Properties(); props.setProperty("dialect", "org.hibernate.dialect.H2Dialect"); sfb.setHibernateProperties(props); return sfb; }
在这段代码中,我们使用Spring框架的LocalSessionFactoryBean类将SessionFactory对象配置为组件。 该组件的方法接受DataSource类型的对象作为参数,该参数确定连接到数据库的位置和方法。 我们还通过为LocalSessionFactoryBean组件的setPackagesToScan属性设置值“ com.packt.patterninspring.chapter8.bankapp.model”来指定要查看的包,并使用setHibernateProperties方法设置SessionFactory组件的方言属性以指示我们使用的数据库类型在应用程序中的问题。
现在,在Spring应用程序的上下文中设置SessionFactory Hibernate组件之后,让我们看看如何为应用程序的保存级别实现数据访问对象。
关于作者
Dinesh Rajput是Dineshonjava网站的主编,该网站是致力于Java和Spring技术的技术博客。 该站点包含有关Java技术的文章。 Dinesh是一名博客作者,还是书籍的作者,自2008年以来一直是Spring发烧友,是Pivotal(Pivotal认证的Spring Professional)的认证专家。 他使用Java和Spring拥有十多年的设计和开发经验。 他专门研究最新版本的Spring框架,Spring Boot,Spring Security,创建REST API,微服务架构,反应式编程,使用Spring进行面向方面的编程,设计模式,Struts,Hibernate,Web服务,Spring Batch,Cassandra, MongoDB,一种Web应用程序体系结构。
目前,Dinesh在软件开发领域的领先公司之一中担任技术经理。 他曾是Bennett,Coleman&Co.的开发人员和团队负责人。 Ltd,之前是Paytm的领先开发商。 Dinesh对最新的Java技术充满热情,并喜欢在技术博客中撰写有关它们的文章。 他在各种论坛中都是Java和Spring社区的活跃成员。 Dinesh是Java和Spring的最佳专家之一。
关于审稿人
Rajiv Kumar Mohan在软件开发和企业培训方面拥有丰富的经验。 在18年的时间里,他曾在IBM,Pentasoft,Sapient和Deft Infosystems等主要IT公司工作。 他以程序员的身份开始了自己的职业生涯,领导了许多项目。
他是Java,J2EE和相关框架,Android,UI技术领域的专家。 被Sun认证为Java程序员(SCJP,Sun认证Java程序员)和Java Web开发者(Sun认证Web组件开发者,SCWCD)。 拉吉夫拥有四门高等教育:计算机科学(计算机科学),应用计算机科学(计算机应用),有机化学和工商管理(MBA)领域。 他是HCL,Amdocs,Steria,TCS,Wipro,Oracle大学,IBM,CSC,Genpact,Sapient Infosys和Capgemini的招聘顾问和培训专家。
Rajeev是SNS Infotech的创始人,该公司位于大诺伊达市。 此外,他还在美国国立时装技术学院(NIFT)工作。
»这本书的更多信息可以
在出版商的网站上找到»
目录»
摘录小贩20%折优惠券-
春季