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

发布于:2025-03-11 ⋅ 阅读:(35) ⋅ 点赞:(0)

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异常内

事务传播行为

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配置

    <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
前后缀匹配问题

<mvc:default-servlet-handler>