`
KingwarLuo
  • 浏览: 12717 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Spring注解和XML配置的区别?为什么事务用XML配置更好?

 
阅读更多

一、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事务的XML配置方式。在Spring中,事务管理通常通过`&lt;tx:annotation-driven&gt;`和`&lt;bean&gt;`标签来实现。`&lt;tx:annotation-driven&gt;`...

    Spring框架xml注解配置方式实例

    "springtest3"通常代表一个或多个Java源代码文件,这些文件包含使用Spring注解的类。例如,可能会有一个`@Component`注解的类表示一个Spring Bean,或者一个`@Service`、`@Repository`或`@Controller`注解的类,...

    SSH三大框架整合 struts2(使用xml配置)+hibernate(使用xml配置)+spring(使用xml配置)

    现代开发中,更倾向于使用注解配置或者Spring Boot的自动配置来简化配置过程。 总结来说,SSH框架整合涉及了Web层、持久层和业务逻辑层的协同工作,通过XML配置实现了各组件间的交互和业务逻辑。虽然现在有更多现代...

    spring注解&XML配置AOP

    以上就是Spring注解和XML配置AOP的基本概念。通过这两种方式,我们可以灵活地在Spring应用中实现面向切面的编程,将横切关注点与业务逻辑分离,提升代码的模块化程度。在实际项目中,通常会结合使用注解和XML配置,...

    spring bean XML配置入门

    在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...

    Spring全注解project示例 (无web.xml配置)

    然后,你可以逐步学习Spring注解的使用,如`@Controller`、`@Service`、`@Repository`等。同时,掌握Spring Boot的自动配置原理也很重要。最后,通过实际操作,创建一个类似的项目,实践是最好的老师。 8. **博文...

    Spring基于XML方式配置事务

    在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理应用程序的事务。...通过理解并实践这些配置,你可以更好地掌握Spring基于XML的事务管理机制,并将其应用到实际开发中。

    SSH三大框架整合mini案例 struts 2(xml配置)+hibernate(注解)+spring(xml配置)

    在这个mini案例中,我们将深入理解SSH框架如何协同工作,以实现一个基于XML配置的Struts 2、注解驱动的Hibernate以及XML配置的Spring的整合。 **Struts 2框架** 是一个MVC(Model-View-Controller)架构,主要负责...

    Spring使用XML配置声明式事务

    在Spring框架中,声明式事务管理是实现事务处理...在博文"Spring使用XML配置声明式事务"中,作者详细讲解了每个步骤,并可能通过示例代码展示了如何实际应用这些配置,帮助读者更好地理解和掌握Spring声明式事务管理。

    Xml文件配置实现声明式事务管理

    在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...

    31. Spring Boot导入XML配置【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列教程中,我们将深入探讨如何在Spring Boot项目中导入并使用XML配置。Spring Boot以其简化Spring应用的初始搭建以及开发过程而闻名,通常推崇的是Java配置而非XML配置。然而,在...

    Spring 整合mybatis(注解&xml版声明式事务).pdf

    在声明式事务管理中,我们可以在业务逻辑方法上添加注解或配置XML来控制事务,而不需要在代码中显式地使用事务API来管理事务。这种方式可以让开发者专注于业务逻辑的实现,而由框架来保证事务的ACID属性。 在整合的...

    spring2.5.6注解以及xml简单ioc入门示例

    这个入门示例项目旨在帮助初学者了解和掌握Spring 2.5.6版本中的注解使用和基于XML的IoC配置。 首先,让我们来探讨一下Spring的IoC概念。IoC是一种设计模式,它将对象的创建和管理权交给了容器,而不是由对象自身...

    spring 定时器 注解+xml 方式模板

    本文将深入探讨如何使用`@Scheduled`注解和XML配置来创建和管理定时任务。 首先,我们要引入Spring Schedule的依赖。在Maven的`pom.xml`文件中添加以下依赖: ```xml &lt;groupId&gt;org.springframework.boot ...

    spring aop注解方式、xml方式示例

    下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...

    spring和Mybatis的xml配置文件提示约束包

    "spring和Mybatis的xml配置文件提示约束包"这个主题,主要是关于在XML配置文件中使用的DTD(Document Type Definition)文档类型定义,它为XML文件提供了结构约束和语法规范。 DTD是一种元语言,用于定义XML文档的...

    spring基于task标签和通过xml配置实现任务的区别

    这两种方法都是Spring为开发者提供的强大工具,但它们在使用场景、灵活性和配置方式上有所区别。 1. **基于`&lt;task&gt;`标签的任务调度** - `&lt;task&gt;`标签是Spring 3.0引入的特性,它简化了在Spring应用中配置定时任务...

    spring-mvc 注解方式xml配置

    在Spring MVC框架中,注解方式的配置是现代开发中常用的方法,它使得代码更加简洁,减少了XML配置的复杂性。下面将详细讲解如何通过注解实现Spring MVC的Controller控制器,以及如何设置访问路径。 首先,`Model1....

    Spring中Aop的使用包括xml和注解

    这里我们将深入探讨两种在Spring中实现AOP的方式:XML配置和注解配置。 首先,让我们来看看**XML配置AOP**。在Spring的早期版本中,XML配置是主要的配置方式。在`spring-aop-xml`中,你可能会看到以下关键元素: 1...

    SSM中进行注解式和XML配置式事务管理代码

    本篇将详细探讨在SSM中如何进行注解式和XML配置式的事务管理,以实现数据的一致性和完整性。 **一、Spring事务管理简介** Spring作为核心容器,提供了强大的事务管理功能,支持编程式和声明式事务管理。编程式事务...

Global site tag (gtag.js) - Google Analytics