您现在的位置是:首页 >学无止境 >Spring的第十七阶段:xml配置式事务声明、Spring与web结合网站首页学无止境

Spring的第十七阶段:xml配置式事务声明、Spring与web结合

DKPT 2024-06-17 10:22:16
简介Spring的第十七阶段:xml配置式事务声明、Spring与web结合

1、xml配置式事务声明

去掉所有@Transactional的注解。

<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 配置加载 jdbc.properties 属性配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- 配置包扫描 -->
    <context:component-scan base-package="com"/>

    <!--
        需要配置数据库连接池
    -->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="username" value="${user}" />
        <property name="password" value="${password}" />
        <property name="url" value="${url}" />
        <property name="driverClassName" value="${driverClassName}" />
        <property name="initialSize" value="${initialSize}" />
        <property name="maxActive" value="${maxActive}" />
    </bean>


    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>


    <!--
     切面类
    -->
    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
          id="transactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!--
        事务属性
    -->
    <tx:advice id="tx_advice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--
                tx:method       标签配置哪些方法使用哪个事务属性
                name=""         配置方法名
                propagation=""  事务传播特性

                精确
            -->
            <tx:method name="multiTransaction" propagation="REQUIRED" />
            <tx:method name="multiUpdate" propagation="REQUIRED" />
            <!--
                name="save*" 以save打头的所有方法
                propagation 配置传播特性

                半模糊
            -->
            <tx:method name="save*" propagation="REQUIRED" />
            <!--
                name="delete*" 以 delete 打头的所有方法
                propagation 配置传播特性
            -->
            <tx:method name="delete*" propagation="REQUIRED" />
            <!--
                name="update*" 以 update 打头的所有方法
                propagation 配置传播特性
            -->
            <tx:method name="update*" propagation="REQUIRED" />
            <!--
                name="*" 表示前面匹配完之后,剩下的所有方法

                方法在匹配事务属性的时候,匹配的先后顺序是:
                精确匹配 ==>>> 半模糊匹配 ==>>> 全模糊匹配

                read-only="true"  表示只读
            -->
            <tx:method name="*" read-only="true" />
        </tx:attributes>
    </tx:advice>
    
    <!--
    	事务管理: 代理aop
    -->
    <aop:config>
        <!-- 配置切入点表达式 -->
        <aop:advisor advice-ref="tx_advice"
            pointcut="execution( public * com.atguigu..*Service*.*(..) )"
        />
    </aop:config>
</beans>

2、Spring整合Web( 在web工程中使用Spring )

2.1、在web工程中添加Spring的jar包

Spring的核心包

spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar

aop包

spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

JDBC-ORM包

spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar

Spring的web整合包

spring-web-4.0.0.RELEASE.jar

测试包

spring-test-4.0.0.RELEASE.jar

官方推荐我们把Spring容器对象创建的功能交给Spring来完成.不需要我们自己编写.
因为Spring容器一般只有一个,用户自己编写很容易造成由于Spring容器管理不当导致内存泄露.

整合Spring和Web容器分两个步骤:
1、导入spring-web-4.0.0.RELEASE.jar ( 包含创建Spring容器对象,以及Spring容器对象的销毁操作 )。
2、在web.xml配置文件中配置org.springframework.web.context.ContextLoaderListener监听器监听ServletContext的初始化 ( 用于创建Spring容器 , 和销毁Spring容器 )。
3、在web.xml配置文件中配置contextConfigLocation上下文参数。配置Spring配置文件的位置,以用于初始化Spring容器。

2.2、在web.xml中配置

 <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

2.3、获取WebApplicationContext上下文对象的方法如下:

方法一(推荐):

WebApplicationContextUtils.getWebApplicationContext(getServletContext())

方法二(不推荐):

getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

Spring 整合web 其实就一个关键
就是在web工程中创建Spring容器对象
然后得到这个Spring容器对象获取容器中的组件就可以使用了。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。