一、annotation和XML的优缺点
Spring的annotation注入机制与XML注入机制本质上是相同的。annnotation简洁一些,遵循一些IOC。
XML配置的优缺点:
优点有:
1. XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译。
2. 在处理大的业务量的时候,用XML配置应该更加好一些。因为XML更加清晰的表明了各个对象之间的关系,各个业务类之间的调用。同时spring的相关配置也能一目了然。
当然,有人会说,用XML配置,在大的业务量时候会使得XML文件过大,不容易查看。这一点我们完全可以利用业务分解书写多个XML配置文件就可以了。
缺点有:
配置文件读取和解析需要花费一定的时间,配置文件过多的时候难以管理,无法对配置的正确性进行校验,增加了测试难度。
annotation配置的优缺点:
优点有:
1. 在class文件中,可以降低维护成本,annotation的配置机制很明显简单
2. 不需要第三方的解析工具,利用java反射技术就可以完成任务
3. 编辑期可以验证正确性,差错变得容易
4. 提高开发效率
缺点有:
1. 如果需要对于annotation进行修改,那么要重新编译整个工程
2. 业务类之间的关系不如XML配置那样容易把握。
3. 如果在程序中annotation比较多,直接影响代码质量,对于代码的简洁度有一定的影响。
有些人喜欢annotation, 这样bean的声明,注册,注入都在“刚好”的地方出现,很自然。
个人觉得xml比较好用,整体业务关系清晰,易维护。
二、Spring事务用xml配置
注释配置往往是类级别的,而xml配置则可以表现的更加灵活。是用 aop/tx 命名空间的配置更加灵活简单。
Propagation :key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <import resource="applicationContext.xml"/> <!-- Spring myBatis3模板配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:/myBatis.xml" /> <!--<property name="typeAliasesPackage" value="org.snaker.engine.entity" />--> <property name="mapperLocations"> <list> <value> classpath*:com/hide168/library/*/dao/*.xml </value> <value> classpath*:com/hide168/module/*/dao/*.xml </value> <value> classpath*:com/hide168/protal/*/dao/*.xml </value> <value> classpath*:com/hide168/protal/*/*/dao/*.xml </value> </list> </property> </bean> <!-- mybatis spring sqlSessionTemplate --> <bean id="myBatisSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg> </bean> <!-- mybatis mapper, 接口形式的访问 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ztesoft.resmaster.module.dat.mapper"></property> <!--<property name="sqlSessionFactory" ref="myBatisSessionFactory"></property>--> <!--上面这句会导致:org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driver}'--> <property name="sqlSessionFactoryBeanName" value="myBatisSessionFactory"></property> </bean> <!-- 局部事务管理器,本地开发使用 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> <property name="globalRollbackOnParticipationFailure" value="false" /> </bean> <!--<tx:annotation-driven transaction-manager="myBatisTransactionManager" />--> <!-- proxy-target-class true:CGLIB代理 false:JDK代理--> <aop:aspectj-autoproxy proxy-target-class="true" /> <tx:advice id="myBatisTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- propagation设定事务传播级别--> <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="add*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/> <tx:method name="*" read-only="true" propagation="NOT_SUPPORTED" /> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="myBatisTxAdvice" pointcut=" execution(* com.hide168.module.*.service..*.*(..)) or execution(* com.hide168.mobile.*.service..*.*(..)) or execution(* com.hide168.protal.*.*.service..*.*(..))" /> </aop:config> <!--<aop:aspectj-autoproxy proxy-target-class="true" />--> <!-- 用于支持上传文件 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> </beans>
这是使用注解方式时要配置的,代码中的具体的注解以及事务的传播性、隔离级别一般在service 层中配置
annotation方式配置事务:
@Transactional
(1)、这里说明一下,有的把这个注解放在类名称上面了,这样你配置的这个@Transactional 对这个类中的所有public方法都起作用
(2)、@Transactional 方法方法名上,只对这个方法有作用,同样必须是public的方法
比如这里就对这个方法定义了一个事务同时设置了很多属性:
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class,timeout=1,isolation=Isolation.DEFAULT) public void saveUser(Map<String, String> map) throws Exception { System.out.println("方法开始"); for (int i = 0; i < 500000; i++) { System.out.println("*"); } System.out.println("进入保存"); userDao.saveUser(map); System.out.println("退出保存"); }
相关推荐
本节将详细介绍Spring如何通过XML配置和注解方式来实现事务管理。 首先,我们来看Spring事务的XML配置方式。在Spring中,事务管理通常通过`<tx:annotation-driven>`和`<bean>`标签来实现。`<tx:annotation-driven>`...
"springtest3"通常代表一个或多个Java源代码文件,这些文件包含使用Spring注解的类。例如,可能会有一个`@Component`注解的类表示一个Spring Bean,或者一个`@Service`、`@Repository`或`@Controller`注解的类,...
现代开发中,更倾向于使用注解配置或者Spring Boot的自动配置来简化配置过程。 总结来说,SSH框架整合涉及了Web层、持久层和业务逻辑层的协同工作,通过XML配置实现了各组件间的交互和业务逻辑。虽然现在有更多现代...
以上就是Spring注解和XML配置AOP的基本概念。通过这两种方式,我们可以灵活地在Spring应用中实现面向切面的编程,将横切关注点与业务逻辑分离,提升代码的模块化程度。在实际项目中,通常会结合使用注解和XML配置,...
在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...
然后,你可以逐步学习Spring注解的使用,如`@Controller`、`@Service`、`@Repository`等。同时,掌握Spring Boot的自动配置原理也很重要。最后,通过实际操作,创建一个类似的项目,实践是最好的老师。 8. **博文...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理应用程序的事务。...通过理解并实践这些配置,你可以更好地掌握Spring基于XML的事务管理机制,并将其应用到实际开发中。
在这个mini案例中,我们将深入理解SSH框架如何协同工作,以实现一个基于XML配置的Struts 2、注解驱动的Hibernate以及XML配置的Spring的整合。 **Struts 2框架** 是一个MVC(Model-View-Controller)架构,主要负责...
在Spring框架中,声明式事务管理是实现事务处理...在博文"Spring使用XML配置声明式事务"中,作者详细讲解了每个步骤,并可能通过示例代码展示了如何实际应用这些配置,帮助读者更好地理解和掌握Spring声明式事务管理。
在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...
在本篇【从零开始学Spring Boot】系列教程中,我们将深入探讨如何在Spring Boot项目中导入并使用XML配置。Spring Boot以其简化Spring应用的初始搭建以及开发过程而闻名,通常推崇的是Java配置而非XML配置。然而,在...
在声明式事务管理中,我们可以在业务逻辑方法上添加注解或配置XML来控制事务,而不需要在代码中显式地使用事务API来管理事务。这种方式可以让开发者专注于业务逻辑的实现,而由框架来保证事务的ACID属性。 在整合的...
这个入门示例项目旨在帮助初学者了解和掌握Spring 2.5.6版本中的注解使用和基于XML的IoC配置。 首先,让我们来探讨一下Spring的IoC概念。IoC是一种设计模式,它将对象的创建和管理权交给了容器,而不是由对象自身...
本文将深入探讨如何使用`@Scheduled`注解和XML配置来创建和管理定时任务。 首先,我们要引入Spring Schedule的依赖。在Maven的`pom.xml`文件中添加以下依赖: ```xml <groupId>org.springframework.boot ...
下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...
"spring和Mybatis的xml配置文件提示约束包"这个主题,主要是关于在XML配置文件中使用的DTD(Document Type Definition)文档类型定义,它为XML文件提供了结构约束和语法规范。 DTD是一种元语言,用于定义XML文档的...
这两种方法都是Spring为开发者提供的强大工具,但它们在使用场景、灵活性和配置方式上有所区别。 1. **基于`<task>`标签的任务调度** - `<task>`标签是Spring 3.0引入的特性,它简化了在Spring应用中配置定时任务...
在Spring MVC框架中,注解方式的配置是现代开发中常用的方法,它使得代码更加简洁,减少了XML配置的复杂性。下面将详细讲解如何通过注解实现Spring MVC的Controller控制器,以及如何设置访问路径。 首先,`Model1....
这里我们将深入探讨两种在Spring中实现AOP的方式:XML配置和注解配置。 首先,让我们来看看**XML配置AOP**。在Spring的早期版本中,XML配置是主要的配置方式。在`spring-aop-xml`中,你可能会看到以下关键元素: 1...
本篇将详细探讨在SSM中如何进行注解式和XML配置式的事务管理,以实现数据的一致性和完整性。 **一、Spring事务管理简介** Spring作为核心容器,提供了强大的事务管理功能,支持编程式和声明式事务管理。编程式事务...