龙空技术网

使用Spring框架的好处是什么?

异步社区 482

前言:

现时姐妹们对“java框架有什么好处”大体比较重视,朋友们都想要剖析一些“java框架有什么好处”的相关知识。那么小编同时在网络上网罗了一些关于“java框架有什么好处””的相关内容,希望兄弟们能喜欢,看官们一起来学习一下吧!

Spring提供了一个负责样板代码的抽象层,以此简化与以下模块的交互,如JMS提供者、JNDI,MBean服务器、邮件服务器和数据库等。

让我们快速地通过几个例子来更好地理解使用Spring开发应用程序有哪些好处。

1管理本地和全局事务的一致方法

如果你正在使用Spring开发一个需要事务的应用程序,那么可以使用Spring的声明式事务管理来管理事务。

MyBank应用程序中的FixedDepositService,如代码清单1-4所示。

代码清单1-4 FixedDepositService类

FixedDepositService类是用来定义定期存款业务中创建和取回明细方法的POJO类。图1-3展示了创建一笔新的定期存款的表单。

图1-3 创建定期存款的HTML表单

一位客户在上面的表单中输入了定期存款金额、存期和电子邮箱ID信息,并单击SAVE按钮来创建一笔新的定期存款,此时会调用在FixedDepositService中的createFixedDeposit方法(见代码清单1-4 )来创建存款, createFixedDeposit方法从该客户银行账户中扣除他输入的金额并创建一笔等额的定期存款。

假定关于客户银行余额的信息存在数据表BANK_ACCOUNT_DETAILS中,定期存款的明细存在数据表FIXED_DEPOSIT_DETAILS中。如果睿户创建了一笔金额为x的定期存款,应该在

BANK_ACCOUNT_DETAILS表中减去x并在FIXED_DEPOSIT_DETAILS表中插入一条记录来反映这笔新加的定期存款。如果BANK_ACCOUNT_DETAILS表没有更新或者新的记录没有插入

FIXED_DEPOSIT_DETAILS表,这会让系统处于不一致状态。这意味着createFixedDeposit方法必须在一个事务中执行。

由Mybank应用程序所使用的数据库是一个事务性资源。以传统的方式在一个工作单元中执行一组数据库的修改操作时,先要禁用JDBC连接的自动提交模式,然后执行sQL语句,最后提交(或回滚)事务。代码清单1-5展示了使用传统方式管理数据库事务的createFixedDeposit方法。

代码清单1-5 以编程方式使用JDBC连接对象管理数据库事务

代码清单1-5展示了如何在createFixedDeposit方法中以编程方式使用JDBC连接对象管理数据库事务。与具体资源相关的事务,如与JDBC连接对象相关的事务,称为本地事务。

使用JDBC Connection对象管理事务的方法适用于只涉及单个数据库(即单个事务资源)的应用场景。当涉及多个事务资源,使用JTA ( Java事务API )来管理事务时,例如要在同一个事务中将JMS消息发送到消息中间件(一种事务资源)并更新数据库(另一种事务资源) ,则必须使用一个JTA事务管理器管理事务。JTA事务也称为全局(或分布式)事务。要使用JTA ,需要先从JNDI中获取UserTransaction对象(这是JTAAPI的一部分) ,并编程开始和提交(或回滚)事务。

如你所见,可以使用JDBC连接(本地事务)或userTransaction (对于全局事务)对象以编程方式管理事务。但是请注意,本地事务无法在全局事务中运行。这意味着如果要在createFixedDeposit数据库更新方法(见代码清单1-5)使之成为JTA事务的一部分,则需要修改createFixedDeposit方法,用UserTransaction对象进行事务管理。

Spring通过提供一个抽象层来简化事务管理,从而提供管理本地和全局事务的一致方法。这意味着如果用Spring的事务抽象写createfixeddeposit方法(见代码清单1-5) ,那么从本地切换到全局事务管理时不需要修改方法,反之亦然。Spring的事务抽象将在第8章详细说明。

2声明式事务管理

Spring提供了使用声明式事务管理的选项,你可以在一个方法上使用Spring@Transactional注解并让Spring来处理事务,如代码清单1-6所示。

代码清单1-6使用@Transactional注解

代码清单1-6表明, FixedDepositService类没有实现或继承任何特定于Spring的接口或类以得到Spring的事务管理能力。 Spring框架透明地通过@Transactional注解为createFixedDeposit方法提供事务管理功能。这说明Spring是一个非侵入性的框架,因为它不需要应用对象依赖于Spring特定的类或接口。由于事务管理是由Spring接管的,因此不需要直接使用事务管理API来管理事务。

3安全

对于任何Java应用程序来说,安全都是非常重要的。Spring Security是一个置于Spring框架顶层的项目,它提供了身份验证和授权功能,可以用来保护Java应用程序。下面以3个在Mybank应用程序中认证过的用户角色为例进行说明,即LOAN_CUSTOMER、SAVINGS_ACCOUNT _CUSTOMER和APPLICATION_ADMIN,调用FixedDepositService类(见示例1-6 )中createFixedDeposit方法的客户必须是相关的SAVINGS_ACCOUNT_CUSTOMER或者拥有APPLICATION_ADMIN角色。使用Spring Security时,你可以通过在createFixedDeposit方法上添加Spring Security的@Secured注解来轻松地解决这个问题,如代码清单1-7所示。

代码清单1-7使用@Secured注解的createFixedDeposit方法

如果用@Secured给一个方法加注解,安全特性将被Spring Security框架透明地应用到该方法上。代码清单1-7表明,为了实现方法级别的安全,你无须继承或实现任何Spring特定类或接口,而且不需要在业务方法中写安全相关的代码。

我们将在第16章详细讨论Spring Security框架。

4 Java管理扩展

Spring对Java管理扩展(JMX)的支持可以让你非常简单地将JIMX技术融合到应用程序中。

假设Mybank应用程序的定期存款功能应该只在每天早上9点到下午6点的时间段提供给客户。为了满足这个要求,你需要在FixedDepositService中增加一个变量,以此作为一个标志表明定期存款服务是否活跃。代码清单1-8显示了使用活跃变量的FixedDepositService类。

代码清单1-8使用活跃变量的FixedDepositService类

代码清单1-8表明, FixedDepositService类中加了一个名为active的变量。如果active变量的值为true ,getFixedDepositDetails和createFixedDeposit方法将按照预期工作。如果active变量的值为false ,getFixedDepositDetails和createFixedDeposit方法将抛出一个异常,表明定期存款服务当前不可用。activateService和deactivateservice方法分别将active变量的值置为true和false,

那么,谁调用activateservice和deactivateService方法呢?假设有一个名为Bank App Scheduler的调度应用程序,分别在上午9:00和下午6:00执行activateservice和deactivateservice方法。Bank App Scheduler应用使用JMX ( Java管理扩展) API与FixedDepositService实例远程交互。

Bank App Scheduler使用JMX改变FixedDepositService中active变量的值,你需要将

FixedDepositService实例在一个可被管理的bean (或者称为MBean )服务器上注册为一个MBean ,并将FixedDepositService中的activateservice和deactivateservice方法暴露为JMX操作方法。在Spring中,你可以通过在一个类上添加Spring的@ManagedResource注解来将一个类的实例注册到MBean服务器上,并且可以使用Spring的@ManagedOperation注解将该类的方法暴露为JMX操作方法。

代码清单1-9展示了使用@ManagedResource和@ManagedOperation注解将FixedDepositService类的实例注册到MBean服务器,并将activateService和deactivateService方法暴露为JMX操作方法。

代码清单1-9 使用Spring JMX支持的FixedDepositService美

代码清单1-9表明FixedDepositService类将它的实例注册到MBean服务器并暴霞它的方法为JMX操作方法时,并没有直接使用JMX API。

5 Java消息服务

Spring的Java消息服务(JMS )支持简化了与IMS提供者之间的消息发送和接收。

在MyBank应用程序中,当客户通过电子邮件提交一个接收其定期存款明细的请求时,

FixedDepositService将请求的明细发送到JMS消息中间件(比如ActiveMQ ) ,而请求随后由消息侦听嚣处理。 Spring通过提供一个抽象层来简化与JMS提供者的交互。代码清单1-10展示了FixedDepositService类如何通过Spring的JmsTemplate将请求的明细发送到JMS提供者。

代码清单1-10发送JMS消息的FixedDepositService类

在代码清单1-10中, FixedDepositService定义了一个JmsTemplate类型的变量,这个变量使用了Spring的@Autowired注解。现在,你可以认为@Autowired注解提供了一个JmsTemplate实例。这个JmsTemplate实例知道JMS消息发送的目的地。FixedDepositService类的submitRequest方法调用了JmsTemplate的convertAndSend方法,把请求的明细(由submitRequest方法的Request参数表示)作为一个JMS消息发送到JMS提供者。我们将在第10章详细介绍Jms Template。

这也再一次表明,如果使用Spring框架向JMS提供者发送消息,并不需要直接处理JMS API。

6 缓存

Spring的缓存抽象提供了在应用程序中使用缓存的一致方法。

使用缓存解决方案来提高应用程序的性能是很常见的。MyBank应用使用一个缓存产品以提高读取定期存款明细操作的性能。 Spring框架通过抽象缓存相关的逻辑来简化与不同缓存解决方案的交互。

代码清单1-11展示了FixedDepositService类的getFixedDepositDetails方法使用Spring的缓存抽象功能来缓存定期存款明细

代码清单1-11 将定期存款明细缓存的FixedDepositService类

在代码清单1-11中, Spring的@Cacheable注解表明由getFixedDepositDetails方法返回的定期存款明细将被缓存起来,如果使用同样的参数来调用getFixedDepositDetails方法, getFixedDepositDetails方法并不会实际运行,而是直接返回缓存中的定期存款明细。这表明,如果使用Spring框架,则不需要在类中编写与缓存相关的逻辑。Spring的缓存抽象在第10章中详细介绍。

在这一部分中,我们看到Spring框架通过透明地向POJO提供服务的方式简化了企业应用程序的开发,从而将开发者从底层API的细节中解放出来。Spring还提供了与各种标准框架,如Hibernate,Quartz.JSF, Struts和EJB等的简单集成,使得Spring成为企业应用程序开发的理想选择。

现在,我们已经看到了一些使用Spring框架的好处。下面来看如何开发一个简单的Spring应用程序。

本文节选自《Spring学习指南 第4版》

Spring 框架是以简化J2EE 应用程序开发为特定目标而创建的,是当前最流行的Java 开发框架。本书主要介绍Beans 的配置、依赖注入、定制bean、基于Java 的容器、AOP、Spring Data、Spring MVC 等内容。本书基于非常适合构建JavaWeb 微服务框架的Spring 5 编写,涵盖Java 的函数式编程、RxJava 2 的反应式编程、用Spring WebFlux、Spring Data 和Spring Security 开发反应式RESTful Web 服务等内容。 本书适合Web 开发者和想使用Spring 的初学者参考,也可供对Web 开发和Spring 感兴趣的读者参考。

标签: #java框架有什么好处 #java框架有什么好处和坏处