首页 > 编程知识 正文

SpringBoot有哪些优缺点(框架技术)

时间:2023-05-05 22:23:40 阅读:86591 作者:2698

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

让我们通过一些示例来简要了解使用Spring开发APP的好处。

如果使用

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

Spring开发需要事务的APP事务,则可以使用spring的声明性事务管理来管理事务。

my bank APP应用程序的FixedDepositService,如代码清单1-4所示。

代码清单1-4 FixedDepositService类

FixedDepositService类是定义如何在定期存款业务中创建和检索详细信息的POJO类。 图1-3显示了创建新定期存款的表格。

图1-3定期存款的HTML表格的制作

一位客户在上面的表格中输入定期存款金额、存款期限和电子邮件地址ID信息,然后单击“保存”按钮创建新的定期存款。 在这种情况下,将调用FixedDepositService的createFixedDeposit方法(参见代码列表1-4 )来创建存款,然后调用createfixeddeposice

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

从BANK_ACCOUNT_DETAILS表中减去x,然后将记录插入到FIXED_DEPOSIT_DETAILS表中以反映新添加的定期存款。 如果BANK_ACCOUNT_DETAILS表没有更新,或者没有插入新记录

固定_部署_详细信息表。 这将导致系统处于不一致状态。 这意味着createFixedDeposit方法必须在一个事务中执行。

my bank APP使用的数据库是事务资源。 如果要使用传统方法在工作单元中执行一系列数据库更改操作,请首先禁用JDBC连接的自动提交模式,然后执行sQL语句,最后提交(或回退)事务。 代码清单1-5显示了用传统方法管理数据库事务的createFixedDeposit方法。

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

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

使用JDBC Connection对象管理事务的方法适用于单个数据库,即只涉及单个事务资源的APP场景。 如果涉及多个事务资源,并且使用JTA (JAVA )管理事务,则例如,在同一事务中使用消息中间件(某个事务资源)发送JMS消息要更新,必须使用一个JTAtransactionmanager来管理事务。 JTA事务也称为全局(或分布式)事务。 要使用JTA,必须首先从JNDI获取用户事务对象,对作为JTAAPI一部分的用户事务对象进行编程,以启动和提交(或回退)事务

如您所见,可以使用JDBC连接“本地事务”或“用户事务”“全局事务”对象以编程方式管理事务。 但是,不能在全局事务中执行本地事务。 也就是说,要更新createFixedDeposit数据库中的方法使其成为JTA事务的一部分,必须修改createFixedDeposit方法,以便在UserTransaction对象中管理事务

Spring通过提供抽象层简化了事务管理,提供了管理本地事务和全局事务的一致方法。 这意味着,如果使用Spring的事务抽象编写createfixeddeposit方法,则在从本地切换到全局事务管理时无需更改该方法,反之亦然。 关于Spring的事务抽象化将在第8章详细说明。

2声明式事务管理

Spring提供了使用声明性事务管理的选项,可以通过一种方法使用Spring@Transactional注释来处理事务,如代码列表1-6所示。

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

src="https://p5.toutiaoimg.com/origin/pgc-image/bd74f9ee196b404a942598444ff29904?from=pc">

代码清单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 感兴趣的读者参考。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。