zero's Blog

持续迭代

  在之前的文章中,分析了AbstractBeanFactory#getBean()获取bean时,会调用到AbstractBeanFactory#doGetBean() ,在该方法中调用到AbstractAutowireCapableBeanFactory#createBean(),最终是调用了AbstractAutowireCapableBeanFactory#doCreateBean,这里面会清晰的看到创建Bean的几个过程:

  在调用AbstractBeanFactory#doGetBean()方法中会调用DefaultSingletonBeanRegistry#getSingleton()来看这个beanName是否已经加载并被DefaultSingletonBeanRegistry缓存了。

Read more »

转载自:https://blog.csdn.net/qq_39390545/article/details/106615075


Springboot跨域问题,是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点

  • 跨域只存在于浏览器端,不存在于安卓/ios/Node.js/python/ java等其它环境
  • 跨域请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。

之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。

浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。换句话说,浏览器安全的基石是同源策略。
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。


先给出一个熟悉的报错信息:
Springboot处理CORS跨域请求的三种方法
Access to XMLHttpRequest at ‘http://192.168.1.1:8080/app/easypoi/importExcelFile‘ from origin ‘http://localhost:8080‘ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

Read more »

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
username:
password:
url: jdbc:mysql://
hikari:
# 默认使用的hikari作为连接池,具体配置参考:https://github.com/brettwooldridge/HikariCP
poolName: hikariPool
minimumIdle: 10
maximumPoolSize: 10
connectionTimeout: 30000
idleTimeout: 30000
maxLifetime: 1800000
connectionTestQuery: SELECT 1

代码:

1
2
3
4
5
6
7
8
@Primary
@Bean(name = "mysqlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource mysqlDataSource(DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
}
Read more »

背景

这里我们有一个需求:

当用户支付成功时,需要修改订单状态;短信通知用户;通知仓库发货

原始解决方法

你首先想到的肯定是这样

1
2
3
4
5
6
7
public void paySuccess(String orderId) {
if (StringUtils.isNotBlank(orderId)) {
//1.修改订单状态
//2.发送短信通知用户
//3.通知仓库发货
}
}

在支付成功的方法里面调用修改订单的方法,调用短信通知用户的方法,调用仓库发货的方法。完事了,你觉得很简单嘛。

Read more »

痛点概述

当我们在排查bug ,需要看执行的完整sql 时,在 console可以拿到如图的sql img

然后手工一个一个的替换问号占位符后,去MySQL 执行,看sql有木有什么问题。如果sql简单,那比较好说, 如果是个复杂sql,手动替换N个问号占位符,这种痛相信大家都经历过。 今天介绍的 MybatisFinalSqlPlugin 插件 正是解决了这样的痛点,可以直接抓到最终sql。

Read more »

[toc]

1.核心接口

  Spring事务管理的实现有许多细节,下图是Spring的事务接口以及Spring实现事务的具体策略。Spring事务管理涉及的接口的联系如下:

1.1 事务管理器

  Spring的事务属于逻辑事务。不是物理事务。
  Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。 例如JDBC的事物管理器就是DataSourceTransactionManager
  Spring事务管理器的接口是PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。接口如下:

1
2
3
4
5
6
7
8
9
10
11
public interface PlatformTransactionManager {

// 由TransactionDefinition得到TransactionStatus对象
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

// 提交
void commit(TransactionStatus status) throws TransactionException;

// 回滚
void rollback(TransactionStatus status) throws TransactionException;
}
Read more »

Spring的事务属于逻辑事务。不是物理事务。
  Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给JDBC或者JTA等持久化机制所提供的相关平台框架的事务来实现。例如JDBC的事物管理器就是DataSourceTransactionManager
  Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager

1
2
3
4
5
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}

 通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。所以Spring事务管理的一个优点就是为不同的事务API提供一致的编程模型。

  Spring Boot 使用事务非常简单,需要@EnableTransactionManagement@Transactional配合使用。首先使用注解@EnableTransactionManagement 开启事务支持后,然后在Service方法上添加注解@Transactional便可。@EnableTransactionManagement,启注解事务管理等同于xml配置方式的 <tx:annotation-driven />

Read more »

@Transactional 生效原则 1

除非特殊配置(比如使用 AspectJ 静态织入实现 AOP),否则只有定义在 public 方法上的 @Transactional 才能生效。

@Transactional 生效原则 2

必须通过代理过的类从外部调用目标方法才能生效。

@Transactional 生效原则 3

第一,只有异常传播出了标记了 @Transactional 注解的方法,事务才能回滚;
默认情况下,出现 RuntimeException(非受检异常)或 Error 的时候,Spring 才会回滚事务。

如果希望自己捕获异常进行处理的话,可以手动设置让当前事务处于回滚状态:

1
2
3
4
5
6
7
8
9
10
11

@Transactional
public void createUserRight1(String name) {
try {
userRepository.save(new UserEntity(name));
throw new RuntimeException("error");
} catch (Exception ex) {
log.error("create user failed", ex);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
Read more »

[toc]

事务失效

事务失效我们一般要从两个方面排查问题

数据库层面

数据库层面,数据库使用的存储引擎是否支持事务?默认情况下MySQL数据库使用的是Innodb存储引擎(5.5版本之后),它是支持事务的,但是如果你的表特地修改了存储引擎,例如,你通过下面的语句修改了表使用的存储引擎为MyISAM,而MyISAM又是不支持事务的

1
2
alter table table_name engine=myisam;
复制代码

这样就会出现“事务失效”的问题了

解决方案:修改存储引擎为Innodb。

Read more »
0%