Spring中的相关接口和实现类:
案例:模拟银行账户间转账业务
需求:实现任意两个账户间转账
库表:t_act
业务层和数据层接口:
业务层实现类:
未开启事务的情况下,模拟转账异常(使用10/0),测试:
出现丢钱的情况:
STEP1:在业务层接口添加Spring事务管理
@Transactional
public interface AccountService{public void transfer(String out,String in,Double money);}
STEP2:设置平台事务管理器
STEP3:开启注解式事务驱动
在Spring配置类SpringConfig.class中加入:
@EnableTransactionManagement
未加入Spring事务之前:
加入@Transactional
有些异常默认不参与回滚,需要手动加,比如IOException:
由于IOException默认不参加回滚,此时即使开启Spring事务,也会丢钱。需手动在rollbackfor属性加一下:
其余属性:
案例--转账业务追加日志
代码实现:
定义数据层和业务层:
业务层实现类:
为实现"不论转账是否成功,均有日志留痕",将日志语句放在finally中:
运行后发现,发生异常后,日志并未写入
原因分析:
事务管理员和事务协调当前是一个整体,
而我需要日志记录是另一个单独的事务。这样,上面的账户事务回滚的时候,日志事务不回滚
事务的传播行为:
事务协调员对事务管理员所携带事务的处理态度,即你开启事务了,我是加入呢?不加入呢?还是自己开一个事务呢。通过在Transactional注解的Propagation属性进行说明。
各个取值含义:
此时,发生异常,log数据表中正常记录:
SpringMVC技术和Servlet技术功能等同,均属于web层开发技术,是一种基于JAVA的轻量级Web框架。
使用Servlet:
使用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")@ResponseBodypublic String save(){System.out.println("save ...");return "{'code':'9527'}";}}
代码实现:
控制器类:
package com.llg.controller;import ... @Controller
public class UserController {/*** RequestMapping注解设置当前操作的访问路径* ResponseBody注解设置当前操作的返回值类型* @return*/@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("User save ...");return "{'module':'SpringMVC'}";}@RequestMapping("/code")@ResponseBodypublic 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*/@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}/*** 设置哪些请求归属SpringMVC处理* /表示拦截所有请求,任意请求都转入到SpringMVC处理* @return*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}/*** 加载Spring容器的配置* @return*/@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}
}
pom文件中加入tomcat插件:
org.apache.tomcat.maven tomcat7-maven-plugin 2.2 / 9090 UTF-8
工作流程分析:
功能不同,如何避免Spring加载bean的时候错误的加载到SpringMVC的bean—加载Spring控制的bean的时候排除掉SpringMVC控制的bean
具体实现:
此时getBean就拿不到UserController类的bean了:
相关注解–@ComponentScan
SpringMVC和Spring加载对应的bean:
在此基础上,做一个简化,去继承另一个类:
上一篇:gradle基本使用