【SSM】篇三:Spring事务和SpringMVC入门案例

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 【SSM】篇三:Spring事务和SpringMVC入门案例,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、Spring事务

1.1 Spring事务简介

  • 事务的作用:在数据层保障一系列的数据库操作同时成功或者同时失败
  • Spring事务作用:在数据层或业务层保障一系列的数据库操作同时成功或者同时失败

Spring中的相关接口和实现类:

在这里插入图片描述

案例:模拟银行账户间转账业务

需求:实现任意两个账户间转账
在这里插入图片描述
库表:t_act
在这里插入图片描述
业务层和数据层接口:
在这里插入图片描述
在这里插入图片描述
业务层实现类:
在这里插入图片描述

未开启事务的情况下,模拟转账异常(使用10/0),测试:
在这里插入图片描述

出现丢钱的情况:
在这里插入图片描述

STEP1:在业务层接口添加Spring事务管理

@Transactional
public interface AccountService{

	public void transfer(String out,String in,Double money);
	
}
  • Spring注解式事务通常添加在业务层接口中,而不会添加到业务层实现类中,降低耦合
  • 注解式事务可以添加到某个方法上,表示当前方法开启事务,也可添加到接口上,表示接口中的所有方法开启事务

STEP2:设置平台事务管理器

在这里插入图片描述

STEP3:开启注解式事务驱动

在Spring配置类SpringConfig.class中加入:

@EnableTransactionManagement

1.2 Spring事务角色

  • 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
  • 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

未加入Spring事务之前:
在这里插入图片描述
加入@Transactional

在这里插入图片描述
在这里插入图片描述

1.3 Spring事务配置

有些异常默认不参与回滚,需要手动加,比如IOException:

在这里插入图片描述
由于IOException默认不参加回滚,此时即使开启Spring事务,也会丢钱。需手动在rollbackfor属性加一下:
在这里插入图片描述

其余属性:

在这里插入图片描述

案例--转账业务追加日志

在这里插入图片描述

代码实现:

定义数据层和业务层:
在这里插入图片描述
在这里插入图片描述
业务层实现类:
在这里插入图片描述
为实现”不论转账是否成功,均有日志留痕”,将日志语句放在finally中:
在这里插入图片描述
运行后发现,发生异常后,日志并未写入

原因分析:
事务管理员和事务协调当前是一个整体,
在这里插入图片描述

而我需要日志记录是另一个单独的事务。这样,上面的账户事务回滚的时候,日志事务不回滚

在这里插入图片描述

事务的传播行为:

事务协调员对事务管理员所携带事务的处理态度,即你开启事务了,我是加入呢?不加入呢?还是自己开一个事务呢。通过在Transactional注解的Propagation属性进行说明。

各个取值含义:
在这里插入图片描述
在这里插入图片描述
此时,发生异常,log数据表中正常记录:

在这里插入图片描述

2、SpringMVC

2.1 SpringMVC简介

SpringMVC技术和Servlet技术功能等同,均属于web层开发技术,是一种基于JAVA的轻量级Web框架。

在这里插入图片描述
使用Servlet:
在这里插入图片描述
使用SpringMVC:
在这里插入图片描述

2.2 SpringMVC入门案例

步骤:

STEP1:导入SpringMVC坐标与Servlet坐标

在这里插入图片描述

STEP2:创建SpringMVC控制器类(等同于Servlet功能)

在这里插入图片描述

STEP3:初始化SpringMVC环境

这里和Spring一样,写配置类,加载对应的bean

在这里插入图片描述

STEP4:告诉TomCat加载SpringMVC环境

初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求

在这里插入图片描述

相关注解:

- 名称:@Controller
- 类型:类注解
- 位置:SpringMVC控制器类定义的上方
- 作用:设定SpringMVC核心控制器bean

@Controller
public class UserController{

}
- 名称:@RequestMapping
- 类型:方法注解
- 位置:SpringMVC控制器方法定义的上方
- 作用:设定当前控制器方法的访问路径

@Controller
public class UserController{

	@RequestMapping("/save")
	public void save(){
		System.out.println("save ...");
	}

}
- 名称:@ResponseBody
- 类型:方法注解
- 位置:SpringMVC控制器方法定义的上方
- 作用:设定当前控制器方法响应内容为当前返回值,无需解析

@Controller
public class UserController{

	@RequestMapping("/save")
	@ResponseBody
	public String save(){
		System.out.println("save ...");
		return "{'code':'9527'}";
	}

}

代码实现:

在这里插入图片描述

控制器类:

package com.llg.controller;

import ... 

@Controller
public class UserController {
    /**
     * RequestMapping注解设置当前操作的访问路径
     * ResponseBody注解设置当前操作的返回值类型
     * @return
     */
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("User save ...");
        return "{'module':'SpringMVC'}";
    }

    @RequestMapping("/code")
    @ResponseBody
    public String code(){
        System.out.println("code ...");
        return "{'code':'9527'}";
    }
}

写配置类,加载bean:

package com.llg.config;

import ...

@Configuration
@ComponentScan("com.llg.controller")
public class SpringMvcConfig {
}

初始化Servlet容器,加载SpringMVC环境:

package com.llg.config;

import ...

/**
 * 定义servlet容器启动配置类,在里面加载Spring的配置
 * @author LLG
 * @date 2023/3/13
 */
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    /**
     * 加载SpringMVC容器配置的
     * @return
     */
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    /**
     * 设置哪些请求归属SpringMVC处理
     * /表示拦截所有请求,任意请求都转入到SpringMVC处理
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    /**
     * 加载Spring容器的配置
     * @return
     */
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

pom文件中加入tomcat插件:

<build>
    <plugins>

        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>

            <configuration>                
                <path>/</path> <!-- 项目访问路径 本例:localhost:9090, 如果配置的aa,则访问路径为localhost:9090/aa -->
                <port>9090</port>
                <uriEncoding>UTF-8</uriEncoding><!-- 非必需项 -->
            </configuration>
        </plugin>

    </plugins>
</build>

在这里插入图片描述

工作流程分析:

在这里插入图片描述

2.3 bean加载控制

功能不同,如何避免Spring加载bean的时候错误的加载到SpringMVC的bean—加载Spring控制的bean的时候排除掉SpringMVC控制的bean

在这里插入图片描述
具体实现:
在这里插入图片描述
在这里插入图片描述
此时getBean就拿不到UserController类的bean了:
在这里插入图片描述

相关注解–@ComponentScan

  • 名称:@ComponentScan
  • 类型:类注解
  • 属性:
    excludeFilters:排除扫描路径中加载的bean,需要指定类别type和具体项classes
    includeFilters:加载指定的bean,需要指定类别type和具体项classes

SpringMVC和Spring加载对应的bean:
在这里插入图片描述
在此基础上,做一个简化,去继承另一个类:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146080.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!