每日学习Java之一万个为什么

文章目录

Spring声明式事务配置

导入事务依赖 spring-tx

启用事务支持

加载所需数据源事务

配置事务注解,设置事务超时、指定回滚异常、指定不会滚、传播行为、只读。

事务接口PlatformTransactionManager

PlatformTransactionManager是Spring事务管理的核心接口,定义了事务管理的基本操作方法:

TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

获取当前事务或创建一个新的事务。

void commit(TransactionStatus status) throws TransactionException;

提交事务。

void rollback(TransactionStatus status) throws TransactionException;

回滚事务。

不同的持久层技术有不同的PlatformTransactionManager实现,例如:

DataSourceTransactionManager:用于JDBC和MyBatis等基于DataSource的数据访问技术。

JpaTransactionManager:用于JPA(Java Persistence API)。

HibernateTransactionManager:用于Hibernate。

JtaTransactionManager:用于分布式事务管理(XA协议)。

  1. TransactionDefinition
    TransactionDefinition接口定义了事务的一些属性,主要包括:

传播行为(Propagation Behavior):

定义了事务如何在方法调用之间传播。常见的传播行为有:

PROPAGATION_REQUIRED:默认值,如果当前存在事务,则加入该事务;否则创建一个新事务。

PROPAGATION_REQUIRES_NEW:总是创建一个新事务,并挂起当前事务(如果有)。

PROPAGATION_SUPPORTS:支持当前事务,但如果不存在事务则以非事务方式执行。

等等。

隔离级别(Isolation Level):

定义了事务的隔离级别,防止并发事务之间的相互干扰。常见的隔离级别有:

ISOLATION_DEFAULT:使用底层数据库的默认隔离级别。

ISOLATION_READ_UNCOMMITTED:允许读取未提交的数据(脏读)。

ISOLATION_READ_COMMITTED:允许读取已提交的数据。

ISOLATION_REPEATABLE_READ:确保在同一事务中多次读取相同数据时结果一致。

ISOLATION_SERIALIZABLE:最高级别的隔离,完全避免并发问题。

超时(Timeout):定义事务的最大执行时间,超过该时间将自动回滚。

只读标志(ReadOnly Flag):如果事务只读,则可以进行优化,减少锁的开销。

  1. TransactionStatus
    TransactionStatus接口提供了对当前事务状态的访问方法,包括:

boolean isNewTransaction();

判断当前事务是否是新创建的。

void setRollbackOnly();

标记当前事务需要回滚。

boolean isRollbackOnly();

判断当前事务是否标记为回滚。

基于AOP实现的声明式事务管理

Spring的声明式事务管理通过AOP(面向切面编程)实现,允许开发者在不修改业务代码的情况下添加事务管理逻辑。具体来说,Spring通过代理机制在方法调用前后插入事务管理逻辑。

Spring基于AOP的事务具体实现流程

@Transactional细节

1.注解位置 ElementType

2.只读 readOnly

3.超时 timeout

4.隔离级别:isolation 默认RR

5.设置回滚异常 :RollbackFor 默认Runtime 必须是Exception子类

6.设置异常不回滚:noRollbackFor 一定在RollbackFor异常内

事务传播行为

java 复制代码
public enum Propagation {
    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);

    private final int value;

    private Propagation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }
}

SpringMVC所需依赖

spring-webmvc

jakarta jakartaee web api

SpringMVC五个组成部分功能及其原理

CEO:DispatcherServlet (配置在web.xml 设置为servlet 处理 "/")

  • 功能:负责所有的请求的处理和响应
  • 原理:Tomcat中的servlet 有一个init()方法

秘书:RequestMappingHandlerMapping (配置在spring.xml文件 / CEO.properties自带 / 配置在WebApplicationInitializer中)

  • 功能:记录controller方法和访问地址的关系

经理:RequestMappingHandlerAdapter (和秘书一块)

  • 功能:url参数处理和handler返回数据处理

财务:ViewResolver

  • 功能:处理页面响应

SpringMVC Handler方法注解

@RestMapping

@RequestMapping

@PostMapping

@GetMapping

@PutMapping

@DeleteMapping

@ResponseBody(易错)

RequestMappingHandlerAdapter工作原理

Handler需要处理的数据格式,以及用于简化参数接收的参数注解

Get接收请求行:

查询字符串:形参接收 / 引用(字符串)接收

查询字符串一键多值:@RequestParam + 集合或者数组

动态路径参数:@PathVariable

@RequestParam (value)

@PathVariable

Post接收请求体:@RequestBody

接收请求头:@RequestHeadler

接收Cookie:@CookieValue

@RequestBody

@RequestHeader

@CookieValue

快速获取三大域 request session servletContext

SpringMVC 处理 JSON 415问题

本质上是自定义的HandlerAdapter 覆盖了 MVC 自带的,使得jackson无法被增强到Adapter中。

那么为什么呢?

为什么jsp文件需要放在WEB-INF下(安全性)

  • 隐藏内部实现:将JSP文件放在WEB-INF目录下可以防止客户端直接访问服务器端的源代码或中间状态页面。这有助于保护应用程序的内部逻辑和数据结构不被轻易暴露。

  • 控制访问权限:通过Servlet来转发请求到位于WEB-INF下的JSP文件,可以更好地控制对这些资源的访问权限。例如,只有经过身份验证和授权的用户才能访问某些特定的JSP页面。

  • 提高安全性:如果JSP文件包含敏感信息(如数据库配置、密钥等),将其放置在WEB-INF目录下可以减少泄露的风险。即使攻击者能够获取到Web应用的部分信息,也无法直接访问WEB-INF目录中的内容。

  • 避免缓存问题:有时浏览器会缓存静态资源。将动态生成的内容放在WEB-INF目录下可以避免这种缓存带来的潜在问题,因为这些内容通常是动态生成的,不应该被缓存。

ViewReslover配置

java 复制代码
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

MVC jsp页面跳转、转发、重定向

首先Mapping正常写,但是ResponseBody不写了否则会将目标页面地址作为字符串返回。

其次跳转只需要写最大公共前缀和最大公共后缀的中间地址如 index

最后转发和重定向需要如下格式 或者 跳转到 http://www.baidu.com

  • forward:/ controller / handler
  • redirect:/ controller / handler

JSON格式的二进制字符串数据在SpringMVC中的转换时机

请求到达控制器:当客户端发送一个HTTP请求到Spring MVC应用程序时,请求会被DispatcherServlet拦截并路由到相应的控制器方法。

消息转换器(Message Converter):

Spring MVC使用HttpMessageConverter接口 来处理请求和响应体的数据绑定。对于JSON格式的数据,常用的实现类是MappingJackson2HttpMessageConverter

当请求体包含JSON格式的数据时,MappingJackson2HttpMessageConverter会将请求体中的JSON字符串转换为Java对象。这个过程发生在调用控制器方法之前

控制器方法执行:

控制器方法接收到转换后的Java对象,并进行业务逻辑处理。

如果控制器方法需要返回JSON格式的数据,则可以返回一个Java对象,由Spring MVC自动将其转换为JSON字符串。

响应体生成:

在控制器方法执行完毕后,Spring MVC再次使用MappingJackson2HttpMessageConverter将Java对象转换为JSON字符串,并将其写入响应体中,最终发送给客户端。

MVC访问静态资源404

有没有配置静态资源处理+viewresolver

前后缀匹配问题

java 复制代码
<mvc:default-servlet-handler>
相关推荐
AI绘画哇哒哒40 分钟前
【收藏必看】大模型智能体六大设计模式详解:从ReAct到Agentic RAG,构建可靠AI系统
人工智能·学习·ai·语言模型·程序员·产品经理·转行
q***33373 小时前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
小奶包他干奶奶5 小时前
Webpack学习——Loader(文件转换器)
前端·学习·webpack
小奶包他干奶奶5 小时前
Webpack学习——原理理解
学习·webpack·devops
励志成为美貌才华为一体的女子5 小时前
强化学习PPO和GRPO逻辑学习
学习
tobebetter95275 小时前
How to manage python versions on windows
开发语言·windows·python
meichaoWen6 小时前
【Vue3】vue3的全面学习(一)
前端·javascript·学习
FFF团团员9096 小时前
树莓派学习笔记3:LED和Button
笔记·学习
Y***h1876 小时前
第二章 Spring中的Bean
java·后端·spring
9***P3346 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率