Skip to content

Commit 6f93ed9

Browse files
committed
文本主要演示事务提交后调用的两种方式
1 parent 930125c commit 6f93ed9

27 files changed

+1170
-0
lines changed

.gitignore

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,3 +664,29 @@
664664
/springboot-aop-spel/target/classes/
665665
/springboot-sentinel/target/classes/
666666
/springboot-sentinel/springboot-sentinel.iml
667+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/common/config/DruidConfig$1.class
668+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/common/config/DruidConfig.class
669+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/common/config/SwaggerConfig.class
670+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/common/exception/BizException.class
671+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/common/exception/GlobalExceptionHandler.class
672+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/common/model/AjaxResult.class
673+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/remote/impl/RpcMockServiceImpl.class
674+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/remote/RpcMockService.class
675+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/transactional/annotation/AfterCommitTransationCallBack.class
676+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/transactional/aspect/AfterCommitTransationCallBackAspect.class
677+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/transactional/event/TransactionalListenerEvent.class
678+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/transactional/process/AfterCommitTransationCallBackProcess.class
679+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/user/constant/Constant.class
680+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/user/controller/UserController.class
681+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/user/dao/UserDao.class
682+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/user/entity/User$UserBuilder.class
683+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/user/entity/User.class
684+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/user/service/impl/UserServiceImpl.class
685+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/user/service/UserService.class
686+
/springboot-transation-after-commit/target/classes/com/github/lybgeek/SpringbootTransationAfterCommitApplication.class
687+
/springboot-transation-after-commit/target/classes/mybatis/user/UserDao.xml
688+
/springboot-transation-after-commit/target/classes/sql/t_user.sql
689+
/springboot-transation-after-commit/target/classes/application.yml
690+
/springboot-transation-after-commit/target/classes/application-jdbc.yml
691+
/springboot-transation-after-commit/target/test-classes/com/github/lybgeek/SpringbootTransationAfterCommitApplicationTests.class
692+
/springboot-transation-after-commit/springboot-transation-after-commit.iml

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
<module>springboot-aop-spel</module>
4141
<module>springboot-custom-eureka</module>
4242
<module>springboot-sentinel</module>
43+
<module>springboot-transation-after-commit</module>
4344
</modules>
4445
<parent>
4546
<groupId>org.springframework.boot</groupId>
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>springboot-learning</artifactId>
7+
<groupId>com.github.lybgeek</groupId>
8+
<version>0.0.1-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>springboot-transation-after-commit</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>org.springframework.boot</groupId>
17+
<artifactId>spring-boot-starter-web</artifactId>
18+
</dependency>
19+
20+
<!--mybatis-plus-->
21+
<dependency>
22+
<groupId>com.baomidou</groupId>
23+
<artifactId>mybatis-plus-boot-starter</artifactId>
24+
</dependency>
25+
26+
<!--阿里数据库连接池 -->
27+
<dependency>
28+
<groupId>com.alibaba</groupId>
29+
<artifactId>druid-spring-boot-starter</artifactId>
30+
</dependency>
31+
32+
<dependency>
33+
<groupId>mysql</groupId>
34+
<artifactId>mysql-connector-java</artifactId>
35+
</dependency>
36+
37+
<dependency>
38+
<groupId>org.springframework.boot</groupId>
39+
<artifactId>spring-boot-starter-aop</artifactId>
40+
</dependency>
41+
42+
<dependency>
43+
<groupId>io.springfox</groupId>
44+
<artifactId>springfox-swagger-ui</artifactId>
45+
</dependency>
46+
<dependency>
47+
<groupId>io.springfox</groupId>
48+
<artifactId>springfox-swagger2</artifactId>
49+
</dependency>
50+
51+
<dependency>
52+
<groupId>io.swagger</groupId>
53+
<artifactId>swagger-annotations</artifactId>
54+
</dependency>
55+
<dependency>
56+
<groupId>io.swagger</groupId>
57+
<artifactId>swagger-models</artifactId>
58+
</dependency>
59+
60+
<dependency>
61+
<groupId>org.projectlombok</groupId>
62+
<artifactId>lombok</artifactId>
63+
<optional>true</optional>
64+
</dependency>
65+
66+
<dependency>
67+
<groupId>org.apache.commons</groupId>
68+
<artifactId>commons-collections4</artifactId>
69+
</dependency>
70+
71+
72+
<dependency>
73+
<groupId>org.springframework.boot</groupId>
74+
<artifactId>spring-boot-starter-test</artifactId>
75+
<scope>test</scope>
76+
</dependency>
77+
78+
79+
</dependencies>
80+
81+
82+
<build>
83+
<plugins>
84+
<plugin>
85+
<groupId>org.apache.maven.plugins</groupId>
86+
<artifactId>maven-compiler-plugin</artifactId>
87+
<configuration>
88+
<source>${java.version}</source>
89+
<target>${java.version}</target>
90+
</configuration>
91+
</plugin>
92+
<plugin>
93+
<groupId>org.springframework.boot</groupId>
94+
<artifactId>spring-boot-maven-plugin</artifactId>
95+
<configuration>
96+
<excludes>
97+
<exclude>
98+
<groupId>org.projectlombok</groupId>
99+
<artifactId>lombok</artifactId>
100+
</exclude>
101+
</excludes>
102+
</configuration>
103+
</plugin>
104+
</plugins>
105+
</build>
106+
107+
108+
109+
</project>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
本文主要演示两种方式进行事务提交后调用的方式
2+
3+
- 方式一:通过 org.springframework.transaction.support.TransactionSynchronizationManager.registerSynchronization进行实现
4+
5+
- 方式二:基于事件驱动监听,通过org.springframework.transaction.event.TransactionalEventListener进行实现
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.github.lybgeek;
2+
3+
import org.mybatis.spring.annotation.MapperScan;
4+
import org.springframework.boot.SpringApplication;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+
@SpringBootApplication
8+
@MapperScan(basePackages = "com.github.lybgeek.user.**.dao")
9+
public class SpringbootTransationAfterCommitApplication {
10+
11+
public static void main(String[] args) {
12+
SpringApplication.run(SpringbootTransationAfterCommitApplication.class, args);
13+
}
14+
15+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.github.lybgeek.common.config;
2+
3+
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
4+
import com.alibaba.druid.util.Utils;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
6+
import org.springframework.boot.web.servlet.FilterRegistrationBean;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
10+
import javax.servlet.*;
11+
import java.io.IOException;
12+
13+
/**
14+
* @description: druid配置
15+
*
16+
**/
17+
@Configuration
18+
public class DruidConfig
19+
{
20+
21+
22+
23+
/**
24+
* 去除监控页面底部的广告
25+
*/
26+
@SuppressWarnings({ "rawtypes", "unchecked" })
27+
@Bean
28+
@ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
29+
public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
30+
{
31+
// 获取web监控页面的参数
32+
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
33+
// 提取common.js的配置路径
34+
String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
35+
String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
36+
final String filePath = "support/http/resources/js/common.js";
37+
// 创建filter进行过滤
38+
Filter filter = new Filter()
39+
{
40+
@Override
41+
public void init(FilterConfig filterConfig) throws ServletException
42+
{
43+
}
44+
@Override
45+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
46+
throws IOException, ServletException
47+
{
48+
chain.doFilter(request, response);
49+
// 重置缓冲区,响应头不会被重置
50+
response.resetBuffer();
51+
// 获取common.js
52+
String text = Utils.readFromResource(filePath);
53+
// 正则替换banner, 除去底部的广告信息
54+
text = text.replaceAll("<a.*?banner\"></a><br/>", "");
55+
text = text.replaceAll("powered.*?shrek.wang</a>", "");
56+
response.getWriter().write(text);
57+
}
58+
@Override
59+
public void destroy()
60+
{
61+
}
62+
};
63+
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
64+
registrationBean.setFilter(filter);
65+
registrationBean.addUrlPatterns(commonJsPattern);
66+
return registrationBean;
67+
}
68+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
2+
package com.github.lybgeek.common.config;
3+
4+
import com.google.common.collect.Lists;
5+
import io.swagger.annotations.ApiOperation;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import springfox.documentation.builders.ApiInfoBuilder;
10+
import springfox.documentation.builders.PathSelectors;
11+
import springfox.documentation.builders.RequestHandlerSelectors;
12+
import springfox.documentation.service.*;
13+
import springfox.documentation.spi.DocumentationType;
14+
import springfox.documentation.spi.service.contexts.SecurityContext;
15+
import springfox.documentation.spring.web.plugins.Docket;
16+
import springfox.documentation.swagger2.annotations.EnableSwagger2;
17+
18+
import java.util.List;
19+
20+
/**
21+
* @description: swagger配置
22+
* @author:
23+
**/
24+
@Configuration
25+
@EnableSwagger2
26+
public class SwaggerConfig {
27+
28+
29+
/** 是否开启swagger */
30+
@Value("${swagger.enabled:true}")
31+
private boolean enabled;
32+
33+
/** 设置请求的统一前缀 */
34+
@Value("${swagger.pathMapping:/}")
35+
private String pathMapping;
36+
37+
38+
@Bean
39+
public Docket groupRestApi() {
40+
return new Docket(DocumentationType.SWAGGER_2)
41+
// 是否启用Swagger
42+
.enable(enabled)
43+
// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
44+
.apiInfo(groupApiInfo())
45+
// 设置哪些接口暴露给Swagger展示
46+
.select()
47+
// 扫描所有有注解的api,用这种方式更灵活
48+
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
49+
// 扫描指定包中的swagger注解
50+
// .apis(RequestHandlerSelectors.basePackage("com.jomoo.retail"))
51+
// 扫描所有 .apis(RequestHandlerSelectors.any())
52+
.paths(PathSelectors.any())
53+
.build()
54+
// 设置安全模式,swagger可以设置访问token
55+
.securityContexts(Lists.newArrayList(securityContext()))
56+
.securitySchemes(Lists.<SecurityScheme>newArrayList(apiKey()))
57+
.pathMapping(pathMapping);
58+
}
59+
60+
/**
61+
* 添加摘要信息
62+
*/
63+
private ApiInfo groupApiInfo(){
64+
return new ApiInfoBuilder()
65+
.title("lyb-geek sentinel")
66+
.description("<div style='font-size:14px;color:red;'>SENTINEL RESTful APIs</div>")
67+
.termsOfServiceUrl("https://github.com/lyb-geek")
68+
.version("1.0")
69+
.build();
70+
}
71+
72+
73+
/**
74+
* 指定header key
75+
*/
76+
private ApiKey apiKey() {
77+
return new ApiKey("Authorization", "Authorization", "header");
78+
}
79+
80+
81+
/**
82+
* 安全上下文
83+
*/
84+
private SecurityContext securityContext() {
85+
return SecurityContext.builder()
86+
.securityReferences(defaultAuth())
87+
.forPaths(PathSelectors.regex("/.*"))
88+
.build();
89+
}
90+
91+
/**
92+
* 安全模式,这里指定token通过Authorization头请求头传递
93+
*/
94+
List<SecurityReference> defaultAuth() {
95+
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
96+
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
97+
authorizationScopes[0] = authorizationScope;
98+
return Lists.newArrayList(new SecurityReference("Authorization", authorizationScopes));
99+
}
100+
101+
102+
103+
104+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.github.lybgeek.common.exception;
2+
3+
public class BizException extends RuntimeException {
4+
private static final long serialVersionUID = 1L;
5+
protected final String message;
6+
protected Integer errorCode;
7+
8+
public BizException(String message) {
9+
this.message = message;
10+
}
11+
12+
public BizException(String message, Throwable e) {
13+
super(message, e);
14+
this.message = message;
15+
}
16+
17+
public BizException(Integer errorCode, String message, Throwable e) {
18+
super(message, e);
19+
this.message = message;
20+
this.errorCode = errorCode;
21+
}
22+
23+
public BizException(Integer errorCode, String message) {
24+
this.message = message;
25+
this.errorCode = errorCode;
26+
}
27+
28+
public String getMessage() {
29+
return this.message;
30+
}
31+
32+
public Integer getErrorCode() {
33+
return this.errorCode;
34+
}
35+
36+
public void setErrorCode(Integer errorCode) {
37+
this.errorCode = errorCode;
38+
}
39+
}

0 commit comments

Comments
 (0)