你能定义声明式的回滚规则。应用程序开发者常想要事务能够在遇到任何异常时回滚,但EJB在遇到未捕获的应用程序异常时不会自动回滚(仅仅在未检查的异常和其他Throwable异常还有“系统”异常时才回滚)。Spring的事务管理允许你声明式地指定哪个异常和子类是应该引起自动回滚的。默认的行为和EJB一样,但你可以指定经检查异常和未经检查异常一样回滚。这在最小化可编程回滚需要上有很大好处,而这可编程回滚也建立了对Spring事务API的依赖(就像EJB可编程回滚建立对EJBContext的依赖一样)。
底层Spring事务抽象支持保存点(如果底层事务基本结构支持的话),所以Spring的声明性事务管理能支持嵌套事务,和EJB CMT特有的传播模式(Spring支持和EJB一样的语义)。因而,举例来说,如果你在Oracle上执行JDBC操作,你能通过Spring使用声明性嵌套事务。
事务管理没有绑定JTA。正如前面解释的,Spring事务管理能和不同事务策略合作。你还可以使用Spring AOP实现应用程序特有方面。是否要这样做取决于你对AOP概念的理解程度,而不是Spring的能力,但这会是很有用的。我们见到的成功例子包括:
在安全检查要求的复杂度超过了标准J2EE 安全基础结构的地方自定义安全拦截器。(当然,在开始你自己的安全结构前,你应该看看Acegi Security for Spring,一个强大、灵活的用AOP和Spring整合的安全框架,这也反映了Spring架构上的方法。)
在开发中使用调式和记录方面。
实现在一个地方使用一致的异常处理策略的方面。
发送邮件给管理员或用户,警告不正常情况的拦截器。
应用程序特有方面能成为消除许多方法对样板代码需要的有效途径。
Spring AOP透明地与Spring BeanFactory概念集成。代码从一个Spring的BeanFactory中获得一个对象的时候不用知道它是不是被拦截。和任何对象一样,契约是在对象实现的接口上定义的。
下面的XML片断描述了如何定义一个AOP代理:
<bean id="myTest" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>org.springframework.beans.ITestBean</value> </property> <property name="interceptorNames"> <list> <value>txInterceptor</value> <value>target</value> </list> </property>
</bean>
注意,尽管引用的或BeanFactory的getBean()方法返回的bean类型依赖于代理接口,bean定义里的类总是AOP框架的ProxyFactoryBean。(支持多代理方法。) ProxyFactoryBean的“interceptorNames”属性接受一个String列表。(必须用bean名称而不是bean引用,因为如果代理是一个原型那么新的有状态拦截器需要被创建。)列表里的名字可以是拦截器或者切入点(拦截器和何时该被应用的信息)。上面列表里的“target”值自动建立一个“调用拦截器”封装目标对象。它是工厂里的一个实现了代理接口的bean的名称。例子里的myTestbean能像工厂里的其他bean那样被使用。例如其他对象可以通过<ref>元素引用它,并且这些引用可以用Spring IoC设置。
文章来源于领测软件测试网 https://www.ltesting.net/