登陆

极彩彩票平台登录网址-详解阿里P7架构师是怎样在Spring中完成业务暂停

admin 2019-08-23 306人围观 ,发现0个评论

摘要

Spring结构是一个盛行的依据轻量级操控回转容器的Java/J2EE运用结构,尤其在数据拜访和业务办理方面的才干是众所周知的。Spring的声明性业务别离能够运用到任何POJO方针方针,并且包含一切EJB依据容器办理业务中的已声明业务。后台的业务办理器支撑简略的依据JDBC的业务和全功用的依据JTA的J2EE业务。

这篇文章详细的评论了Spring的业务办理特性。重点是如安在运用JTA作为后台业务战略的基础上让POJO运用Spring的声明性业务,这也显现了Spring的业务服务能够无缝地与J2EE服务器(如BEA WebLogic Server的业务和谐器)的业务和谐器进行交互,作为EJB CMT传统业务别离办法的一个替代者。

POJO的声明性业务

作为Spring声明性业务别离办法的样例,让咱们来看一下Spring的样例运用PetClinic的中心服务外观中的装备:

清单1

 class="org.springframework.jndi.JndiObjectFactoryBean">

java:comp/env/jdbc/petclinic


class="org.springframework.transaction.jta.JtaTransactionManager"/>
class="org.springframework.samples.petclinic.jdbc.JdbcClinic">


class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">




PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED



他遵从Spring的规范XMLBean界说格局。界说了

  1. 一个DataSource引证,指向一个JNDI方位—在J2EE服务器办理下这将从JNDI环境中获取特定的DataSource。
  2. 一个运用服务完结—这是一个POJO,封装了业务和数据拜访逻辑。在这里完结了运用中的Clinic服务接口。
  3. 一个运用服务的业务署理—这个署理为方针服务界说了业务特点,匹配特定的办法名形式并为之创立相应的业务。在实践的业务办理中,署理指向一个PlatformTransactionManager完结。

留意:除了显式的署理界说,Spring还支撑主动署理机制和经过Commons Attributes或J2SE 5.0注解完结源程序级的元数据运用。这些可选办法的评论超过了本文的规模。能够参阅Spring的文档来了解相关细节。

业务接口和业务完结是特定于运用的并且不需求关怀Spring或许Spring的业务办理。一般Java方针能够作为服务的方针方针,并且任何一般Java接口能够作为服务的接口。下面是一个Clinic接口的示例:

清单2

public interface Clinic {
Pet loadPet(int id);
void storePet(Pet pet);
...
}

这个接口的完结如下显现,假定他运用JDBC来履行必要的数据拜访。他经过bean特点的设置办法来获取JDBC的DataSource;这与上面的装备中的dataSource特点界说相对应。

清单3

public class JdbcClinic implements Clinic {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public Pet loadPet(int id) {
try {
Connection con = this.dataSource.getConnection();
...
}
catch (SQLException ex) {
...
}
}
public void storePet(Pet pet) {
try {
Connection con = this.dataSource.getConnection();
...
}
catch (SQLException ex) {
...
}
}
...
}

如你所见,代码适当直接。咱们运用一个简略的Java方针,而业务办理由业务署理来处理,这个咱们会在下面评论。

留意在PetClinic示例运用中实践的依据JDBC的Clinic完结运用了Spring的JDBC支撑类来防止直接运用JDBC的API。尽管Spring的业务办理也能够与一般的依据JDBC完结一同作业,就向上面的示例。

界说业务署理

除了JdbcClinic实例以外,装备中也界说了一个业务署理。假如乐意这个署理所露出的实践接口也能够显式界说。默许情况下,一切由方针方针完结的接口都露出出来,在这个比如中便是运用的Clinic服务接口。

从客户端的观念来看,"clinic" bean仅仅这个运用的Clinic接口的完结。客户端不需求知道这会被一个业务署理所处理。这便是接口的才干:一个直接的方针方针的引证能够简略的被一个完结相同接口的署理所替代—在这儿便是一个隐式创立业务的署理。

署理的详细业务行为会由为依据特定的办法或办法命名形式而界说的业务特点来驱动,就像下面的比如所示:

清单3

PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED

Key特点决议署理将为办法供给什么样的业务行为。这个特点的最重要部分便是业务传达行为。下面是一些可选的特点值

  1. PROPAGATION_REQUIRED --支撑当时的业务,假如不存在就创立一个新的。这是最常用的挑选。
  2. PROPAGATION_SUPPORTS --支撑当时的业务,假如不存在就不运用业务。
  3. PROPAGATION_MANDATORY --支撑当时的业务,假如不存在就抛出反常。
  4. PROPAGATION_REQUIRES_NEW --创立一个新的业务,并暂停当时的业务(假如存在)。
  5. PROPAGATION_NOT_SUPPORTED --不运用业务,并暂停当时的业务(假如存在)。
  6. PROPAGATION_NEVER --不运用业务,假如当时存在业务就抛出反常。
  7. PROPAGATION_NESTED --假如当时存在业务就作为嵌入业务履行,不然与PROPAGATION_REQUIRED相似。

前6个业务战略与EJB的CMT相似,并且运用相同的常量名,因而对EJB开发人极彩彩票平台登录网址-详解阿里P7架构师是怎样在Spring中完成业务暂停员来说是很亲热的。第7个战略PROPAGATION_NESTED是Spring供给的一个变体:他需求业务办理器(如DataSourceTransactionManager)供给相似JDBC3.0那样的保存点API来嵌套业务行为或许经过

JTA支撑嵌套业务。

业务特点中的readOnly标识指示相应的业务应该作为一个只读业务来优化。这是一个优化提示:一些业务战略在这种情况下能够得到很好的功用优化,如运用ORM东西如Hibernate或TopLink时防止脏数据查看(“flush”测验)。

在业务特点中还有一个“timeout”选项来界说业务的超时秒数。在JTA中,这个特点会简略地传递给J2EE服务器的业务和谐器并被正确地解说。

运用业务署理

在运转时,客户端会获得一个“clinic”引证并转换为Clinic接口,然后调用如loadPet或storePet办法。这就隐式地运用了Spring的业务署理,经过“业务解说器”在方针方针中注册;这样一个新的业务就创立了,然后详细的作业就会署理给JdbcClinic的方针办法。

图1示例了一个运用“主张链”并抵达最终方针的AOP署理的潜在概念。在这个示例中,仅有的主张是一个业务解说器用来包装方针办法的业务行为。这是一种用来在声明性业务功用下运用的依据署理的AOP。

Figure 1. An AOP proxy with an advisor chain and a target at the end

例如,一个PetClinic运用的WEB层组件能够履行ServletContext定位来获取Spring WebApplicationContext的引证并且获取受办理的“clinic”BEAN:

清单4

WebApplicationContext ctx = 
WebApplicationContexUtils.getWebA极彩彩票平台登录网址-详解阿里P7架构师是怎样在Spring中完成业务暂停pplicationContext(servletContext);
Clinic clinic = (Clinic) ctx.getBean("clinic);
Pet pet = new Pet();
pet.setName("my new cat")极彩彩票平台登录网址-详解阿里P7架构师是怎样在Spring中完成业务暂停;
clinic.storePet(pet);

在调用storePet()之前,Spring的业务署理隐式地创立一个业务。当storePet()调用回来时,业务将提交或回滚。缺省情况下任何RuntimeException或Error将导致回滚。实践的提交或回滚能够是能够界说的:Sp极彩彩票平台登录网址-详解阿里P7架构师是怎样在Spring中完成业务暂停ring的业务特点支撑“回滚规矩”的概念。

例如,咱们能够能够引进一个强制的PetClinicException并且告知业务署理在抛出反常时回滚:

清单5

PROPAGATION_REQUIRED,readOnly,-PetClinicException
PROPAGATION_REQUIRED,-PetClinicException

这儿也有一个相似的“提交规矩”语法,指示特定的反常将触发一次提交。

留意上面示例的显式定位引证的办法仅仅一种拜访受Spring办理BEAN的办法的改动,能够用在任何WEB资源如servlet或filter。在构建依据Spring本身的MVC结构时,BEAN能够直接被注射到WEB操控器中。当然也支撑在如Struts, WebWork, JSF, and Tapestry结构中拜访Spring办理BEAN。概况能够参阅Spring的文档。

PlatformTransactionManager战略

Spring业务支撑的中心接口是org.springframework.transaction.PlatformTransactionManager。一切Spring的业务别离功用都会托付给PlatformTransactionManager(传给相应的TransactionDefinition实例)来做实践的业务履行。尽管PlatformTransactionManager接口能够直接调用,但一般运用只需求装备一个详细的业务办理器并且经过声明性业务来别离业务。

Spring供给几种不同的PlatformTransactionManager完结,分为如下两个类别:

  1. 本地业务战略—支撑单一资源的业务(一般是单个数据库),其包含org.springframework.jdbc.datasource.DataSourceTransactionManager和 org.springframework.orm.hibernate.HibernateTransactionManager。
  2. 大局业务办理—支撑或许跨过多个资源的大局业务。其相应的类为org.springframework.transaction.jta.JtaTransactionManager,将业务托付给遵从JTA规范的业务和谐器(一般为J2EE服务器,但不是强制的)。

PlatformTransactionManager笼统的首要价值在于运用不再被绑定在特定的业务办理环境。相反,业务战略能够很简略地切换—经过挑选不同的PlatformTransactionManager完结类。这就使得运用代码与声明业务awfull别离保持一致,而不需求考虑运用组件所运用的环境了。

例如,运用的初始版别或许布署在Tomcat上,与单个Oracle数据库交互。这能够方便地运用Spring的业务别离特性,只需挑选依据JDBC的DataSourceTransactionManager作为运用的业务战略。Spring会别离业务,而JDBC驱动会履行相应的原始JDBC业务。

相同运用的另一个版别或许会布署在WebLogic服务器上,运用两个Oracle数据库。运用代码和业务别离不需求改动。仅有不同的是挑选作为JtaTransactionManager业务战略,让Spring来别离业务而WebLogic服务器的业务和谐器来履行业务。

JTA UserTransaction与JTA TransactionManager比较

让咱们来看一下Spring对J极彩彩票平台登录网址-详解阿里P7架构师是怎样在Spring中完成业务暂停TA支撑的细节。尽管并十分常需求考虑这个细节但了解相关的细节还有必要的。对简略的用例如前面章节的示例,规范的JtaTransactionManager界说现已足够了,缺省的Spring JtaTransactionManager设置会从规范JNDI方位(J2EE规范所界说的java:comp/UserTransaction)获取JTA的javax.transaction.UserTransaction方针。这对大部分规范J2EE环境来说现已足够了。

可是,缺省的JtaTransactionManager不能履行业务暂停(也便是说不支撑PROPAGATION_REQUIRES_NEW和PROPAGATION_NOT_SUPPORTED)。原因就在于规范的JTA UserTransaction接口不支撑业务的暂停和康复,而只支撑开端和完结新的业务。

为了完结业务的暂停,需求一个javax.transaction.TransactionManager实例,他供给了JTA界说的规范的暂停和康复办法。不幸的是,J2EE没有为JTA TransactionManager界说规范的JNDI方位!因而,咱们需求运用厂商自己的定位机制。

清单6

 class="org.springframework.transaction.jta.JtaTransactionManager">

vendorSpecificJndiLocation


J2EE本质上没有考虑将JTA TransactionManager接口作为公共API的一部分。JTA规范本身界说了将TransactionManager接口作为容器集成的主意。尽管这是能够了解的,可是JTA TransactionManager的规范JNDI方位仍是能够添加必定的价值,特别是对轻量级容器如Spring,这样任何J2EE服务器就能够用一致的办法来定位JTA TransactionManager了。

不只Spring的JtaTransactionManager能够从拜访中获益,O/R映射东西如Hibernate, Apache OJB, and Kodo JDO也能得到优点,由于他们需求在JTA环境中履行缓存同步的才干(开释缓存意味着JTA业务的完结)。这种注册业务同步的才干只要JTA TransactionManager接口才干供给,而UserTransaction是处理不了的。因而,这些东西都需求完结自己的TransactionManager定位器。

为JTA TransactionManager界说规范的JNDI方位是许多底层软件供货商最希望J2EE完结的功用。假如J2EE5.0的规范拟定团队能够认识到这个特性的重要性就太好了。幸运地是,高档J2EE服务器如WebLogic Server现已考虑将JTA TransactionManager作为公共的API包含在扩展功用中。

在WebLogic JTA中完结Spring的业务别离

在WebLogic Server中,JTA TransactionManager官方的JNDI方位界说为javax.transaction.TransactionManager。这个值能够在Spring的JtaTransactionManager中作为“transactionManagerName”运用。原则上这样就能够在WebLogic's JTA体系中完结业务暂停了,也便是说支撑PROPAGATION_REQUIRES_NEW和PROPAGATION_NOT_SUPPORTED行为。

除了规范的JtaTransactionManager和其支撑的通用装备选项外,Spring还供给了一个专用的WebLogicJtaTransactionManager适配器来直接运用WebLogic的JTA扩展。

在享用主动勘探WebLogic的JTA TransactionManager的便当之外,他供给逾越规范JTA的三个重要特性:

  1. 业务命名—露出出Spring的业务名给WebLogic Server,使得Spring业务在WebLogic的业务监听器可见。缺省的,Spring会运用声明性业务的完好办法名。
  2. 每业务阻隔等级—将Spring业务特点中界说的阻隔等级运用到WebLogic JTA业务中。这使得每个业务都能够界说数据库的阻隔等级,而这是规范JTA所不支撑的。
  3. 强制业务康复—即便在暂停的业务被标识为回滚时也能够康复。这需求运用WebLogic的扩展TransactionManager接口来调用forceResume()办法。

Figure 2. WebLogic Server's transaction monitor (click the image for a full-size screen shot)

Spring的WebLogicJtaTransactionManager有用地为依据Spring的运用供给了WebLogic Server业务办理的悉数功用。这使得Spring业务别离成为一种能与EJB CMT竟争的产品,并且供给了相同等级的业务支撑。

Spring and EJB CMT

如上所示,Spring的POJO声明性业务别离能够作为一种除传统EJB CMT这外的挑选。可是Spring与EJB并不是完结互斥的,Spring的运用上下文也能够作为EJB faade的后台来办理数据拜访(DAO)和其他细纹路的业务方针。

在EJB情形中,业务是由EJB CMT来驱动的。对Spring来说,数据拜访支撑特性会主动检测到这样的环境并且选用相应的业务。例如,Spring对Hibernate的支撑能够供给隐式的资源办理,即便是EJB驱动的业务,乃至能够在不需求修正任何DAO代码的情况下供给相同的语义。

Spring有用的解耦了DAO完结与实践的运转环境。DAO能够参加Spring的业务就像参加EJB CMT业务相同。这不只简化在其他环境中的重用,并且更方便在J2EE容器外进行测验。

定论

Spring结构为J2EE和非J2EE环境供给了全量的业务别离的特性,特别表现在POJO的声明性业务上。他用一种灵敏而非侵入式的办法为非EJB环境中的业务别离供给了便当。与EJB不同,这样的业务性POJO运用方针能够很简略的被测验和在J2EE容器外补重用。

Spring供给了各种业务战略,如JtaTransactionManager是用来署理J2EE服务器的业务和谐器,而JDBC DataSourceTransactionManager是用来为简略的JDBC DataSource(便是单一方针数据库)履行业务。Spring能够很简略为不同的环境经过后台装备的简略修正来调整业务战略。

逾越规范的JTA支撑,Spring为WebLogic Server的JTA扩展供给了完善的集成,能够支撑高档特性如业务监督和每业务阻隔等级。经过对WebLogic Server的特别支撑,依据Spring的运用能够彻底运用WebLogic Server的业务办理功用。

Spring业务别离是继EJB CMT之外的另一种可选办法,特别是对那些依据POJO的轻量级架构。在那仅仅由于挑选LSSB(本地无状况会话BEAN)来运用声明性业务的情况下,依据Spring的POJO服务模型是一种可行的挑选,他供给了十分高层的灵敏性、可测验性和重用性。

Java肖先生:专心于Java开发技能的研讨与常识共享!

————END————

  • 点赞(感谢)
  • ...
  • 转发(感谢)
  • ...
  • 重视(感谢)
  • ...
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP