├── .gitignore
├── README.md
└── src
├── msadv1
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv1
│ │ │ ├── Msadv1Application.java
│ │ │ ├── controller
│ │ │ └── HelloController.java
│ │ │ └── domain
│ │ │ └── DemoProperties.java
│ └── resources
│ │ ├── application-test.properties
│ │ └── application.properties
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv1
│ └── Msadv1ApplicationTests.java
├── msadv10
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv10
│ │ │ ├── Msadv10Application.java
│ │ │ ├── config
│ │ │ └── RedisConfig.java
│ │ │ └── domain
│ │ │ ├── User.java
│ │ │ └── UserRepository.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv10
│ └── UserRepositoryTest.java
├── msadv11
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv11
│ │ │ ├── Msadv11Application.java
│ │ │ ├── aspect
│ │ │ └── WebLogAspect.java
│ │ │ └── web
│ │ │ └── HelloController.java
│ └── resources
│ │ ├── application-dev.properties
│ │ ├── application-prod.properties
│ │ ├── application-test.properties
│ │ ├── application.properties
│ │ └── log4j.properties
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv11
│ └── Log4jApplicationTests.java
├── msadv12
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv12
│ │ │ ├── Msadv12Application.java
│ │ │ ├── aspect
│ │ │ └── WebLogAspect.java
│ │ │ ├── log
│ │ │ └── MongoAppender.java
│ │ │ └── web
│ │ │ └── HelloController.java
│ └── resources
│ │ ├── application.properties
│ │ └── log4j.properties
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv11
│ └── Log4jApplicationTests.java
├── msadv13
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv13
│ │ │ ├── Msadv13Application.java
│ │ │ └── mq
│ │ │ ├── RabbitMqConfig.java
│ │ │ ├── Receiver.java
│ │ │ └── Sender.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv13
│ └── RabbitMqTest.java
├── msadv14
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv14
│ │ │ ├── Msadv14Application.java
│ │ │ ├── handler
│ │ │ ├── AsyncTask.java
│ │ │ └── SerialTask.java
│ │ │ └── job
│ │ │ └── ScheduledTasks.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv14
│ └── TaskTests.java
├── msadv15
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv15
│ │ │ ├── Msadv15Application.java
│ │ │ ├── handler
│ │ │ ├── AsyncTask.java
│ │ │ ├── SerialTask.java
│ │ │ └── ThreadPoolTask.java
│ │ │ └── job
│ │ │ └── ScheduledTasks.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv15
│ └── TaskTests.java
├── msadv16
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv16
│ │ │ ├── Msadv16Application.java
│ │ │ └── handler
│ │ │ └── Task.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv16
│ └── TaskTests.java
├── msadv17
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv17
│ │ │ ├── Msadv17Application.java
│ │ │ └── handler
│ │ │ └── Task.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv17
│ └── TaskTests.java
├── msadv18
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── MSL_LOGO.jpg
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv18
│ │ │ └── Msadv18Application.java
│ └── resources
│ │ ├── application.yml
│ │ └── templates
│ │ └── template.html
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv18
│ └── ApplicationTests.java
├── msadv19
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv19
│ │ │ ├── Msadv19Application.java
│ │ │ └── domain
│ │ │ ├── EventConfig.java
│ │ │ ├── Events.java
│ │ │ ├── StateMachineConfig.java
│ │ │ └── States.java
│ └── resources
│ │ ├── application.properties
│ │ └── banner.txt
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv19
│ └── Msadv19ApplicationTests.java
├── msadv2
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv2
│ │ │ ├── Msadv2Application.java
│ │ │ ├── controller
│ │ │ └── UserController.java
│ │ │ ├── domain
│ │ │ ├── Person.java
│ │ │ ├── PersonRepository.java
│ │ │ ├── User.java
│ │ │ ├── UserRepository.java
│ │ │ └── UserRepositoryImpl.java
│ │ │ ├── service
│ │ │ ├── PersonService.java
│ │ │ ├── UserService.java
│ │ │ └── UserServiceImpl.java
│ │ │ └── util
│ │ │ └── StatusResponse.java
│ └── resources
│ │ └── application.properties
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv2
│ ├── PersonServiceTest.java
│ ├── UserControllerTest.java
│ └── UserServiceTest.java
├── msadv3
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv3
│ │ │ ├── Msadv3Application.java
│ │ │ ├── Swagger2Config.java
│ │ │ ├── controller
│ │ │ ├── ExceptionController.java
│ │ │ ├── HelloController.java
│ │ │ └── UserController.java
│ │ │ ├── domain
│ │ │ ├── ErrorInfo.java
│ │ │ ├── User.java
│ │ │ ├── UserRepository.java
│ │ │ └── UserRepositoryImpl.java
│ │ │ ├── service
│ │ │ ├── UserService.java
│ │ │ └── UserServiceImpl.java
│ │ │ └── util
│ │ │ ├── GlobalExceptionHandler.java
│ │ │ ├── MyException.java
│ │ │ └── StatusResponse.java
│ └── resources
│ │ ├── application.properties
│ │ ├── static
│ │ ├── MSL_LOGO.jpg
│ │ ├── dakongyi_header.PNG
│ │ ├── dakongyi_header.jpg
│ │ └── kejidog.jpg
│ │ └── templates
│ │ ├── error.html
│ │ └── index.html
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv3
│ └── Msadv3ApplicationTests.java
├── msadv4
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv4
│ │ │ ├── Msadv4Application.java
│ │ │ ├── WebSecurityConfig.java
│ │ │ ├── controller
│ │ │ └── HelloController.java
│ │ │ ├── domain
│ │ │ ├── User.java
│ │ │ └── UserRepository.java
│ │ │ └── service
│ │ │ ├── UserService.java
│ │ │ └── UserServiceImpl.java
│ └── resources
│ │ ├── application.yml
│ │ └── templates
│ │ ├── hello.html
│ │ ├── index.html
│ │ ├── login.html
│ │ └── logout.html
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv4
│ ├── UserRepositoryTest.java
│ └── UserServiceTest.java
├── msadv5
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv5
│ │ │ ├── DataSourceConfig.java
│ │ │ ├── JdbcTemplateConfig.java
│ │ │ ├── Msadv5Application.java
│ │ │ ├── PrimaryJpaConfig.java
│ │ │ ├── SecondaryJpaConfig.java
│ │ │ ├── primary
│ │ │ ├── Message.java
│ │ │ └── MessageRepository.java
│ │ │ └── secondary
│ │ │ ├── User.java
│ │ │ └── UserRepository.java
│ └── resources
│ │ ├── application.properties
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv5
│ ├── JdbcTemplateDataSourcesTest.java
│ └── JpaDataSourcesTest.java
├── msadv6
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv6
│ │ │ ├── Msadv6Application.java
│ │ │ └── domain
│ │ │ ├── Client.java
│ │ │ ├── ClientRepository.java
│ │ │ └── User.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv6
│ ├── MongoApplicationTest.java
│ └── RedisApplicationTest.java
├── msadv7
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv7
│ │ │ ├── Msadv7Application.java
│ │ │ └── domain
│ │ │ ├── User.java
│ │ │ └── UserMapper.java
│ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv7
│ └── MyBatisApplicationTests.java
├── msadv8
├── .gitignore
├── .mvn
│ └── wrapper
│ │ ├── maven-wrapper.jar
│ │ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── manulife
│ │ │ └── msadv8
│ │ │ ├── Msadv8Application.java
│ │ │ ├── domain
│ │ │ ├── User.java
│ │ │ └── UserRepository.java
│ │ │ └── service
│ │ │ ├── ClientService.java
│ │ │ ├── UserService.java
│ │ │ └── UserServiceImpl.java
│ └── resources
│ │ ├── application.yml
│ │ └── db
│ │ └── V1.0__BaseVersion.sql
│ └── test
│ └── java
│ └── com
│ └── manulife
│ └── msadv8
│ ├── UserRepositoryTest.java
│ └── UserServiceTest.java
└── msadv9
├── .gitignore
├── .mvn
└── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
├── java
│ └── com
│ │ └── manulife
│ │ └── msadv9
│ │ ├── Msadv9Application.java
│ │ └── domain
│ │ ├── User.java
│ │ ├── UserCacheRepository.java
│ │ └── UserRepository.java
└── resources
│ ├── application.yml
│ └── ehcache.xml
└── test
└── java
└── com
└── manulife
└── msadv9
├── UserCacheRepositoryTest.java
└── UserRepositoryTest.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled class file
2 | *.class
3 |
4 | # Log file
5 | *.log
6 |
7 | # BlueJ files
8 | *.ctxt
9 |
10 | # Mobile Tools for Java (J2ME)
11 | .mtj.tmp/
12 |
13 | # Package Files #
14 | *.jar
15 | *.war
16 | *.nar
17 | *.ear
18 | *.zip
19 | *.tar.gz
20 | *.rar
21 |
22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
23 | hs_err_pid*
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # EDC.SpringBoot.Learning
2 |
3 | ## SpringBoot
4 | [](https://start.spring.io/)
5 |
6 | 基于程序猿DD的SpringBoot教程所做的学习实践,基于SprintBoot 1.5.15版本,每个项目均演示了部分内容。由于程序猿DD的文章示例版本太旧,部分Code无法正常运行,所以在学习途中(非SpringBoot2.0版本的学习)可以参考本示例Demo来学习。
7 |
8 | - msadv1 :
9 | Hello World & 配置文件的使用(多环境配置文件的使用) & MVC Controller & 热部署
10 | - msadv2 :
11 | 分层的CRUD RESTful API示例 & 单元测试(针对Controller和Service及Mock的使用)
12 | - msadv3 :
13 | 静态资源的导入 & Thymeleaf模板的使用 & Swagger API Doc & 统一异常处理
14 | - msadv4 :
15 | Spring Security基本使用 & JdbcTemplate访问数据库 & Spring-data-jpa访问数据库
16 | - msadv5 :
17 | 多数据源配置(基于JdbcTemplate 与 基于Spring-data-jpa)
18 | - msadv6 :
19 | Redis & MongoDB 集成与基本使用
20 | - msadv7 :
21 | 整合 MyBatis & MyBatis 注解配置的使用
22 | - msadv8 :
23 | Spring Boot中的事务管理 & 使用Flyway管理数据库版本
24 | - msadv9 :
25 | Spring Boot中的缓存注解 & 使用Ehcache作为缓存
26 | - msadv10 :
27 | 集成使用Redis作为缓存
28 | - msadv11 :
29 | 使用log4j记录日志 & 多环境不同日志级别的控制 & 使用AOP统一处理Web请求日志
30 | - msadv12 :
31 | 使用log4j实现http请求日志存入MongoDB & 动态修改日志级别(1.5.x新特性)
32 | - msadv13 :
33 | RabbitMQ的基本集成和使用
34 | - msadv14 :
35 | 使用@Scheduled创建定时任务 & 使用@Async实现异步调用
36 | - msadv15 :
37 | 使用@Async实现异步调用:自定义线程池
38 | - msadv16 :
39 | 使用@Async实现异步调用:ThreadPoolTaskScheduler线程池的优雅关闭
40 | - msadv17 :
41 | 使用@Async实现异步调用:使用Future & 定义超时
42 | - msadv18 :
43 | 实现邮件发送:简单邮件、带附件的邮件、带资源的文件以及基于模板的邮件 & 使用spring boot actuator监控端点
44 | - msadv19 :
45 | 自定义启动Banner & 使用Spring StateMachine框架实现状态机 & 使用exclude排除不必要的自动化配置的加载
46 |
47 | ## 推荐学习资料
48 | > 程序猿DD [SpringBoot基础教程](http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/)
49 | > 纯洁的微笑 [SpringBoot基础教程](http://www.ityouknow.com/spring-boot.html)
50 | > EdisonChou [Spring Boot on Docker](https://www.cnblogs.com/edisonchou/p/springboot_on_docker_foundation.html)
51 |
52 | ## 推荐开发环境
53 |
54 | [](https://www.jetbrains.com/idea/)
55 | > Intellij Idea Community 2018版本
56 | `PS`: 如果是.Net程序猿想要学习SpringBoot,建议更改快捷键与Visual Studio保持一致,这样能加快开发效率
57 |
58 |
--------------------------------------------------------------------------------
/src/msadv1/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv1/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv1/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv1/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv1/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv1
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv1
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.14.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 |
30 | org.springframework.boot
31 | spring-boot-starter
32 |
33 |
34 |
35 | org.springframework.boot
36 | spring-boot-starter-test
37 | test
38 |
39 |
40 |
41 |
42 | org.springframework.boot
43 | spring-boot-starter-web
44 |
45 |
46 |
47 |
48 | org.springframework.boot
49 | spring-boot-devtools
50 | true
51 |
52 |
53 |
54 |
55 |
56 |
57 | org.springframework.boot
58 | spring-boot-maven-plugin
59 |
60 |
61 |
62 |
63 | true
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/src/msadv1/src/main/java/com/manulife/msadv1/Msadv1Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv1;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv1Application {
8 |
9 | // 此示例主要演示以下内容:
10 | // 1.Hello World
11 | // 2.配置文件(application.properties)的使用 及 多环境配置文件的设置
12 | // 3.基本的MVC Controller单元测试 及 针对某个Class的单元测试
13 | // 4.Spring Boot的热部署(修改代码后只需Build一下无须重新Run)
14 | public static void main(String[] args) {
15 |
16 | SpringApplication.run(Msadv1Application.class, args);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/msadv1/src/main/java/com/manulife/msadv1/controller/HelloController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv1.controller;
2 |
3 | import org.springframework.web.bind.annotation.RequestMapping;
4 | import org.springframework.web.bind.annotation.RestController;
5 |
6 | @RestController
7 | public class HelloController {
8 |
9 | @RequestMapping("/hello")
10 | public String index() {
11 |
12 | return "Hello World!";
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv1/src/main/java/com/manulife/msadv1/domain/DemoProperties.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv1.domain;
2 |
3 | import org.springframework.beans.factory.annotation.Value;
4 | import org.springframework.stereotype.Component;
5 |
6 | @Component
7 | public class DemoProperties {
8 | @Value("${com.manulife.msadv1.author}")
9 | private String author;
10 |
11 | @Value("${com.manulife.msadv1.title}")
12 | private String title;
13 |
14 | @Value("${com.manulife.msadv1.desc}")
15 | private String desc;
16 |
17 | public String getDesc() {
18 | return desc;
19 | }
20 |
21 | public void setDesc(String desc) {
22 | this.desc = desc;
23 | }
24 |
25 | public String getAuthor() {
26 | return author;
27 | }
28 |
29 | public void setAuthor(String author) {
30 | this.author = author;
31 | }
32 |
33 | public String getTitle() {
34 | return title;
35 | }
36 |
37 | public void setTitle(String title) {
38 | this.title = title;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/msadv1/src/main/resources/application-test.properties:
--------------------------------------------------------------------------------
1 | server.port=8080
2 |
3 | com.manulife.msadv1.author=Manulife Chengdu
4 | com.manulife.msadv1.title=SpringBoot QuickStart Demo
5 | com.manulife.msadv1.desc=${com.manulife.msadv1.author} is writting ${com.manulife.msadv1.title}
6 |
7 | com.mnaulife.msadv1.randomval=${random.int[10,30]}
--------------------------------------------------------------------------------
/src/msadv1/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.profiles.active=test
--------------------------------------------------------------------------------
/src/msadv1/src/test/java/com/manulife/msadv1/Msadv1ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv1;
2 |
3 | import com.manulife.msadv1.domain.DemoProperties;
4 | import org.junit.Assert;
5 | import org.junit.Test;
6 | import org.junit.runner.RunWith;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.test.context.junit4.SpringRunner;
11 | import org.springframework.test.web.servlet.MockMvc;
12 | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
13 | import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
14 |
15 | @RunWith(SpringRunner.class)
16 | @SpringBootTest
17 | @AutoConfigureMockMvc
18 | public class Msadv1ApplicationTests {
19 | @Autowired
20 | private MockMvc mvc;
21 |
22 | @Test
23 | public void testGetHello() throws Exception {
24 | mvc.perform(MockMvcRequestBuilders.get("/hello"))
25 | .andExpect(MockMvcResultMatchers.status().isOk())
26 | .andExpect(MockMvcResultMatchers.content().string("Hello World!"));
27 | }
28 |
29 | @Autowired
30 | private DemoProperties properties;
31 |
32 | @Test
33 | public void testDemoProperties() throws Exception{
34 | Assert.assertEquals(properties.getAuthor(), "Manulife Chengdu");
35 | Assert.assertEquals(properties.getTitle(), "SpringBoot QuickStart Demo");
36 | Assert.assertEquals(properties.getDesc(), properties.getAuthor() + " is writting " + properties.getTitle());
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/msadv10/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv10/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv10/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv10/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv10/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv10
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv10
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 | org.springframework.boot
41 | spring-boot-starter-web
42 |
43 |
44 |
45 | org.springframework.boot
46 | spring-boot-starter-data-jpa
47 |
48 |
49 |
50 | mysql
51 | mysql-connector-java
52 | 8.0.11
53 |
54 |
55 |
56 | org.springframework.boot
57 | spring-boot-starter-cache
58 |
59 |
60 |
61 | org.springframework.boot
62 | spring-boot-starter-redis
63 | 1.3.5.RELEASE
64 |
65 |
66 |
67 |
68 |
69 |
70 | org.springframework.boot
71 | spring-boot-maven-plugin
72 |
73 |
74 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/src/msadv10/src/main/java/com/manulife/msadv10/Msadv10Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv10;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.cache.annotation.EnableCaching;
6 |
7 | @SpringBootApplication
8 | @EnableCaching
9 | public class Msadv10Application {
10 |
11 | /*
12 | * 此示例主要演示以下内容:
13 | * 1.缓存支持(2):使用Redis做集中式缓存
14 | */
15 | public static void main(String[] args) {
16 | SpringApplication.run(Msadv10Application.class, args);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/msadv10/src/main/java/com/manulife/msadv10/config/RedisConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv10.config;
2 |
3 | import com.fasterxml.jackson.annotation.JsonAutoDetect;
4 | import com.fasterxml.jackson.annotation.PropertyAccessor;
5 | import com.fasterxml.jackson.databind.ObjectMapper;
6 | import org.springframework.cache.CacheManager;
7 | import org.springframework.cache.annotation.CachingConfigurerSupport;
8 | import org.springframework.cache.annotation.EnableCaching;
9 | import org.springframework.cache.interceptor.KeyGenerator;
10 | import org.springframework.context.annotation.Bean;
11 | import org.springframework.context.annotation.Configuration;
12 | import org.springframework.data.redis.cache.RedisCacheManager;
13 | import org.springframework.data.redis.connection.RedisConnectionFactory;
14 | import org.springframework.data.redis.core.RedisTemplate;
15 | import org.springframework.data.redis.core.StringRedisTemplate;
16 | import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
17 |
18 | import java.lang.reflect.Method;
19 |
20 | /**
21 | * Redis 缓存配置类(通用)
22 | *
23 | */
24 | @Configuration
25 | @EnableCaching
26 | public class RedisConfig extends CachingConfigurerSupport {
27 |
28 | /**
29 | * 缓存对象集合中,缓存是以 key-value 形式保存的。当不指定缓存的 key 时,SpringBoot 会使用 SimpleKeyGenerator 生成 key。
30 | * @return
31 | */
32 | @Bean
33 | public KeyGenerator wiselyKeyGenerator() {
34 | return new KeyGenerator() {
35 | @Override
36 | public Object generate(Object target, Method method, Object... params) {
37 | StringBuilder sb = new StringBuilder();
38 | sb.append(target.getClass().getName());
39 | sb.append(method.getName());
40 | for (Object obj : params) {
41 | sb.append(obj.toString());
42 | }
43 | return sb.toString();
44 | }
45 | };
46 |
47 | }
48 |
49 | @Bean
50 | public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
51 | return new RedisCacheManager(redisTemplate);
52 | }
53 |
54 | @Bean
55 | public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
56 | StringRedisTemplate template = new StringRedisTemplate(factory);
57 | @SuppressWarnings({ "rawtypes", "unchecked" })
58 | Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
59 | ObjectMapper om = new ObjectMapper();
60 | om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
61 | om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
62 | jackson2JsonRedisSerializer.setObjectMapper(om);
63 | template.setValueSerializer(jackson2JsonRedisSerializer);
64 | template.afterPropertiesSet();
65 | return template;
66 | }
67 | }
--------------------------------------------------------------------------------
/src/msadv10/src/main/java/com/manulife/msadv10/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv10.domain;
2 |
3 | import javax.persistence.Column;
4 | import javax.persistence.Entity;
5 | import javax.persistence.GeneratedValue;
6 | import javax.persistence.Id;
7 | import java.io.Serializable;
8 |
9 | @Entity
10 | public class User implements Serializable {
11 | @Id
12 | @GeneratedValue
13 | private Long id;
14 |
15 | @Column(nullable = false)
16 | private String name;
17 |
18 | @Column(nullable = false)
19 | private Integer age;
20 |
21 | public Long getId() {
22 | return id;
23 | }
24 |
25 | public void setId(Long id) {
26 | this.id = id;
27 | }
28 |
29 | public String getName() {
30 | return name;
31 | }
32 |
33 | public void setName(String name) {
34 | this.name = name;
35 | }
36 |
37 | public Integer getAge() {
38 | return age;
39 | }
40 |
41 | public void setAge(Integer age) {
42 | this.age = age;
43 | }
44 |
45 | public User() {
46 | }
47 |
48 | public User(String name, Integer age) {
49 | this.name = name;
50 | this.age = age;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/msadv10/src/main/java/com/manulife/msadv10/domain/UserRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv10.domain;
2 |
3 | import org.springframework.cache.annotation.CacheConfig;
4 | import org.springframework.cache.annotation.CachePut;
5 | import org.springframework.cache.annotation.Cacheable;
6 | import org.springframework.data.jpa.repository.JpaRepository;
7 |
8 | @CacheConfig(cacheNames = "users")
9 | public interface UserRepository extends JpaRepository {
10 | @Cacheable(key = "#p0")
11 | User findByName(String name);
12 |
13 | @CachePut(key = "#p0.name")
14 | User save(User user);
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv10/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | show_sql: true
14 | hbm2ddl:
15 | # options: create, create-drop, update, validate
16 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
17 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
18 | auto: update
19 | redis:
20 | host: 10.248.37.3
21 | port: 6379
22 | pool:
23 | max-idle: 8
24 | min-idle: 0
25 | max-active: 8
26 | max-wait: -1
27 |
28 |
--------------------------------------------------------------------------------
/src/msadv10/src/test/java/com/manulife/msadv10/UserRepositoryTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv10;
2 |
3 | import com.manulife.msadv10.domain.User;
4 | import com.manulife.msadv10.domain.UserRepository;
5 | import org.junit.Before;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.cache.CacheManager;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | @RunWith(SpringRunner.class)
14 | @SpringBootTest
15 | public class UserRepositoryTest {
16 | @Autowired
17 | private UserRepository userRepository;
18 |
19 | @Autowired
20 | private CacheManager cacheManager;
21 |
22 | @Before
23 | public void setUp(){
24 | userRepository.deleteAllInBatch();
25 | userRepository.save(new User("AAA", 10));
26 | }
27 |
28 | @Test
29 | public void testFindByName() throws Exception {
30 | User u1 = userRepository.findByName("AAA");
31 | System.out.println("1st Query : " + u1.getAge());
32 |
33 | User u2 = userRepository.findByName("AAA");
34 | System.out.println("2nd Query : " + u2.getAge());
35 |
36 | u1.setAge(20);
37 | userRepository.save(u1);
38 |
39 | User u3 = userRepository.findByName("AAA");
40 | System.out.println("3rd query : " + u3.getAge());
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/msadv11/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv11/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv11/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv11/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv11/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv11
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv11
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 |
30 | org.springframework.boot
31 | spring-boot-starter-web
32 |
33 |
34 |
35 | org.springframework.boot
36 | spring-boot-starter-test
37 | test
38 |
39 |
40 |
41 |
42 | org.springframework.boot
43 | spring-boot-starter
44 |
45 |
46 | org.springframework.boot
47 | spring-boot-starter-logging
48 |
49 |
50 |
51 |
52 |
53 |
54 | org.springframework.boot
55 | spring-boot-starter-log4j
56 | 1.3.8.RELEASE
57 |
58 |
59 |
60 |
61 | org.springframework.boot
62 | spring-boot-starter-aop
63 |
64 |
65 |
66 |
67 |
68 |
69 | org.springframework.boot
70 | spring-boot-maven-plugin
71 |
72 |
73 |
74 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/src/msadv11/src/main/java/com/manulife/msadv11/Msadv11Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv11;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv11Application {
8 |
9 | /*
10 | * 此示例主要演示以下内容:
11 | * 1.使用log4j记录日志
12 | * 2.使用log4j进行多环境(dev,test,prod)不同日志(INFO,DEBUG,ERROR)级别的控制
13 | * 3.使用AOP统一处理Web请求日志
14 | */
15 | public static void main(String[] args) {
16 | SpringApplication.run(Msadv11Application.class, args);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/msadv11/src/main/java/com/manulife/msadv11/aspect/WebLogAspect.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv11.aspect;
2 |
3 | import org.apache.log4j.Logger;
4 | import org.aspectj.lang.JoinPoint;
5 | import org.aspectj.lang.annotation.*;
6 | import org.springframework.stereotype.Component;
7 | import org.springframework.web.context.request.RequestContextHolder;
8 | import org.springframework.web.context.request.ServletRequestAttributes;
9 |
10 | import javax.servlet.http.HttpServletRequest;
11 | import java.util.Arrays;
12 |
13 | @Aspect
14 | @Component
15 | //@Order(5) // => 如果有多个切面,设置Order注解标识切面的优先级
16 | public class WebLogAspect {
17 | private Logger logger = Logger.getLogger(getClass());
18 |
19 | ThreadLocal startTime = new ThreadLocal<>();
20 |
21 | @Pointcut("execution(public * com.manulife.msadv11.web..*.*(..))")
22 | public void webLog() {
23 | }
24 |
25 | @Before("webLog()")
26 | public void doBefore(JoinPoint joinPoint) throws Throwable {
27 | // 0.记录时间
28 | startTime.set(System.currentTimeMillis());
29 |
30 | // 1.接收到请求,记录请求内容
31 | ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
32 | HttpServletRequest request = attributes.getRequest();
33 |
34 | // 2.记录下请求内容
35 | logger.info("URL : " + request.getRequestURL().toString());
36 | logger.info("HTTP_METHOD : " + request.getMethod());
37 | logger.info("IP : " + request.getRemoteAddr());
38 | logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName()
39 | + "." + joinPoint.getSignature().getName());
40 | logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
41 | }
42 |
43 | @AfterReturning(returning = "ret", pointcut = "webLog()")
44 | public void doAfterReturning(Object ret) throws Throwable{
45 | // 1.处理完请求,返回内容
46 | logger.info("RESPONSE : " + ret);
47 |
48 | // 2.记录时间
49 | logger.info("SPEND TIME : " + (System.currentTimeMillis() - startTime.get()) + "ms");
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/msadv11/src/main/java/com/manulife/msadv11/web/HelloController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv11.web;
2 |
3 | import org.springframework.web.bind.annotation.*;
4 |
5 | @RestController
6 | public class HelloController {
7 | @RequestMapping(value = "/hello", method = RequestMethod.GET)
8 | @ResponseBody
9 | public String hello(@RequestParam String name){
10 | return "Hello " + name;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/msadv11/src/main/resources/application-dev.properties:
--------------------------------------------------------------------------------
1 | logging.level.com.manulife=INFO
--------------------------------------------------------------------------------
/src/msadv11/src/main/resources/application-prod.properties:
--------------------------------------------------------------------------------
1 | logging.level.com.manulife=INFO
--------------------------------------------------------------------------------
/src/msadv11/src/main/resources/application-test.properties:
--------------------------------------------------------------------------------
1 | logging.level.com.manulife=DEBUG
--------------------------------------------------------------------------------
/src/msadv11/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.profiles.active=dev
--------------------------------------------------------------------------------
/src/msadv11/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv11/src/main/resources/log4j.properties
--------------------------------------------------------------------------------
/src/msadv11/src/test/java/com/manulife/msadv11/Log4jApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv11;
2 |
3 | import org.apache.log4j.Logger;
4 | import org.junit.Test;
5 | import org.junit.runner.RunWith;
6 | import org.springframework.boot.test.context.SpringBootTest;
7 | import org.springframework.test.context.junit4.SpringRunner;
8 |
9 | @RunWith(SpringRunner.class)
10 | @SpringBootTest
11 | public class Log4jApplicationTests {
12 |
13 | private Logger logger = Logger.getLogger(getClass());
14 |
15 | @Test
16 | public void testLog4jInApp() {
17 | logger.info("输出INFO");
18 | logger.debug("输出DEBUG");
19 | logger.error("输出ERROR");
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/msadv12/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv12/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv12/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv12/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv12/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv12
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv12
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 |
30 | org.springframework.boot
31 | spring-boot-starter-web
32 |
33 |
34 |
35 | org.springframework.boot
36 | spring-boot-starter-test
37 | test
38 |
39 |
40 |
41 |
42 | org.springframework.boot
43 | spring-boot-starter
44 |
45 |
46 | org.springframework.boot
47 | spring-boot-starter-logging
48 |
49 |
50 |
51 |
52 |
53 |
54 | org.springframework.boot
55 | spring-boot-starter-log4j
56 | 1.3.8.RELEASE
57 |
58 |
59 |
60 |
61 | org.springframework.boot
62 | spring-boot-starter-aop
63 |
64 |
65 |
66 |
67 | org.springframework.boot
68 | spring-boot-starter-data-mongodb
69 |
70 |
71 |
72 |
73 | org.springframework.boot
74 | spring-boot-starter-actuator
75 |
76 |
77 |
78 |
79 |
80 |
81 | org.springframework.boot
82 | spring-boot-maven-plugin
83 |
84 |
85 |
86 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/src/msadv12/src/main/java/com/manulife/msadv12/Msadv12Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv12;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 | import org.springframework.boot.SpringApplication;
6 | import org.springframework.boot.autoconfigure.SpringBootApplication;
7 | import org.springframework.web.bind.annotation.RequestMapping;
8 | import org.springframework.web.bind.annotation.RequestMethod;
9 | import org.springframework.web.bind.annotation.RestController;
10 |
11 | @RestController
12 | @SpringBootApplication
13 | public class Msadv12Application {
14 |
15 | private Logger logger = LoggerFactory.getLogger(getClass());
16 |
17 | @RequestMapping(value = "/test", method = RequestMethod.GET)
18 | public String testLogLevel(){
19 | logger.debug("Logger Level : DEBUG");
20 | logger.info("Logger Level : INFO");
21 | logger.error("Logger Level : ERROR");
22 |
23 | return "";
24 | }
25 |
26 | /*
27 | * 此示例主要演示以下内容:
28 | * 1.使用log4j实现http请求日志存入MongoDB
29 | * 2.动态修改日志级别(1.5.x新特性)
30 | * 查询日志级别设置:GET http://localhost:8080/loggers/com.manulife.msadv12
31 | * 更新日志级别设置:POST http://localhost:8080/loggers/com.manulife.msadv12
32 | * POST BODY => { "configuredLevel" : "DEBUG" }
33 | */
34 | public static void main(String[] args) {
35 | SpringApplication.run(Msadv12Application.class, args);
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/msadv12/src/main/java/com/manulife/msadv12/web/HelloController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv12.web;
2 |
3 | import org.springframework.web.bind.annotation.*;
4 |
5 | @RestController
6 | public class HelloController {
7 | @RequestMapping(value = "/hello", method = RequestMethod.GET)
8 | @ResponseBody
9 | public String hello(@RequestParam String name){
10 | return "Hello " + name;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/msadv12/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | management.security.enabled=false
2 |
--------------------------------------------------------------------------------
/src/msadv12/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv12/src/main/resources/log4j.properties
--------------------------------------------------------------------------------
/src/msadv12/src/test/java/com/manulife/msadv11/Log4jApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv11;
2 |
3 | import org.apache.log4j.Logger;
4 | import org.junit.Test;
5 | import org.junit.runner.RunWith;
6 | import org.springframework.boot.test.context.SpringBootTest;
7 | import org.springframework.test.context.junit4.SpringRunner;
8 |
9 | @RunWith(SpringRunner.class)
10 | @SpringBootTest
11 | public class Log4jApplicationTests {
12 |
13 | private Logger logger = Logger.getLogger(getClass());
14 |
15 | @Test
16 | public void testLog4jInApp() {
17 | logger.info("输出INFO");
18 | logger.debug("输出DEBUG");
19 | logger.error("输出ERROR");
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/msadv13/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv13/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv13/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv13/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv13/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv13
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv13
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-amqp
31 |
32 |
33 | org.springframework.boot
34 | spring-boot-starter-web
35 |
36 |
37 |
38 | org.springframework.boot
39 | spring-boot-starter-test
40 | test
41 |
42 |
43 |
44 |
45 |
46 |
47 | org.springframework.boot
48 | spring-boot-maven-plugin
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/src/msadv13/src/main/java/com/manulife/msadv13/Msadv13Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv13;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv13Application {
8 |
9 | /*
10 | * 此示例主要演示以下内容:
11 | * 1.RabbitMQ的基本使用
12 | */
13 | public static void main(String[] args) {
14 | SpringApplication.run(Msadv13Application.class, args);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/msadv13/src/main/java/com/manulife/msadv13/mq/RabbitMqConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv13.mq;
2 |
3 | import org.springframework.amqp.core.Queue;
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 |
7 | @Configuration
8 | public class RabbitMqConfig {
9 | @Bean
10 | public Queue helloQueue(){
11 | return new Queue("hello");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/msadv13/src/main/java/com/manulife/msadv13/mq/Receiver.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv13.mq;
2 |
3 | import org.springframework.amqp.rabbit.annotation.RabbitHandler;
4 | import org.springframework.amqp.rabbit.annotation.RabbitListener;
5 | import org.springframework.stereotype.Component;
6 |
7 | @Component
8 | @RabbitListener(queues = "hello")
9 | public class Receiver {
10 | @RabbitHandler
11 | public void process(String hello){
12 | System.out.println("Receiver : " + hello);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/msadv13/src/main/java/com/manulife/msadv13/mq/Sender.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv13.mq;
2 |
3 | import org.springframework.amqp.core.AmqpTemplate;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.stereotype.Component;
6 |
7 | import java.util.Date;
8 |
9 | @Component
10 | public class Sender {
11 | @Autowired
12 | private AmqpTemplate rabbitTemplate;
13 |
14 | public void send(){
15 | String context = "hello " + new Date();
16 | System.out.println("Sender : " + context);
17 |
18 | this.rabbitTemplate.convertAndSend("hello", context);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/msadv13/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | application:
6 | name: rabbitmq-hello
7 | rabbitmq:
8 | host: 10.248.37.3
9 | port: 5672
10 | virtual-host: MBPSCD
11 | username: admin
12 | password: manulife
13 |
14 |
--------------------------------------------------------------------------------
/src/msadv13/src/test/java/com/manulife/msadv13/RabbitMqTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv13;
2 |
3 | import com.manulife.msadv13.mq.Sender;
4 | import org.junit.Test;
5 | import org.junit.runner.RunWith;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.boot.test.context.SpringBootTest;
8 | import org.springframework.test.context.junit4.SpringRunner;
9 |
10 | @RunWith(SpringRunner.class)
11 | @SpringBootTest
12 | public class RabbitMqTest {
13 | @Autowired
14 | private Sender sender;
15 |
16 | @Test
17 | public void testHello() throws Exception {
18 | sender.send();
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/msadv14/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv14/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv14/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv14/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv14/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv14
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv14
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 |
42 |
43 | org.springframework.boot
44 | spring-boot-maven-plugin
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/src/msadv14/src/main/java/com/manulife/msadv14/Msadv14Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv14;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.scheduling.annotation.EnableAsync;
6 | import org.springframework.scheduling.annotation.EnableScheduling;
7 |
8 | @SpringBootApplication
9 | @EnableScheduling
10 | @EnableAsync // 要使用@Async注解,需使用@EnableAsync来启用Async
11 | public class Msadv14Application {
12 |
13 | /*
14 | * 此示例主要演示以下内容:
15 | * 1.使用@Scheduled创建定时任务
16 | * 2.使用@Async实现异步调用
17 | */
18 | public static void main(String[] args) {
19 |
20 | SpringApplication.run(Msadv14Application.class, args);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/msadv14/src/main/java/com/manulife/msadv14/handler/AsyncTask.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv14.handler;
2 |
3 | import org.springframework.scheduling.annotation.Async;
4 | import org.springframework.scheduling.annotation.AsyncResult;
5 | import org.springframework.stereotype.Component;
6 |
7 | import java.util.Random;
8 | import java.util.concurrent.Future;
9 |
10 | @Component
11 | public class AsyncTask {
12 | public static Random random = new Random();
13 |
14 | @Async
15 | public Future doTaskOne() throws Exception {
16 | System.out.println("开始做任务1");
17 | long start = System.currentTimeMillis();
18 | Thread.sleep(random.nextInt(10000));
19 | long end = System.currentTimeMillis();
20 | System.out.println("完成任务1,耗时:" + (end - start) + "毫秒");
21 | // 异步回调
22 | return new AsyncResult<>("任务1完成");
23 | }
24 |
25 | @Async
26 | public Future doTaskTwo() throws Exception {
27 | System.out.println("开始做任务2");
28 | long start = System.currentTimeMillis();
29 | Thread.sleep(random.nextInt(10000));
30 | long end = System.currentTimeMillis();
31 | System.out.println("完成任务2,耗时:" + (end - start) + "毫秒");
32 | // 异步回调
33 | return new AsyncResult<>("任务2完成");
34 | }
35 |
36 | @Async
37 | public Future doTaskThree() throws Exception {
38 | System.out.println("开始做任务3");
39 | long start = System.currentTimeMillis();
40 | Thread.sleep(random.nextInt(10000));
41 | long end = System.currentTimeMillis();
42 | System.out.println("完成任务3,耗时:" + (end - start) + "毫秒");
43 | // 异步回调
44 | return new AsyncResult<>("任务3完成");
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/msadv14/src/main/java/com/manulife/msadv14/handler/SerialTask.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv14.handler;
2 |
3 | import org.springframework.stereotype.Component;
4 |
5 | import java.util.Random;
6 |
7 | @Component
8 | public class SerialTask {
9 | public static Random random = new Random();
10 |
11 | public void doTaskOne() throws Exception {
12 | System.out.println("开始做任务1");
13 | long start = System.currentTimeMillis();
14 | Thread.sleep(random.nextInt(10000));
15 | long end = System.currentTimeMillis();
16 | System.out.println("完成任务1,耗时:" + (end - start) + "毫秒");
17 | }
18 |
19 | public void doTaskTwo() throws Exception {
20 | System.out.println("开始做任务2");
21 | long start = System.currentTimeMillis();
22 | Thread.sleep(random.nextInt(10000));
23 | long end = System.currentTimeMillis();
24 | System.out.println("完成任务2,耗时:" + (end - start) + "毫秒");
25 | }
26 |
27 | public void doTaskThree() throws Exception {
28 | System.out.println("开始做任务3");
29 | long start = System.currentTimeMillis();
30 | Thread.sleep(random.nextInt(10000));
31 | long end = System.currentTimeMillis();
32 | System.out.println("完成任务3,耗时:" + (end - start) + "毫秒");
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/msadv14/src/main/java/com/manulife/msadv14/job/ScheduledTasks.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv14.job;
2 |
3 | import org.springframework.scheduling.annotation.Scheduled;
4 | import org.springframework.stereotype.Component;
5 |
6 | import java.text.SimpleDateFormat;
7 | import java.util.Date;
8 |
9 | @Component
10 | public class ScheduledTasks {
11 | private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
12 |
13 | @Scheduled(fixedRate = 30000) // 每隔30秒输出当前时间
14 | /*
15 | * @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
16 | * @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
17 | * @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
18 | */
19 | // 当然,还可以通过cron表达式定义规则,如@Scheduled(cron="*/5 * * * * *")
20 | public void reportCurrentTime(){
21 | System.out.println("Current Time : " + dateFormat.format(new Date()));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/msadv14/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | show_sql: true
14 | hbm2ddl:
15 | # options: create, create-drop, update, validate
16 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
17 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
18 | auto: update
19 | redis:
20 | host: 10.248.37.3
21 | port: 6379
22 | pool:
23 | max-idle: 8
24 | min-idle: 0
25 | max-active: 8
26 | max-wait: -1
27 |
28 |
--------------------------------------------------------------------------------
/src/msadv14/src/test/java/com/manulife/msadv14/TaskTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv14;
2 |
3 | import com.manulife.msadv14.handler.AsyncTask;
4 | import com.manulife.msadv14.handler.SerialTask;
5 | import org.junit.Test;
6 | import org.junit.runner.RunWith;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.boot.test.context.SpringBootTest;
9 | import org.springframework.test.context.junit4.SpringRunner;
10 |
11 | import java.util.concurrent.Future;
12 |
13 | @RunWith(SpringRunner.class)
14 | @SpringBootTest
15 | public class TaskTests {
16 |
17 | @Autowired
18 | private SerialTask serialTask;
19 |
20 | @Test
21 | public void testTaskInSerial() throws Exception{
22 | serialTask.doTaskOne();
23 | serialTask.doTaskTwo();
24 | serialTask.doTaskThree();
25 | }
26 |
27 | @Autowired
28 | private AsyncTask asyncTask;
29 |
30 | @Test
31 | public void testTaskInAsync() throws Exception{
32 | long start = System.currentTimeMillis();
33 |
34 | Future task1 = asyncTask.doTaskOne();
35 | Future task2 = asyncTask.doTaskTwo();
36 | Future task3 = asyncTask.doTaskThree();
37 |
38 | while (true){
39 | if (task1.isDone() && task2.isDone() && task3.isDone()){
40 | // 三个任务都完成时推出循环
41 | break;
42 | }
43 |
44 | Thread.sleep(1000);
45 | }
46 |
47 | long end = System.currentTimeMillis();
48 |
49 | System.out.println("任务全部完成,总耗时:" + (end - start) + "ms");
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/msadv15/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv15/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv15/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv15/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv15/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv15
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv15
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | org.projectlombok
42 | lombok
43 | true
44 |
45 |
46 |
47 |
48 |
49 |
50 | org.springframework.boot
51 | spring-boot-maven-plugin
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/src/msadv15/src/main/java/com/manulife/msadv15/Msadv15Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv15;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.context.annotation.Bean;
6 | import org.springframework.context.annotation.Configuration;
7 | import org.springframework.scheduling.annotation.EnableAsync;
8 | import org.springframework.scheduling.annotation.EnableScheduling;
9 | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
10 |
11 | import java.util.concurrent.Executor;
12 | import java.util.concurrent.ThreadPoolExecutor;
13 |
14 | @SpringBootApplication
15 | public class Msadv15Application {
16 |
17 | /*
18 | * 此示例主要演示以下内容:
19 | * 1.使用@Async实现异步调用:自定义线程池
20 | */
21 | public static void main(String[] args) {
22 | SpringApplication.run(Msadv15Application.class, args);
23 | }
24 |
25 | @EnableAsync
26 | @Configuration
27 | class TaskToolConfig{
28 | @Bean("taskExecutor")
29 | public Executor taskExecutor() {
30 | // 创建一个线程池
31 | ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
32 | // 核心线程数10:线程池创建时候初始化的线程数
33 | executor.setCorePoolSize(10);
34 | // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
35 | executor.setMaxPoolSize(20);
36 | // 缓冲队列200:用来缓冲执行任务的队列
37 | executor.setQueueCapacity(200);
38 | // 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
39 | executor.setKeepAliveSeconds(60);
40 | // 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
41 | executor.setThreadNamePrefix("taskExecutor-");
42 | // 线程池对拒绝任务的处理策略:
43 | // 这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,
44 | // 该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;
45 | // 如果执行程序已关闭,则会丢弃该任务
46 | executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
47 |
48 | return executor;
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/msadv15/src/main/java/com/manulife/msadv15/handler/AsyncTask.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv15.handler;
2 |
3 | import org.springframework.scheduling.annotation.Async;
4 | import org.springframework.scheduling.annotation.AsyncResult;
5 | import org.springframework.stereotype.Component;
6 |
7 | import java.util.Random;
8 | import java.util.concurrent.Future;
9 |
10 | @Component
11 | public class AsyncTask {
12 | public static Random random = new Random();
13 |
14 | @Async
15 | public Future doTaskOne() throws Exception {
16 | System.out.println("开始做任务1");
17 | long start = System.currentTimeMillis();
18 | Thread.sleep(random.nextInt(10000));
19 | long end = System.currentTimeMillis();
20 | System.out.println("完成任务1,耗时:" + (end - start) + "毫秒");
21 | // 异步回调
22 | return new AsyncResult<>("任务1完成");
23 | }
24 |
25 | @Async
26 | public Future doTaskTwo() throws Exception {
27 | System.out.println("开始做任务2");
28 | long start = System.currentTimeMillis();
29 | Thread.sleep(random.nextInt(10000));
30 | long end = System.currentTimeMillis();
31 | System.out.println("完成任务2,耗时:" + (end - start) + "毫秒");
32 | // 异步回调
33 | return new AsyncResult<>("任务2完成");
34 | }
35 |
36 | @Async
37 | public Future doTaskThree() throws Exception {
38 | System.out.println("开始做任务3");
39 | long start = System.currentTimeMillis();
40 | Thread.sleep(random.nextInt(10000));
41 | long end = System.currentTimeMillis();
42 | System.out.println("完成任务3,耗时:" + (end - start) + "毫秒");
43 | // 异步回调
44 | return new AsyncResult<>("任务3完成");
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/msadv15/src/main/java/com/manulife/msadv15/handler/SerialTask.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv15.handler;
2 |
3 | import org.springframework.stereotype.Component;
4 |
5 | import java.util.Random;
6 |
7 | @Component
8 | public class SerialTask {
9 | public static Random random = new Random();
10 |
11 | public void doTaskOne() throws Exception {
12 | System.out.println("开始做任务1");
13 | long start = System.currentTimeMillis();
14 | Thread.sleep(random.nextInt(10000));
15 | long end = System.currentTimeMillis();
16 | System.out.println("完成任务1,耗时:" + (end - start) + "毫秒");
17 | }
18 |
19 | public void doTaskTwo() throws Exception {
20 | System.out.println("开始做任务2");
21 | long start = System.currentTimeMillis();
22 | Thread.sleep(random.nextInt(10000));
23 | long end = System.currentTimeMillis();
24 | System.out.println("完成任务2,耗时:" + (end - start) + "毫秒");
25 | }
26 |
27 | public void doTaskThree() throws Exception {
28 | System.out.println("开始做任务3");
29 | long start = System.currentTimeMillis();
30 | Thread.sleep(random.nextInt(10000));
31 | long end = System.currentTimeMillis();
32 | System.out.println("完成任务3,耗时:" + (end - start) + "毫秒");
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/msadv15/src/main/java/com/manulife/msadv15/handler/ThreadPoolTask.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv15.handler;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 | import org.slf4j.Logger;
5 | import org.slf4j.LoggerFactory;
6 | import org.springframework.scheduling.annotation.Async;
7 | import org.springframework.stereotype.Component;
8 |
9 | import java.util.Random;
10 |
11 | @Slf4j
12 | @Component
13 | public class ThreadPoolTask {
14 |
15 | public static Random random = new Random();
16 |
17 | private final Logger logger = LoggerFactory.getLogger(this.getClass());
18 |
19 | /*
20 | * 我们只需要在@Async注解中 指定线程池名 即可
21 | */
22 | @Async("taskExecutor")
23 | public void doTaskOne() throws Exception {
24 | //System.out.println("开始做任务1");
25 | logger.info("开始做任务1");
26 | long start = System.currentTimeMillis();
27 | Thread.sleep(random.nextInt(10000));
28 | long end = System.currentTimeMillis();
29 | //System.out.println("完成任务1,耗时:" + (end - start) + "毫秒");
30 | logger.info("完成任务1,耗时:" + (end - start) + "毫秒");
31 | }
32 |
33 | @Async("taskExecutor")
34 | public void doTaskTwo() throws Exception {
35 | //System.out.println("开始做任务2");
36 | logger.info("开始做任务2");
37 | long start = System.currentTimeMillis();
38 | Thread.sleep(random.nextInt(10000));
39 | long end = System.currentTimeMillis();
40 | //System.out.println("完成任务2,耗时:" + (end - start) + "毫秒");
41 | logger.info("完成任务2,耗时:" + (end - start) + "毫秒");
42 | }
43 |
44 | @Async("taskExecutor")
45 | public void doTaskThree() throws Exception {
46 | //System.out.println("开始做任务3");
47 | logger.info("开始做任务3");
48 | long start = System.currentTimeMillis();
49 | Thread.sleep(random.nextInt(10000));
50 | long end = System.currentTimeMillis();
51 | //System.out.println("完成任务3,耗时:" + (end - start) + "毫秒");
52 | logger.info("完成任务3,耗时:" + (end - start) + "毫秒");
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/msadv15/src/main/java/com/manulife/msadv15/job/ScheduledTasks.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv15.job;
2 |
3 | import org.springframework.scheduling.annotation.Scheduled;
4 | import org.springframework.stereotype.Component;
5 |
6 | import java.text.SimpleDateFormat;
7 | import java.util.Date;
8 |
9 | @Component
10 | public class ScheduledTasks {
11 | private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
12 |
13 | @Scheduled(fixedRate = 30000) // 每隔30秒输出当前时间
14 | /*
15 | * @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
16 | * @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
17 | * @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
18 | */
19 | // 当然,还可以通过cron表达式定义规则,如@Scheduled(cron="*/5 * * * * *")
20 | public void reportCurrentTime(){
21 | System.out.println("Current Time : " + dateFormat.format(new Date()));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/msadv15/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | show_sql: true
14 | hbm2ddl:
15 | # options: create, create-drop, update, validate
16 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
17 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
18 | auto: update
19 | redis:
20 | host: 10.248.37.3
21 | port: 6379
22 | pool:
23 | max-idle: 8
24 | min-idle: 0
25 | max-active: 8
26 | max-wait: -1
27 |
28 | logging:
29 | level:
30 | root: info
31 |
32 |
--------------------------------------------------------------------------------
/src/msadv15/src/test/java/com/manulife/msadv15/TaskTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv15;
2 |
3 | import com.manulife.msadv15.handler.ThreadPoolTask;
4 | import org.junit.Test;
5 | import org.junit.runner.RunWith;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.boot.test.context.SpringBootTest;
8 | import org.springframework.test.context.junit4.SpringRunner;
9 |
10 | @RunWith(SpringRunner.class)
11 | @SpringBootTest
12 | public class TaskTests {
13 |
14 | @Autowired
15 | private ThreadPoolTask task;
16 |
17 | @Test
18 | public void testThreadPoolTask() throws Exception {
19 | task.doTaskOne();
20 | task.doTaskTwo();
21 | task.doTaskThree();
22 |
23 | Thread.currentThread().join();
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/msadv16/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv16/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv16/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv16/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv16/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv16
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv16
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | org.projectlombok
42 | lombok
43 | true
44 |
45 |
46 |
47 |
48 | org.springframework.boot
49 | spring-boot-starter-data-redis
50 |
51 |
52 |
53 |
54 |
55 |
56 | org.springframework.boot
57 | spring-boot-maven-plugin
58 |
59 |
60 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/src/msadv16/src/main/java/com/manulife/msadv16/Msadv16Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv16;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.context.annotation.Bean;
6 | import org.springframework.context.annotation.Configuration;
7 | import org.springframework.scheduling.annotation.EnableAsync;
8 | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
9 |
10 | import java.util.concurrent.Executor;
11 | import java.util.concurrent.ThreadPoolExecutor;
12 |
13 | @SpringBootApplication
14 | public class Msadv16Application {
15 |
16 | /*
17 | * 此示例主要演示以下内容:
18 | * 1.使用@Async实现异步调用:ThreadPoolTaskScheduler线程池的优雅关闭
19 | */
20 | public static void main(String[] args) {
21 | SpringApplication.run(Msadv16Application.class, args);
22 | }
23 |
24 | @EnableAsync
25 | @Configuration
26 | class TaskToolConfig{
27 | @Bean("taskExecutor")
28 | public Executor taskExecutor() {
29 | // 创建一个线程池
30 | ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
31 | // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
32 | executor.setMaxPoolSize(20);
33 | // 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
34 | executor.setThreadNamePrefix("taskExecutor-");
35 |
36 | // ↓↓↓↓ 下面两个设置如果不添加,测试会不通过!
37 | // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
38 | // 这样这些异步任务的销毁就会先于Redis线程池的销毁
39 | executor.setWaitForTasksToCompleteOnShutdown(true);
40 | // 设置线程池中任务的等待时间
41 | // 如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
42 | executor.setAwaitTerminationSeconds(60);
43 |
44 | return executor;
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/msadv16/src/main/java/com/manulife/msadv16/handler/Task.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv16.handler;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 | import org.slf4j.Logger;
5 | import org.slf4j.LoggerFactory;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.data.redis.core.StringRedisTemplate;
8 | import org.springframework.scheduling.annotation.Async;
9 | import org.springframework.stereotype.Component;
10 |
11 | @Slf4j
12 | @Component
13 | public class Task {
14 |
15 | private final Logger logger = LoggerFactory.getLogger(this.getClass());
16 |
17 | @Autowired
18 | private StringRedisTemplate stringRedisTemplate;
19 |
20 | /*
21 | * 我们只需要在@Async注解中 指定线程池名 即可
22 | */
23 | @Async("taskExecutor")
24 | public void doTaskOne() throws Exception {
25 | //System.out.println("开始做任务1");
26 | logger.info("开始做任务1");
27 | long start = System.currentTimeMillis();
28 | logger.info(stringRedisTemplate.randomKey());
29 | long end = System.currentTimeMillis();
30 | //System.out.println("完成任务1,耗时:" + (end - start) + "毫秒");
31 | logger.info("完成任务1,耗时:" + (end - start) + "毫秒");
32 | }
33 |
34 | @Async("taskExecutor")
35 | public void doTaskTwo() throws Exception {
36 | //System.out.println("开始做任务2");
37 | logger.info("开始做任务2");
38 | long start = System.currentTimeMillis();
39 | logger.info(stringRedisTemplate.randomKey());
40 | long end = System.currentTimeMillis();
41 | //System.out.println("完成任务2,耗时:" + (end - start) + "毫秒");
42 | logger.info("完成任务2,耗时:" + (end - start) + "毫秒");
43 | }
44 |
45 | @Async("taskExecutor")
46 | public void doTaskThree() throws Exception {
47 | //System.out.println("开始做任务3");
48 | logger.info("开始做任务3");
49 | long start = System.currentTimeMillis();
50 | logger.info(stringRedisTemplate.randomKey());
51 | long end = System.currentTimeMillis();
52 | //System.out.println("完成任务3,耗时:" + (end - start) + "毫秒");
53 | logger.info("完成任务3,耗时:" + (end - start) + "毫秒");
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/msadv16/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | show_sql: true
14 | hbm2ddl:
15 | # options: create, create-drop, update, validate
16 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
17 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
18 | auto: update
19 | redis:
20 | host: 10.248.37.3
21 | port: 6379
22 | pool:
23 | max-idle: 8
24 | min-idle: 0
25 | max-active: 8
26 | max-wait: -1
27 |
28 | logging:
29 | level:
30 | root: info
31 |
32 |
--------------------------------------------------------------------------------
/src/msadv16/src/test/java/com/manulife/msadv16/TaskTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv16;
2 |
3 | import com.manulife.msadv16.handler.Task;
4 | import lombok.SneakyThrows;
5 | import org.junit.Test;
6 | import org.junit.runner.RunWith;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.boot.test.context.SpringBootTest;
9 | import org.springframework.test.context.junit4.SpringRunner;
10 |
11 | @RunWith(SpringRunner.class)
12 | @SpringBootTest
13 | public class TaskTests {
14 | @Autowired
15 | private Task task;
16 |
17 | private static final int MAX_TIMES = 10000;
18 |
19 | @Test
20 | @SneakyThrows
21 | public void testTask() throws Exception {
22 | for (int i = 0; i < MAX_TIMES; i++) {
23 | task.doTaskOne();
24 | task.doTaskTwo();
25 | task.doTaskThree();
26 |
27 | if (i == MAX_TIMES - 1){
28 | System.exit(0);
29 | }
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/msadv17/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv17/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv17/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv17/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv17/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv17
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv17
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | org.projectlombok
42 | lombok
43 | true
44 |
45 |
46 |
47 |
48 |
49 |
50 | org.springframework.boot
51 | spring-boot-maven-plugin
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/src/msadv17/src/main/java/com/manulife/msadv17/Msadv17Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv17;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.context.annotation.Bean;
6 | import org.springframework.context.annotation.Configuration;
7 | import org.springframework.scheduling.annotation.EnableAsync;
8 | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
9 |
10 | import java.util.concurrent.Executor;
11 | import java.util.concurrent.ThreadPoolExecutor;
12 |
13 | @SpringBootApplication
14 | public class Msadv17Application {
15 |
16 | /*
17 | * 此示例主要演示以下内容:
18 | * 1.使用@Async实现异步调用:使用Future及定义超时
19 | */
20 | public static void main(String[] args) {
21 | SpringApplication.run(Msadv17Application.class, args);
22 | }
23 |
24 | @EnableAsync
25 | @Configuration
26 | class TaskToolConfig{
27 | @Bean("taskExecutor")
28 | public Executor taskExecutor() {
29 | // 创建一个线程池
30 | ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
31 | // 核心线程数10:线程池创建时候初始化的线程数
32 | executor.setCorePoolSize(10);
33 | // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
34 | executor.setMaxPoolSize(20);
35 | // 缓冲队列200:用来缓冲执行任务的队列
36 | executor.setQueueCapacity(200);
37 | // 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
38 | executor.setKeepAliveSeconds(60);
39 | // 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
40 | executor.setThreadNamePrefix("taskExecutor-");
41 | // 线程池对拒绝任务的处理策略:
42 | // 这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,
43 | // 该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;
44 | // 如果执行程序已关闭,则会丢弃该任务
45 | executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
46 |
47 | return executor;
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/msadv17/src/main/java/com/manulife/msadv17/handler/Task.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv17.handler;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 | import org.slf4j.Logger;
5 | import org.slf4j.LoggerFactory;
6 | import org.springframework.scheduling.annotation.Async;
7 | import org.springframework.scheduling.annotation.AsyncResult;
8 | import org.springframework.stereotype.Component;
9 |
10 | import java.util.Random;
11 | import java.util.concurrent.Future;
12 |
13 | @Slf4j
14 | @Component
15 | public class Task {
16 |
17 | public static Random random = new Random();
18 | private final Logger logger = LoggerFactory.getLogger(this.getClass());
19 |
20 | @Async("taskExecutor")
21 | /*
22 | * Future是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果的接口。
23 | * 必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
24 | * Future提供了三种功能:
25 | * 1.判断任务是否完成;
26 | * 2.能够中断任务;
27 | * 3.能够获取任务执行结果。
28 | */
29 | public Future run() throws Exception {
30 | long sleep = random.nextInt(10000);
31 | logger.info("任务开始,需要耗时:" + sleep + "ms");
32 | Thread.sleep(sleep);
33 | logger.info("完成任务");
34 |
35 | return new AsyncResult<>("test");
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/msadv17/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | show_sql: true
14 | hbm2ddl:
15 | # options: create, create-drop, update, validate
16 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
17 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
18 | auto: update
19 | redis:
20 | host: 10.248.37.3
21 | port: 6379
22 | pool:
23 | max-idle: 8
24 | min-idle: 0
25 | max-active: 8
26 | max-wait: -1
27 |
28 | logging:
29 | level:
30 | root: info
31 |
32 |
--------------------------------------------------------------------------------
/src/msadv17/src/test/java/com/manulife/msadv17/TaskTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv17;
2 |
3 | import com.manulife.msadv17.handler.Task;
4 | import lombok.extern.slf4j.Slf4j;
5 | import org.junit.Test;
6 | import org.junit.runner.RunWith;
7 | import org.slf4j.Logger;
8 | import org.slf4j.LoggerFactory;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.boot.test.context.SpringBootTest;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | import java.util.concurrent.Future;
14 | import java.util.concurrent.TimeUnit;
15 |
16 | @RunWith(SpringRunner.class)
17 | @SpringBootTest
18 | @Slf4j
19 | public class TaskTests {
20 | @Autowired
21 | private Task task;
22 |
23 | private final Logger logger = LoggerFactory.getLogger(this.getClass());
24 |
25 | @Test
26 | public void testTask() throws Exception {
27 | Future futureTask = task.run();
28 | // 下面还定义了超时时间为5s,如果超时则会抛出超时异常,
29 | // 从而执行线程就能因为超时而释放线程池,不至于一直阻塞而占用资源
30 | String result = futureTask.get(5, TimeUnit.SECONDS);
31 |
32 | logger.info(result);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/msadv18/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv18/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv18/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv18/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv18/MSL_LOGO.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv18/MSL_LOGO.jpg
--------------------------------------------------------------------------------
/src/msadv18/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv18
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv18
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 |
30 | org.springframework.boot
31 | spring-boot-starter-web
32 |
33 |
34 |
35 | org.springframework.boot
36 | spring-boot-starter-test
37 | test
38 |
39 |
40 |
41 | org.springframework.boot
42 | spring-boot-starter-mail
43 |
44 |
45 |
46 | org.springframework.boot
47 | spring-boot-starter-thymeleaf
48 |
49 |
50 |
51 | org.springframework.boot
52 | spring-boot-starter-actuator
53 |
54 |
55 |
56 |
57 |
58 |
59 | org.springframework.boot
60 | spring-boot-maven-plugin
61 |
62 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/src/msadv18/src/main/java/com/manulife/msadv18/Msadv18Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv18;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv18Application {
8 |
9 | /*
10 | * 该示例主要演示以下内容:
11 | * 1 使用JavaMailSender实现邮件发送,包括:
12 | * 1.1 简单文本邮件
13 | * 1.2 带附件的邮件
14 | * 1.3 带嵌入资源的邮件
15 | * 1.4 基于Thymeleaf模板的邮件
16 | * 2 使用Spring Boot Actuator监控端点
17 | */
18 | public static void main(String[] args) {
19 | SpringApplication.run(Msadv18Application.class, args);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/msadv18/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | banner:
3 | charset: UTF-8
4 | mail:
5 | host: smtp.qq.com
6 | port: 587
7 | username: edisonchou7@qq.com
8 | password: fzwmuzrpseyqbjce
9 | properties:
10 | mail:
11 | smtp:
12 | auth: true
13 | starttls:
14 | enable: true
15 | required: true
16 |
17 | mail:
18 | from:
19 | account: edisonchou7@qq.com
20 | to:
21 | account: edisonchou@hotmail.com
22 |
23 | info:
24 | app:
25 | name: edisonchou-spring-boot-demo
26 | version: v1.0.0
27 |
28 | endpoints:
29 | shutdown:
30 | enabled: true
--------------------------------------------------------------------------------
/src/msadv18/src/main/resources/templates/template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 | 您好,这是验证邮件,请点击下面的链接完成验证,
9 | 激活账号
10 |
11 |
--------------------------------------------------------------------------------
/src/msadv19/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv19/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv19/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv19/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv19/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv19
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv19
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | org.springframework.statemachine
42 | spring-statemachine-core
43 | 1.2.0.RELEASE
44 |
45 |
46 |
47 |
48 |
49 |
50 | org.springframework.boot
51 | spring-boot-maven-plugin
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/src/msadv19/src/main/java/com/manulife/msadv19/Msadv19Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv19;
2 |
3 | import com.manulife.msadv19.domain.Events;
4 | import com.manulife.msadv19.domain.States;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.boot.CommandLineRunner;
7 | import org.springframework.boot.SpringApplication;
8 | import org.springframework.boot.autoconfigure.SpringBootApplication;
9 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
10 | import org.springframework.statemachine.StateMachine;
11 |
12 | @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
13 | public class Msadv19Application implements CommandLineRunner {
14 |
15 | /*
16 | * 此示例主要演示以下内容:
17 | * 1.自定义Banner(关注resources目录下的txt文件)
18 | * 2.使用Spring StateMachine框架实现状态机
19 | * 3.使用exclude排除不必要的自动化配置的加载(关注SpringBootApplication注解)
20 | */
21 | public static void main(String[] args) {
22 |
23 | SpringApplication.run(Msadv19Application.class, args);
24 | }
25 |
26 | @Autowired
27 | private StateMachine stateMachine;
28 |
29 | @Override
30 | public void run(String... args) throws Exception{
31 | stateMachine.start(); // 创建这个订单流程,初始状态UNPAID
32 | stateMachine.sendEvent(Events.PAY); // 执行支付操作事件
33 | stateMachine.sendEvent(Events.RECEIVE); // 执行收货操作事件
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/msadv19/src/main/java/com/manulife/msadv19/domain/EventConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv19.domain;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 | import org.springframework.statemachine.annotation.OnTransition;
6 | import org.springframework.statemachine.annotation.OnTransitionEnd;
7 | import org.springframework.statemachine.annotation.OnTransitionStart;
8 | import org.springframework.statemachine.annotation.WithStateMachine;
9 |
10 | /*
11 | * 下面通过注解的方式配置,省去了原来事件监听器中各种if的判断,使得代码显得更为简洁,拥有了更好的可读性。
12 | */
13 | @WithStateMachine
14 | public class EventConfig {
15 |
16 | private Logger logger = LoggerFactory.getLogger(getClass());
17 |
18 | @OnTransition(target = "UNPAID")
19 | public void create(){
20 | logger.info("订单创建,待支付");
21 | }
22 |
23 | @OnTransition(source = "UNPAID", target = "WAITTING_FOR_RECEIVE")
24 | public void pay(){
25 | logger.info("用户完成支付,待收货");
26 | }
27 |
28 | @OnTransitionStart(source = "UNPAID", target = "WAITING_FOR_RECEIVE")
29 | public void payStart() {
30 | logger.info("用户完成支付,待收货: start");
31 | }
32 |
33 | @OnTransitionEnd(source = "UNPAID", target = "WAITING_FOR_RECEIVE")
34 | public void payEnd() {
35 | logger.info("用户完成支付,待收货: end");
36 | }
37 |
38 | @OnTransition(source = "WAITTING_FOR_RECEIVE", target = "DONE")
39 | public void receive(){
40 | logger.info("用户已收货,订单完成");
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/msadv19/src/main/java/com/manulife/msadv19/domain/Events.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv19.domain;
2 |
3 | public enum Events {
4 | PAY, // 支付
5 | RECEIVE // 收货
6 | }
7 |
--------------------------------------------------------------------------------
/src/msadv19/src/main/java/com/manulife/msadv19/domain/States.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv19.domain;
2 |
3 | public enum States {
4 | UNPAID, // 待支付
5 | WAITING_FOR_RECEIVE, // 待收货
6 | DONE // 结束
7 | }
8 |
--------------------------------------------------------------------------------
/src/msadv19/src/main/resources/application.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv19/src/main/resources/application.properties
--------------------------------------------------------------------------------
/src/msadv19/src/main/resources/banner.txt:
--------------------------------------------------------------------------------
1 | ${AnsiColor.BRIGHT_YELLOW}
2 |
3 | ////////////////////////////////////////////////////////////////////
4 | // _ooOoo_ //
5 | // o8888888o //
6 | // 88" . "88 //
7 | // (| ^_^ |) //
8 | // O\ = /O //
9 | // ____/`---'\____ //
10 | // .' \\| |// `. //
11 | // / \\||| : |||// \ //
12 | // / _||||| -:- |||||- \ //
13 | // | | \\\ - /// | | //
14 | // | \_| ''\---/'' | | //
15 | // \ .-\__ `-` ___/-. / //
16 | // ___`. .' /--.--\ `. . ___ //
17 | // ."" '< `.___\_<|>_/___.' >'"". //
18 | // | | : `- \`.;`\ _ /`;.`/ - ` : | | //
19 | // \ \ `-. \_ __\ /__ _/ .-` / / //
20 | // ========`-.____`-.___\_____/___.-`____.-'======== //
21 | // `=---=' //
22 | // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
23 | // 佛祖保佑 永不宕机 永无BUG //
24 | ////////////////////////////////////////////////////////////////////
25 |
26 | ${AnsiColor.BRIGHT_RED}
27 | Application Version: ${application.version}${application.formatted-version}
28 | Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
--------------------------------------------------------------------------------
/src/msadv19/src/test/java/com/manulife/msadv19/Msadv19ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv19;
2 |
3 | import org.junit.Test;
4 | import org.junit.runner.RunWith;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.junit4.SpringRunner;
7 |
8 | @RunWith(SpringRunner.class)
9 | @SpringBootTest
10 | public class Msadv19ApplicationTests {
11 |
12 | @Test
13 | public void contextLoads() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/msadv2/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv2/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv2/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv2/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv2/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv2
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv2
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.14.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 |
30 | org.springframework.boot
31 | spring-boot-starter
32 |
33 |
34 |
35 | org.springframework.boot
36 | spring-boot-starter-test
37 | test
38 |
39 |
40 |
41 |
42 | org.springframework.boot
43 | spring-boot-starter-web
44 |
45 |
46 |
47 |
48 |
49 |
50 | org.springframework.boot
51 | spring-boot-maven-plugin
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/Msadv2Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv2Application {
8 |
9 | /// 此示例主要演示以下内容:
10 | /// 1.一个分层的CRUD实例(Controller=>Service=>Repository)
11 | /// 2.针对RESTful接口的单元测试
12 | /// 3.针对Service接口的单元测试
13 | /// 4.使用Mock框架的单元测试
14 | public static void main(String[] args) {
15 | // spring boot 启动核心入口
16 | SpringApplication.run(Msadv2Application.class, args);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/controller/UserController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.controller;
2 |
3 | import com.manulife.msadv2.domain.User;
4 | import com.manulife.msadv2.service.UserService;
5 | import com.manulife.msadv2.util.StatusResponse;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 | import org.springframework.web.bind.annotation.*;
8 |
9 | import java.util.List;
10 |
11 | @RestController
12 | @RequestMapping(value = "/users")
13 | public class UserController {
14 | @Autowired
15 | UserService service;
16 |
17 | @RequestMapping(value = "/", method = RequestMethod.GET)
18 | public List getUserList(){
19 | return service.getUserList();
20 | }
21 |
22 | @RequestMapping(value = "/", method = RequestMethod.POST)
23 | public String postUser(@ModelAttribute User user){
24 | boolean result = service.addNewUser(user);
25 |
26 | return result == true ?
27 | StatusResponse.SUCCESS.getDescription()
28 | : StatusResponse.FAILED.getDescription();
29 | }
30 |
31 | @RequestMapping(value = "/{id}", method = RequestMethod.GET)
32 | public User getUser(@PathVariable Long id){
33 | return service.findUserById(id);
34 | }
35 |
36 | @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
37 | public String putUser(@PathVariable Long id, @ModelAttribute User user){
38 | boolean result = service.updateUserById(id, user);
39 |
40 | return result == true ?
41 | StatusResponse.SUCCESS.getDescription()
42 | : StatusResponse.FAILED.getDescription();
43 | }
44 |
45 | @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
46 | public String deleteUser(@PathVariable Long id, @ModelAttribute User user){
47 | boolean result = service.deleteUserById(id);
48 |
49 | return result == true ?
50 | StatusResponse.SUCCESS.getDescription()
51 | : StatusResponse.FAILED.getDescription();
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/domain/Person.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.domain;
2 |
3 | public class Person {
4 | private int id;
5 | private String name;
6 |
7 | public Person(int id, String name){
8 | this.id = id;
9 | this.name = name;
10 | }
11 |
12 | public int getId() {
13 | return id;
14 | }
15 |
16 | public void setId(int id) {
17 | this.id = id;
18 | }
19 |
20 | public String getName() {
21 | return name;
22 | }
23 |
24 | public void setName(String name) {
25 | this.name = name;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/domain/PersonRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.domain;
2 |
3 | public interface PersonRepository {
4 | Person getPersonById(int id);
5 | boolean updatePerson(Person person);
6 | }
7 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.domain;
2 |
3 | public class User {
4 | private Long id;
5 | private String name;
6 | private Integer age;
7 |
8 | public Long getId() {
9 | return id;
10 | }
11 |
12 | public void setId(Long id) {
13 | this.id = id;
14 | }
15 |
16 | public String getName() {
17 | return name;
18 | }
19 |
20 | public void setName(String name) {
21 | this.name = name;
22 | }
23 |
24 | public Integer getAge() {
25 | return age;
26 | }
27 |
28 | public void setAge(Integer age) {
29 | this.age = age;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/domain/UserRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.domain;
2 |
3 | import java.util.List;
4 |
5 | public interface UserRepository {
6 | List getUserList();
7 | Boolean addNewUser(User user);
8 | User findUserById(Long id);
9 | Boolean updateUserById(Long id, User user);
10 | Boolean deleteUserById(Long id);
11 | }
12 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/domain/UserRepositoryImpl.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.domain;
2 |
3 | import org.springframework.stereotype.Repository;
4 |
5 | import java.util.*;
6 |
7 | @Repository
8 | public class UserRepositoryImpl implements UserRepository {
9 | // thread-safe Map
10 | static Map users = Collections.synchronizedMap(new HashMap());
11 |
12 | @Override
13 | public List getUserList() {
14 | List userList = new ArrayList(users.values());
15 |
16 | return userList;
17 | }
18 |
19 | @Override
20 | public Boolean addNewUser(User user) {
21 | users.put(user.getId(), user);
22 |
23 | return true;
24 | }
25 |
26 | @Override
27 | public User findUserById(Long id) {
28 | return users.get(id);
29 | }
30 |
31 | @Override
32 | public Boolean updateUserById(Long id, User user) {
33 | User model = users.get(id);
34 |
35 | if (model == null){
36 | return false;
37 | }
38 |
39 | model.setName(user.getName());
40 | model.setAge(user.getAge());
41 |
42 | users.put(id, model);
43 |
44 | return true;
45 | }
46 |
47 | public Boolean deleteUserById(Long id){
48 | users.remove(id);
49 |
50 | return true;
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/service/PersonService.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.service;
2 |
3 | import com.manulife.msadv2.domain.Person;
4 | import com.manulife.msadv2.domain.PersonRepository;
5 |
6 | public class PersonService {
7 | private final PersonRepository personRepository;
8 |
9 | public PersonService(PersonRepository personRepository){
10 | this.personRepository = personRepository;
11 | }
12 |
13 | public Person getPerson(int id){
14 | return personRepository.getPersonById(id);
15 | }
16 |
17 | public boolean updatePerson(int id, String name){
18 | Person person = personRepository.getPersonById(id);
19 | if (person == null){
20 | return false;
21 | }
22 |
23 | person.setName(name);
24 |
25 | return personRepository.updatePerson(person);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/service/UserService.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.service;
2 |
3 | import com.manulife.msadv2.domain.User;
4 |
5 | import java.util.List;
6 |
7 | public interface UserService {
8 | List getUserList();
9 | Boolean addNewUser(User user);
10 | User findUserById(Long id);
11 | Boolean updateUserById(Long id, User user);
12 | Boolean deleteUserById(Long id);
13 | }
14 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/service/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.service;
2 |
3 | import com.manulife.msadv2.domain.User;
4 | import com.manulife.msadv2.domain.UserRepository;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.stereotype.Service;
7 |
8 | import java.util.List;
9 |
10 | @Service
11 | public class UserServiceImpl implements UserService {
12 | @Autowired
13 | UserRepository repository;
14 |
15 | @Override
16 | public List getUserList() {
17 | return repository.getUserList();
18 | }
19 |
20 | @Override
21 | public Boolean addNewUser(User user) {
22 | return repository.addNewUser(user);
23 | }
24 |
25 | @Override
26 | public User findUserById(Long id) {
27 | return repository.findUserById(id);
28 | }
29 |
30 | @Override
31 | public Boolean updateUserById(Long id, User user) {
32 | return repository.updateUserById(id, user);
33 | }
34 |
35 | @Override
36 | public Boolean deleteUserById(Long id) {
37 | return repository.deleteUserById(id);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/java/com/manulife/msadv2/util/StatusResponse.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2.util;
2 |
3 | public enum StatusResponse {
4 | SUCCESS("Success"), FAILED("Failed");
5 |
6 | private String description;
7 |
8 | private StatusResponse(String description){
9 | this.description = description;
10 | }
11 |
12 | public String getDescription(){
13 | return description;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv2/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | server.port=8080
--------------------------------------------------------------------------------
/src/msadv2/src/test/java/com/manulife/msadv2/PersonServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2;
2 |
3 | import com.manulife.msadv2.domain.Person;
4 | import com.manulife.msadv2.domain.PersonRepository;
5 | import com.manulife.msadv2.service.PersonService;
6 | import org.junit.Assert;
7 | import org.junit.Before;
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 | import org.mockito.InjectMocks;
11 | import org.mockito.Mock;
12 | import org.mockito.Mockito;
13 | import org.springframework.boot.test.context.SpringBootTest;
14 | import org.springframework.test.context.junit4.SpringRunner;
15 |
16 | @RunWith(SpringRunner.class)
17 | @SpringBootTest
18 | public class PersonServiceTest {
19 | @Mock
20 | private PersonRepository mockRepository;
21 |
22 | @InjectMocks
23 | private PersonService service;
24 |
25 | @Before
26 | public void setUp() throws Exception {
27 | Mockito.when(mockRepository.getPersonById(1)).thenReturn(new Person(1, "TestPerson"));
28 | Mockito.when(mockRepository.updatePerson(Mockito.isA(Person.class))).thenReturn(true);
29 | }
30 |
31 | @Test
32 | public void testGetPerson() {
33 | Person person = service.getPerson(1);
34 | Assert.assertEquals("TestPerson", person.getName());
35 | }
36 |
37 | @Test
38 | public void testUpdatePerson() {
39 | int id = 1;
40 | String updateName = "Edison Zhou";
41 |
42 | boolean result = service.updatePerson(id, updateName);
43 | Assert.assertEquals(true, result);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/msadv2/src/test/java/com/manulife/msadv2/UserServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv2;
2 |
3 | import com.manulife.msadv2.domain.User;
4 | import com.manulife.msadv2.service.UserService;
5 | import org.junit.Assert;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.test.context.junit4.SpringRunner;
11 |
12 | import java.util.List;
13 |
14 | @RunWith(SpringRunner.class)
15 | @SpringBootTest
16 | public class UserServiceTest {
17 | @Autowired
18 | private UserService service;
19 |
20 | @Test
21 | public void testUserService() throws Exception {
22 | // 01.get all user list
23 | List userList = service.getUserList();
24 | Assert.assertEquals(0, userList.size());
25 |
26 | // 02.add one new user
27 | User user = new User();
28 | Long userId = 10001L;
29 | user.setId(userId);
30 | user.setName("EdisonZhou");
31 | user.setAge(29);
32 | service.addNewUser(user);
33 |
34 | userList = service.getUserList();
35 | Assert.assertEquals(1, userList.size());
36 |
37 | // 03.get one existing user
38 | user = null;
39 | user = service.findUserById(userId);
40 | Assert.assertEquals("EdisonZhou", user.getName());
41 |
42 | // 04.update one existing user
43 | user.setName("HelloKitty");
44 | service.updateUserById(userId, user);
45 | user = null;
46 | user = service.findUserById(userId);
47 | Assert.assertEquals("HelloKitty", user.getName());
48 |
49 | // 05.delete one existing user
50 | service.deleteUserById(userId);
51 | userList = service.getUserList();
52 | Assert.assertEquals(0, userList.size());
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/msadv3/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv3/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv3/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv3/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv3/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv3
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv3
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | org.springframework.boot
42 | spring-boot-starter-thymeleaf
43 |
44 |
45 |
46 |
47 | io.springfox
48 | springfox-swagger2
49 | 2.8.0
50 |
51 |
52 |
53 | io.springfox
54 | springfox-swagger-ui
55 | 2.8.0
56 |
57 |
58 |
59 |
60 |
61 |
62 | org.springframework.boot
63 | spring-boot-maven-plugin
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/Msadv3Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import springfox.documentation.swagger2.annotations.EnableSwagger2;
6 |
7 | @SpringBootApplication
8 | @EnableSwagger2
9 | public class Msadv3Application {
10 |
11 | /// 此示例主要演示以下内容:
12 | /// 1.静态资源(比如图片导入/resources/static)的引入
13 | /// 2.Thymeleaf模板的使用
14 | /// 3.Thymeleaf模板的默认参数设置(application.properties)
15 | /// 4.Swagger2的引入实现API接口文档
16 | /// 5.统一异常处理(GlobalExceptionHandler)
17 | public static void main(String[] args) {
18 | SpringApplication.run(Msadv3Application.class, args);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/Swagger2Config.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3;
2 |
3 | import org.springframework.context.annotation.Bean;
4 | import org.springframework.context.annotation.Configuration;
5 | import springfox.documentation.builders.ApiInfoBuilder;
6 | import springfox.documentation.builders.PathSelectors;
7 | import springfox.documentation.builders.RequestHandlerSelectors;
8 | import springfox.documentation.service.ApiInfo;
9 | import springfox.documentation.service.Contact;
10 | import springfox.documentation.spi.DocumentationType;
11 | import springfox.documentation.spring.web.plugins.Docket;
12 | import springfox.documentation.swagger2.annotations.EnableSwagger2;
13 |
14 | @Configuration
15 | @EnableSwagger2
16 | public class Swagger2Config {
17 | @Bean
18 | public Docket createRestApi() {
19 | return new Docket(DocumentationType.SWAGGER_2)
20 | .apiInfo(currentApiInfo())
21 | .select()
22 | .apis(RequestHandlerSelectors.basePackage("com.manulife.msadv3.controller"))
23 | .paths(PathSelectors.any())
24 | .build();
25 | }
26 |
27 | private ApiInfo currentApiInfo() {
28 | return new ApiInfoBuilder()
29 | .title("SpringBoot User Service APIs")
30 | .description("Find more details : http://edisonchou.cnblogs.com")
31 | .termsOfServiceUrl("http://edisonchou.cnblogs.com")
32 | .contact(new Contact("Edison Zhou",
33 | "http://edisonchou.cnblogs.com",
34 | "http://edison_x_zhou@manulife.com"))
35 | .version("1.0")
36 | .build();
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/controller/ExceptionController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.controller;
2 |
3 | import com.manulife.msadv3.util.MyException;
4 | import org.springframework.stereotype.Controller;
5 | import org.springframework.web.bind.annotation.RequestMapping;
6 |
7 | @Controller
8 | @RequestMapping(value = "/exception")
9 | public class ExceptionController {
10 | @RequestMapping("/hello")
11 | public String hello() throws Exception {
12 | throw new Exception("Hello Exception!");
13 | }
14 |
15 | @RequestMapping("/json")
16 | public String json() throws MyException {
17 | throw new MyException("Hello Exception222!");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/controller/HelloController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.controller;
2 |
3 | import org.springframework.stereotype.Controller;
4 | import org.springframework.ui.ModelMap;
5 | import org.springframework.web.bind.annotation.RequestMapping;
6 |
7 | @Controller
8 | @RequestMapping(value = "/thymeleaf")
9 | public class HelloController {
10 | @RequestMapping("/")
11 | public String index(ModelMap map){
12 | // 在模板中读取host属性
13 | map.addAttribute("host", "http://edisonchou.cnblogs.com");
14 | // 返回模板文件的名称
15 | return "index";
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/controller/UserController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.controller;
2 |
3 | import com.manulife.msadv3.domain.User;
4 | import com.manulife.msadv3.service.UserService;
5 | import com.manulife.msadv3.util.StatusResponse;
6 | import io.swagger.annotations.ApiImplicitParam;
7 | import io.swagger.annotations.ApiImplicitParams;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.*;
11 |
12 | import java.util.List;
13 |
14 | @RestController
15 | @RequestMapping(value = "/users")
16 | public class UserController {
17 | @Autowired
18 | UserService service;
19 |
20 | @ApiOperation(value = "获取用户列表", notes = "")
21 | @RequestMapping(value = "/", method = RequestMethod.GET)
22 | public List getUserList(){
23 | return service.getUserList();
24 | }
25 |
26 | @ApiOperation(value = "创建新用户", notes = "根据User对象创建用户")
27 | @RequestMapping(value = "/", method = RequestMethod.POST)
28 | public String postUser(@ModelAttribute User user){
29 | boolean result = service.addNewUser(user);
30 |
31 | return result == true ?
32 | StatusResponse.SUCCESS.getDescription()
33 | : StatusResponse.FAILED.getDescription();
34 | }
35 |
36 | @RequestMapping(value = "/{id}", method = RequestMethod.GET)
37 | public User getUser(@PathVariable Long id){
38 | return service.findUserById(id);
39 | }
40 |
41 | @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
42 | @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
43 | public String putUser(@PathVariable Long id, @ModelAttribute User user){
44 | boolean result = service.updateUserById(id, user);
45 |
46 | return result == true ?
47 | StatusResponse.SUCCESS.getDescription()
48 | : StatusResponse.FAILED.getDescription();
49 | }
50 |
51 | @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象")
52 | @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
53 | public String deleteUser(@PathVariable Long id){
54 | boolean result = service.deleteUserById(id);
55 |
56 | return result == true ?
57 | StatusResponse.SUCCESS.getDescription()
58 | : StatusResponse.FAILED.getDescription();
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/domain/ErrorInfo.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.domain;
2 |
3 | public class ErrorInfo {
4 | public static final Integer OK = 200;
5 | public static final Integer ERROR = 500;
6 |
7 | private Integer code;
8 | private String message;
9 | private String url;
10 | private T data;
11 |
12 | public static Integer getOK() {
13 | return OK;
14 | }
15 |
16 | public static Integer getERROR() {
17 | return ERROR;
18 | }
19 |
20 | public Integer getCode() {
21 | return code;
22 | }
23 |
24 | public void setCode(Integer code) {
25 | this.code = code;
26 | }
27 |
28 | public String getMessage() {
29 | return message;
30 | }
31 |
32 | public void setMessage(String message) {
33 | this.message = message;
34 | }
35 |
36 | public String getUrl() {
37 | return url;
38 | }
39 |
40 | public void setUrl(String url) {
41 | this.url = url;
42 | }
43 |
44 | public T getData() {
45 | return data;
46 | }
47 |
48 | public void setData(T data) {
49 | this.data = data;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.domain;
2 |
3 | public class User {
4 | private Long id;
5 | private String name;
6 | private Integer age;
7 |
8 | public Long getId() {
9 | return id;
10 | }
11 |
12 | public void setId(Long id) {
13 | this.id = id;
14 | }
15 |
16 | public String getName() {
17 | return name;
18 | }
19 |
20 | public void setName(String name) {
21 | this.name = name;
22 | }
23 |
24 | public Integer getAge() {
25 | return age;
26 | }
27 |
28 | public void setAge(Integer age) {
29 | this.age = age;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/domain/UserRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.domain;
2 |
3 | import java.util.List;
4 |
5 | public interface UserRepository {
6 | List getUserList();
7 | Boolean addNewUser(User user);
8 | User findUserById(Long id);
9 | Boolean updateUserById(Long id, User user);
10 | Boolean deleteUserById(Long id);
11 | }
12 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/domain/UserRepositoryImpl.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.domain;
2 |
3 | import org.springframework.stereotype.Repository;
4 |
5 | import java.util.*;
6 |
7 | @Repository
8 | public class UserRepositoryImpl implements UserRepository {
9 | // thread-safe Map
10 | static Map users = Collections.synchronizedMap(new HashMap());
11 |
12 | @Override
13 | public List getUserList() {
14 | List userList = new ArrayList(users.values());
15 |
16 | return userList;
17 | }
18 |
19 | @Override
20 | public Boolean addNewUser(User user) {
21 | users.put(user.getId(), user);
22 |
23 | return true;
24 | }
25 |
26 | @Override
27 | public User findUserById(Long id) {
28 | return users.get(id);
29 | }
30 |
31 | @Override
32 | public Boolean updateUserById(Long id, User user) {
33 | User model = users.get(id);
34 |
35 | if (model == null){
36 | return false;
37 | }
38 |
39 | model.setName(user.getName());
40 | model.setAge(user.getAge());
41 |
42 | users.put(id, model);
43 |
44 | return true;
45 | }
46 |
47 | public Boolean deleteUserById(Long id){
48 | users.remove(id);
49 |
50 | return true;
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/service/UserService.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.service;
2 |
3 | import com.manulife.msadv3.domain.User;
4 |
5 | import java.util.List;
6 |
7 | public interface UserService {
8 | List getUserList();
9 | Boolean addNewUser(User user);
10 | User findUserById(Long id);
11 | Boolean updateUserById(Long id, User user);
12 | Boolean deleteUserById(Long id);
13 | }
14 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/service/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.service;
2 |
3 | import com.manulife.msadv3.domain.User;
4 | import com.manulife.msadv3.domain.UserRepository;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.stereotype.Service;
7 |
8 | import java.util.List;
9 |
10 | @Service
11 | public class UserServiceImpl implements UserService {
12 | @Autowired
13 | UserRepository repository;
14 |
15 | @Override
16 | public List getUserList() {
17 | return repository.getUserList();
18 | }
19 |
20 | @Override
21 | public Boolean addNewUser(User user) {
22 | return repository.addNewUser(user);
23 | }
24 |
25 | @Override
26 | public User findUserById(Long id) {
27 | return repository.findUserById(id);
28 | }
29 |
30 | @Override
31 | public Boolean updateUserById(Long id, User user) {
32 | return repository.updateUserById(id, user);
33 | }
34 |
35 | @Override
36 | public Boolean deleteUserById(Long id) {
37 | return repository.deleteUserById(id);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/util/GlobalExceptionHandler.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.util;
2 |
3 | import com.manulife.msadv3.domain.ErrorInfo;
4 | import org.springframework.web.bind.annotation.ControllerAdvice;
5 | import org.springframework.web.bind.annotation.ExceptionHandler;
6 | import org.springframework.web.bind.annotation.ResponseBody;
7 |
8 | import javax.servlet.http.HttpServletRequest;
9 |
10 | @ControllerAdvice
11 | public class GlobalExceptionHandler {
12 | // 下面两个方法只可同时存在一个,否则会有二义性!
13 |
14 | // public static final String DEFAULT_ERROR_VIEW = "error";
15 | //
16 | // // 视图模式异常信息页
17 | // @ExceptionHandler(value = Exception.class)
18 | // public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
19 | // ModelAndView mav = new ModelAndView();
20 | // mav.addObject("exception", e);
21 | // mav.addObject("url", req.getRequestURL());
22 | // mav.setViewName(DEFAULT_ERROR_VIEW);
23 | //
24 | // return mav;
25 | // }
26 |
27 | // JSON格式异常信息返回
28 | @ExceptionHandler(value = Exception.class)
29 | @ResponseBody
30 | public ErrorInfo jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception {
31 | ErrorInfo r = new ErrorInfo<>();
32 | r.setMessage(e.getMessage());
33 | r.setCode(ErrorInfo.ERROR);
34 | r.setData("Some Data");
35 | r.setUrl(req.getRequestURL().toString());
36 |
37 | return r;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/util/MyException.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.util;
2 |
3 | /// 自定义异常 MyException
4 | public class MyException extends Exception {
5 | public MyException(String message){
6 | super(message);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/java/com/manulife/msadv3/util/StatusResponse.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3.util;
2 |
3 | public enum StatusResponse {
4 | SUCCESS("Success"), FAILED("Failed");
5 |
6 | private String description;
7 |
8 | private StatusResponse(String description){
9 | this.description = description;
10 | }
11 |
12 | public String getDescription(){
13 | return description;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | # Enable template caching.
2 | #spring.thymeleaf.cache=true
3 | # Check that the templates location exists.
4 | #spring.thymeleaf.check-template-location=true
5 | # Content-Type value.
6 | #spring.thymeleaf.content-type=text/html
7 | # Enable MVC Thymeleaf view resolution.
8 | #spring.thymeleaf.enabled=true
9 | # Template encoding.
10 | #spring.thymeleaf.encoding=UTF-8
11 | # Comma-separated list of view names that should be excluded from resolution.
12 | #spring.thymeleaf.excluded-view-names=
13 | # Template mode to be applied to templates. See also StandardTemplateModeHandlers.
14 | #spring.thymeleaf.mode=HTML5
15 | # Prefix that gets prepended to view names when building a URL.
16 | #spring.thymeleaf.prefix=classpath:/templates/
17 | # Suffix that gets appended to view names when building a URL.
18 | #spring.thymeleaf.suffix=.html spring.thymeleaf.template-resolver-order= # Order of the template resolver in the chain. spring.thymeleaf.view-names= # Comma-separated list of view names that can be resolved.
--------------------------------------------------------------------------------
/src/msadv3/src/main/resources/static/MSL_LOGO.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv3/src/main/resources/static/MSL_LOGO.jpg
--------------------------------------------------------------------------------
/src/msadv3/src/main/resources/static/dakongyi_header.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv3/src/main/resources/static/dakongyi_header.PNG
--------------------------------------------------------------------------------
/src/msadv3/src/main/resources/static/dakongyi_header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv3/src/main/resources/static/dakongyi_header.jpg
--------------------------------------------------------------------------------
/src/msadv3/src/main/resources/static/kejidog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv3/src/main/resources/static/kejidog.jpg
--------------------------------------------------------------------------------
/src/msadv3/src/main/resources/templates/error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 统一异常处理
6 |
7 |
8 | Hello, This is a Global Error Handler
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/msadv3/src/main/resources/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Spring Boot Demo
6 |
7 |
8 | Hello World
9 |
10 |
--------------------------------------------------------------------------------
/src/msadv3/src/test/java/com/manulife/msadv3/Msadv3ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv3;
2 |
3 | import org.junit.Test;
4 | import org.junit.runner.RunWith;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.junit4.SpringRunner;
7 |
8 | @RunWith(SpringRunner.class)
9 | @SpringBootTest
10 | public class Msadv3ApplicationTests {
11 |
12 | @Test
13 | public void contextLoads() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/msadv4/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv4/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv4/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv4/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv4/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv4
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv4
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 | org.springframework.boot
41 | spring-boot-starter-thymeleaf
42 |
43 |
44 |
45 | org.springframework.boot
46 | spring-boot-starter-security
47 |
48 |
49 | org.springframework.security
50 | spring-security-test
51 | test
52 |
53 |
54 |
55 | org.springframework.boot
56 | spring-boot-starter-jdbc
57 |
58 |
59 |
60 | org.springframework.boot
61 | spring-boot-starter-data-jpa
62 |
63 |
64 |
65 | mysql
66 | mysql-connector-java
67 | 8.0.11
68 |
69 |
70 | org.springframework.data
71 | spring-data-jpa
72 | 1.11.10.RELEASE
73 |
74 |
75 |
76 |
77 |
78 |
79 | org.springframework.boot
80 | spring-boot-maven-plugin
81 |
82 |
83 |
84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/java/com/manulife/msadv4/Msadv4Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv4Application {
8 |
9 | /// 此示例主要演示以下内容:
10 | /// 1.Spring Security的基本应用 (WebSecurityConfig)
11 | /// 2.JdbcTemplate访问数据库
12 | /// 3.Spring-JPA访问数据库
13 | public static void main(String[] args) {
14 | SpringApplication.run(Msadv4Application.class, args);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/java/com/manulife/msadv4/WebSecurityConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.context.annotation.Configuration;
5 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
6 | import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
8 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
9 |
10 | @Configuration
11 | @EnableWebSecurity
12 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
13 | @Override
14 | protected void configure(HttpSecurity http) throws Exception{
15 | http.authorizeRequests() // => 定义哪些URL需要被保护、哪些不需要被保护
16 | // "/"和"/home"不需要认证就可以访问
17 | .antMatchers("/", "/home").permitAll()
18 | // 而其他URL则必须通过认证
19 | .anyRequest().authenticated()
20 | .and()
21 | .formLogin() // => 定义当需要用户登录时候,转到的登录页面
22 | .loginPage("/login")
23 | .permitAll()
24 | .and()
25 | .logout()
26 | .permitAll();
27 | }
28 |
29 | @Autowired
30 | public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
31 | // 在内存中创建了一个用户,该用户的名称为user,密码为password,用户角色为USER
32 | auth.inMemoryAuthentication()
33 | .withUser("user").password("password").roles("USER");
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/java/com/manulife/msadv4/controller/HelloController.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4.controller;
2 |
3 | import org.springframework.stereotype.Controller;
4 | import org.springframework.ui.ModelMap;
5 | import org.springframework.web.bind.annotation.RequestMapping;
6 |
7 | /// 注意:
8 | /// 这里需要事先导入Thyemleaf模板,详见pom.xml文件
9 | @Controller
10 | public class HelloController {
11 | @RequestMapping("/")
12 | public String index(){
13 | return "index";
14 | }
15 |
16 | @RequestMapping(value = "/hello")
17 | public String hello(ModelMap map){
18 | // 在模板中读取host属性
19 | map.addAttribute("host", "http://edisonchou.cnblogs.com");
20 | // 返回模板文件的名称
21 | return "hello";
22 | }
23 |
24 | @RequestMapping(value = "/login")
25 | public String login(){
26 | return "login";
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/java/com/manulife/msadv4/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4.domain;
2 |
3 | import javax.persistence.Column;
4 | import javax.persistence.Entity;
5 | import javax.persistence.GeneratedValue;
6 | import javax.persistence.Id;
7 |
8 | @Entity
9 | public class User {
10 | @Id
11 | @GeneratedValue
12 | private Long id;
13 |
14 | @Column(nullable = false)
15 | private String name;
16 |
17 | @Column(nullable = false)
18 | private Integer age;
19 |
20 | public Long getId() {
21 | return id;
22 | }
23 |
24 | public void setId(Long id) {
25 | this.id = id;
26 | }
27 |
28 | public String getName() {
29 | return name;
30 | }
31 |
32 | public void setName(String name) {
33 | this.name = name;
34 | }
35 |
36 | public Integer getAge() {
37 | return age;
38 | }
39 |
40 | public void setAge(Integer age) {
41 | this.age = age;
42 | }
43 |
44 | public User() {
45 | }
46 |
47 | public User(String name, Integer age) {
48 | this.name = name;
49 | this.age = age;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/java/com/manulife/msadv4/domain/UserRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4.domain;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 | import org.springframework.data.jpa.repository.Query;
5 | import org.springframework.data.repository.query.Param;
6 |
7 | public interface UserRepository extends JpaRepository {
8 | // spring-data-jpa可以通过解析方法名创建查询
9 | User findByName(String name);
10 |
11 | User findByNameAndAge(String name, Integer age);
12 |
13 | @Query("from User u where u.name = :name")
14 | User findUser(@Param("name") String name);
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/java/com/manulife/msadv4/service/UserService.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4.service;
2 |
3 | public interface UserService {
4 | // 01.新增一个用户
5 | void create(String name, Integer age);
6 | // 02.根据name删除一个用户
7 | void deleteByName(String name);
8 | // 03.获取用户量
9 | Integer getAllUsers();
10 | // 04.删除所有用户
11 | void deleteAllUsers();
12 | }
13 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/java/com/manulife/msadv4/service/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4.service;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.jdbc.core.JdbcTemplate;
5 | import org.springframework.stereotype.Service;
6 |
7 | @Service
8 | public class UserServiceImpl implements UserService {
9 | @Autowired
10 | private JdbcTemplate jdbcTemplate;
11 |
12 | @Override
13 | public void create(String name, Integer age) {
14 | jdbcTemplate.update("insert into USER(NAME, AGE) values(?,?)", name, age);
15 | }
16 |
17 | @Override
18 | public void deleteByName(String name) {
19 | jdbcTemplate.update("delete from USER where NAME = ?", name);
20 | }
21 |
22 | @Override
23 | public Integer getAllUsers() {
24 | return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);
25 | }
26 |
27 | @Override
28 | public void deleteAllUsers() {
29 | jdbcTemplate.update("delete from USER");
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | hbm2ddl:
14 | # options: create, create-drop, update, validate
15 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
16 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
17 | auto: update
18 | redis:
19 | database: 0
20 | host: 10.248.37.3
21 | port: 6379
22 |
23 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/resources/templates/hello.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Hello World
9 |
10 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/resources/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Spring Security入门
5 |
6 |
7 | 欢迎使用Spring Security!
8 | 点击 这里 打个招呼吧
9 |
10 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/resources/templates/login.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | Spring Security Example
7 |
8 |
9 |
10 | 用户名或密码错
11 |
12 |
13 | 您已注销成功
14 |
15 |
20 |
21 |
--------------------------------------------------------------------------------
/src/msadv4/src/main/resources/templates/logout.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 | Hello World!
6 |
7 |
8 | Hello [[${#httpServletRequest.remoteUser}]]!
9 |
12 |
13 |
--------------------------------------------------------------------------------
/src/msadv4/src/test/java/com/manulife/msadv4/UserRepositoryTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4;
2 |
3 | import com.manulife.msadv4.domain.User;
4 | import com.manulife.msadv4.domain.UserRepository;
5 | import org.junit.Assert;
6 | import org.junit.Before;
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.boot.test.context.SpringBootTest;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | @RunWith(SpringRunner.class)
14 | @SpringBootTest
15 | public class UserRepositoryTest {
16 | @Autowired
17 | private UserRepository userRepository;
18 |
19 | @Before
20 | public void setUp(){
21 | // 准备工作:清空user表
22 | userRepository.deleteAllInBatch();
23 | }
24 |
25 | @Test
26 | public void testSpringDataJpa() throws Exception{
27 | // 01.创建10条记录
28 | userRepository.save(new User("AAA",10));
29 | userRepository.save(new User("BBB",20));
30 | userRepository.save(new User("CCC",30));
31 | userRepository.save(new User("DDD",40));
32 | userRepository.save(new User("EEE",50));
33 | userRepository.save(new User("FFF",60));
34 | userRepository.save(new User("GGG",70));
35 | userRepository.save(new User("HHH",80));
36 | userRepository.save(new User("III",90));
37 | userRepository.save(new User("JJJ",100));
38 |
39 | // 02.测试findAll
40 | Assert.assertEquals(10, userRepository.findAll().size());
41 |
42 | // 03.测试findByName, 查询姓名为FFF的User
43 | Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());
44 |
45 | // 04.测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User
46 | Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());
47 |
48 | // 05.测试删除姓名为AAA的User
49 | userRepository.delete(userRepository.findByName("AAA"));
50 |
51 | // 06. 测试findAll,查询所有记录,验证上面的删除是否成功
52 | Assert.assertEquals(9, userRepository.findAll().size());
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/msadv4/src/test/java/com/manulife/msadv4/UserServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv4;
2 |
3 | import com.manulife.msadv4.service.UserService;
4 | import org.junit.Assert;
5 | import org.junit.Before;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.test.context.junit4.SpringRunner;
11 |
12 | @RunWith(SpringRunner.class)
13 | @SpringBootTest
14 | public class UserServiceTest {
15 |
16 | @Autowired
17 | private UserService userSerivce;
18 |
19 | @Before
20 | public void setUp(){
21 | // 准备工作:清空user表
22 | userSerivce.deleteAllUsers();
23 | }
24 |
25 | @Test
26 | public void test() throws Exception{
27 | // 01.插入5个用户
28 | userSerivce.create("aaa",1);
29 | userSerivce.create("bbb", 2);
30 | userSerivce.create("ccc",3);
31 | userSerivce.create("ddd",4);
32 | userSerivce.create("eee", 5);
33 |
34 | // 02.查数据库,这时应该有5个用户
35 | Assert.assertEquals(5, userSerivce.getAllUsers().intValue());
36 |
37 | // 03.删除两个用户
38 | userSerivce.deleteByName("aaa");
39 | userSerivce.deleteByName("ddd");
40 |
41 | // 04.查数据库,这时应该有3个用户
42 | Assert.assertEquals(3, userSerivce.getAllUsers().intValue());
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/msadv5/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv5/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv5/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv5/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv5/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv5
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv5
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | org.springframework.boot
42 | spring-boot-starter-jdbc
43 |
44 |
45 |
46 |
47 | mysql
48 | mysql-connector-java
49 | 8.0.11
50 |
51 |
52 |
53 |
54 | org.springframework.boot
55 | spring-boot-starter-data-jpa
56 |
57 |
58 |
59 |
60 |
61 |
62 | org.springframework.boot
63 | spring-boot-maven-plugin
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/DataSourceConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5;
2 |
3 | import org.springframework.beans.factory.annotation.Qualifier;
4 | import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
5 | import org.springframework.boot.context.properties.ConfigurationProperties;
6 | import org.springframework.context.annotation.Bean;
7 | import org.springframework.context.annotation.Configuration;
8 | import org.springframework.context.annotation.Primary;
9 |
10 | import javax.sql.DataSource;
11 |
12 | @Configuration
13 | public class DataSourceConfig {
14 | @Bean(name = "primaryDataSource")
15 | @Qualifier("primaryDataSource")
16 | @Primary
17 | @ConfigurationProperties(prefix = "spring.datasource.primary")
18 | public DataSource primaryDataSource() {
19 | return DataSourceBuilder.create().build();
20 | }
21 |
22 | @Bean(name = "secondaryDataSource")
23 | @Qualifier("secondaryDataSource")
24 | @ConfigurationProperties(prefix = "spring.datasource.secondary")
25 | public DataSource secondaryDataSource() {
26 | return DataSourceBuilder.create().build();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/JdbcTemplateConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5;
2 |
3 | import org.springframework.beans.factory.annotation.Qualifier;
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 | import org.springframework.jdbc.core.JdbcTemplate;
7 | import javax.sql.DataSource;
8 |
9 | @Configuration
10 | public class JdbcTemplateConfig {
11 | @Bean(name = "primaryJdbcTemplate")
12 | public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource){
13 | return new JdbcTemplate(dataSource);
14 | }
15 |
16 | @Bean(name = "secondaryJdbcTemplate")
17 | public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource){
18 | return new JdbcTemplate(dataSource);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/Msadv5Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv5Application {
8 |
9 | /// 此示例主要演示以下内容:
10 | /// 1.多数据源配置(基于JdbcTemplate)
11 | /// 2.多数据源配置(基于Spring-Data-JPA)
12 | public static void main(String[] args) {
13 | SpringApplication.run(Msadv5Application.class, args);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/PrimaryJpaConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.beans.factory.annotation.Qualifier;
5 | import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
6 | import org.springframework.context.annotation.Bean;
7 | import org.springframework.context.annotation.Configuration;
8 | import org.springframework.context.annotation.Primary;
9 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
10 | import org.springframework.transaction.annotation.EnableTransactionManagement;
11 | import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
12 | import org.springframework.orm.jpa.JpaTransactionManager;
13 | import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
14 | import org.springframework.transaction.PlatformTransactionManager;
15 |
16 | import javax.persistence.EntityManager;
17 | import javax.sql.DataSource;
18 | import java.util.Map;
19 |
20 | @Configuration
21 | @EnableTransactionManagement
22 | @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary",
23 | transactionManagerRef = "transactionManagerPrimary",
24 | basePackages = {"com.manulife.msadv5.primary"})
25 | public class PrimaryJpaConfig {
26 | @Autowired
27 | @Qualifier("primaryDataSource")
28 | private DataSource primaryDataSource;
29 |
30 | @Primary
31 | @Bean(name = "entityManagerPrimary")
32 | public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
33 | return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
34 | }
35 |
36 | @Primary
37 | @Bean(name = "entityManagerFactoryPrimary")
38 | public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
39 | return builder.dataSource(primaryDataSource)
40 | .properties(getVendorProperties(primaryDataSource))
41 | .packages("com.manulife.msadv5.primary")
42 | .persistenceUnit("primaryPersistenceUnit")
43 | .build();
44 | }
45 |
46 | @Autowired
47 | private JpaProperties jpaProperties;
48 |
49 | private Map getVendorProperties(DataSource dataSource) {
50 | return jpaProperties.getHibernateProperties(dataSource);
51 | }
52 |
53 | @Primary
54 | @Bean(name = "transactionManagerPrimary")
55 | public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
56 | return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/SecondaryJpaConfig.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.beans.factory.annotation.Qualifier;
5 | import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
6 | import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
7 | import org.springframework.context.annotation.Bean;
8 | import org.springframework.context.annotation.Configuration;
9 | import org.springframework.context.annotation.Primary;
10 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
11 | import org.springframework.orm.jpa.JpaTransactionManager;
12 | import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
13 | import org.springframework.transaction.PlatformTransactionManager;
14 | import org.springframework.transaction.annotation.EnableTransactionManagement;
15 |
16 | import javax.persistence.EntityManager;
17 | import javax.sql.DataSource;
18 | import java.util.Map;
19 |
20 | @Configuration
21 | @EnableTransactionManagement
22 | @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySecondary",
23 | transactionManagerRef = "transactionManagerSecondary",
24 | basePackages = {"com.manulife.msadv5.secondary"})
25 | public class SecondaryJpaConfig {
26 | @Autowired
27 | @Qualifier("secondaryDataSource")
28 | private DataSource secondaryDataSource;
29 |
30 | @Bean(name = "entityManagerSecondary")
31 | public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
32 | return entityManagerFactorySecondary(builder).getObject().createEntityManager();
33 | }
34 |
35 | @Bean(name = "entityManagerFactorySecondary")
36 | public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
37 | return builder.dataSource(secondaryDataSource)
38 | .properties(getVendorProperties(secondaryDataSource))
39 | .packages("com.manulife.msadv5.secondary")
40 | .persistenceUnit("primaryPersistenceUnit")
41 | .build();
42 | }
43 |
44 | @Autowired
45 | private JpaProperties jpaProperties;
46 |
47 | private Map getVendorProperties(DataSource dataSource) {
48 | return jpaProperties.getHibernateProperties(dataSource);
49 | }
50 |
51 | @Bean(name = "transactionManagerSecondary")
52 | public PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
53 | return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/primary/Message.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5.primary;
2 |
3 | import javax.persistence.Column;
4 | import javax.persistence.Entity;
5 | import javax.persistence.GeneratedValue;
6 | import javax.persistence.Id;
7 |
8 | @Entity
9 | public class Message {
10 | @Id
11 | @GeneratedValue
12 | private Long id;
13 |
14 | @Column(nullable = false)
15 | private String name;
16 |
17 | @Column(nullable = false)
18 | private String content;
19 |
20 | public Message(){
21 |
22 | }
23 |
24 | public Message(String name, String content){
25 | this.name = name;
26 | this.content = content;
27 | }
28 |
29 | public Long getId() {
30 | return id;
31 | }
32 |
33 | public void setId(Long id) {
34 | this.id = id;
35 | }
36 |
37 | public String getName() {
38 | return name;
39 | }
40 |
41 | public void setName(String name) {
42 | this.name = name;
43 | }
44 |
45 | public String getContent() {
46 | return content;
47 | }
48 |
49 | public void setContent(String content) {
50 | this.content = content;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/primary/MessageRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5.primary;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 |
5 | public interface MessageRepository extends JpaRepository {
6 |
7 | }
8 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/secondary/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5.secondary;
2 |
3 | import javax.persistence.Column;
4 | import javax.persistence.Entity;
5 | import javax.persistence.GeneratedValue;
6 | import javax.persistence.Id;
7 |
8 | @Entity
9 | public class User {
10 | @Id
11 | @GeneratedValue
12 | private Long id;
13 |
14 | @Column(nullable = false)
15 | private String name;
16 |
17 | @Column(nullable = false)
18 | private Integer age;
19 |
20 | public User(){
21 |
22 | }
23 |
24 | public Long getId() {
25 | return id;
26 | }
27 |
28 | public void setId(Long id) {
29 | this.id = id;
30 | }
31 |
32 | public String getName() {
33 | return name;
34 | }
35 |
36 | public void setName(String name) {
37 | this.name = name;
38 | }
39 |
40 | public Integer getAge() {
41 | return age;
42 | }
43 |
44 | public void setAge(Integer age) {
45 | this.age = age;
46 | }
47 |
48 | public User(String name, Integer age){
49 | this.name = name;
50 | this.age = age;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/java/com/manulife/msadv5/secondary/UserRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5.secondary;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 |
5 | public interface UserRepository extends JpaRepository {
6 |
7 | }
8 |
--------------------------------------------------------------------------------
/src/msadv5/src/main/resources/application.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv5/src/main/resources/application.properties
--------------------------------------------------------------------------------
/src/msadv5/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | primary:
7 | url: jdbc:mysql://10.248.37.3:3307/test_primary
8 | username: root
9 | password: 123qwe
10 | driver-class-name: com.mysql.cj.jdbc.Driver
11 | secondary:
12 | url: jdbc:mysql://10.248.37.3:3307/test_secondary
13 | username: root
14 | password: 123qwe
15 | driver-class-name: com.mysql.cj.jdbc.Driver
16 | jpa:
17 | properties:
18 | hibernate:
19 | hbm2ddl:
20 | auto: update
21 |
22 |
--------------------------------------------------------------------------------
/src/msadv5/src/test/java/com/manulife/msadv5/JdbcTemplateDataSourcesTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5;
2 |
3 | import org.junit.Assert;
4 | import org.junit.Before;
5 | import org.junit.Test;
6 | import org.junit.runner.RunWith;
7 | import org.springframework.beans.factory.annotation.Autowired;
8 | import org.springframework.beans.factory.annotation.Qualifier;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.jdbc.core.JdbcTemplate;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | @RunWith(SpringRunner.class)
14 | @SpringBootTest
15 | public class JdbcTemplateDataSourcesTest {
16 | @Autowired
17 | @Qualifier("primaryJdbcTemplate")
18 | protected JdbcTemplate jdbcPrimaryTemplate;
19 |
20 | @Autowired
21 | @Qualifier("secondaryJdbcTemplate")
22 | protected JdbcTemplate jdbcSecondaryTemplate;
23 |
24 | @Before
25 | public void setUp(){
26 | jdbcPrimaryTemplate.update("DELETE FROM USER ");
27 | jdbcSecondaryTemplate.update("DELETE FROM USER ");
28 | }
29 |
30 | @Test
31 | public void testDataSources() throws Exception{
32 | // 01.向第一个数据源插入两条数据
33 | jdbcPrimaryTemplate.update("INSERT INTO User(name,age) VALUES(?,?)", "Edison", 29);
34 | jdbcPrimaryTemplate.update("INSERT INTO User(name,age) VALUES(?,?)", "Andy", 30);
35 |
36 | // 02.向第二个数据源插入一条数据,若插入的是第一个数据源,则会主键冲突
37 | jdbcSecondaryTemplate.update("INSERT INTO User(name,age) VALUES(?,?)", "Edison", 29);
38 |
39 | // 03.查询第一个数据源中是否有两条数据,验证插入是否成功
40 | Assert.assertEquals("2", jdbcPrimaryTemplate.queryForObject("SELECT COUNT(1) FROM User", String.class));
41 |
42 | // 04.查询第二个数据源中是否有两条数据,验证插入是否成功
43 | Assert.assertEquals("1", jdbcSecondaryTemplate.queryForObject("SELECT COUNT(1) FROM User", String.class));
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/msadv5/src/test/java/com/manulife/msadv5/JpaDataSourcesTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv5;
2 |
3 | import com.manulife.msadv5.primary.Message;
4 | import com.manulife.msadv5.primary.MessageRepository;
5 | import com.manulife.msadv5.secondary.User;
6 | import com.manulife.msadv5.secondary.UserRepository;
7 | import org.junit.Assert;
8 | import org.junit.Before;
9 | import org.junit.Test;
10 | import org.junit.runner.RunWith;
11 | import org.springframework.beans.factory.annotation.Autowired;
12 | import org.springframework.boot.test.context.SpringBootTest;
13 | import org.springframework.test.context.junit4.SpringRunner;
14 |
15 | @RunWith(SpringRunner.class)
16 | @SpringBootTest
17 | public class JpaDataSourcesTest {
18 | @Autowired
19 | private UserRepository userRepository;
20 | @Autowired
21 | private MessageRepository messageRepository;
22 |
23 | @Before
24 | public void setUp(){
25 | userRepository.deleteAllInBatch();
26 | messageRepository.deleteAllInBatch();
27 | }
28 |
29 | @Test
30 | public void testJpaDataSources() throws Exception {
31 | // secondary datasource
32 | userRepository.save(new User("aaa", 10));
33 | userRepository.save(new User("bbb", 20));
34 | userRepository.save(new User("ccc", 30));
35 | userRepository.save(new User("ddd", 40));
36 | userRepository.save(new User("eee", 50));
37 |
38 | Assert.assertEquals(5, userRepository.findAll().size());
39 |
40 | // primary datasource
41 | messageRepository.save(new Message("o1", "aaaaaaaaaa"));
42 | messageRepository.save(new Message("o2", "bbbbbbbbbb"));
43 | messageRepository.save(new Message("o3", "cccccccccc"));
44 |
45 | Assert.assertEquals(3, messageRepository.findAll().size());
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/msadv6/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv6/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv6/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv6/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv6/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv6
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv6
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 |
30 | org.springframework.boot
31 | spring-boot-starter-data-mongodb
32 |
33 |
34 |
35 | com.spring4all
36 | mongodb-plus-spring-boot-starter
37 | 1.0.0.RELEASE
38 |
39 |
40 |
41 | org.springframework.boot
42 | spring-boot-starter-data-redis
43 |
44 |
45 |
46 | com.alibaba
47 | fastjson
48 | 1.1.23
49 |
50 |
51 |
52 | org.springframework.boot
53 | spring-boot-starter-web
54 |
55 |
56 |
57 | org.springframework.boot
58 | spring-boot-starter-test
59 | test
60 |
61 |
62 |
63 |
64 |
65 |
66 | org.springframework.boot
67 | spring-boot-maven-plugin
68 |
69 |
70 |
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/src/msadv6/src/main/java/com/manulife/msadv6/Msadv6Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv6;
2 |
3 | import com.spring4all.mongodb.EnableMongoPlus;
4 | import org.springframework.boot.SpringApplication;
5 | import org.springframework.boot.autoconfigure.SpringBootApplication;
6 |
7 | @EnableMongoPlus // => MongoDB配置增强 => spring4all package
8 | @SpringBootApplication
9 | public class Msadv6Application {
10 |
11 | /// 此示例主要演示以下内容:
12 | /// 1.Redis的基本使用
13 | /// 2.MongoDB的基本使用
14 | /// 3.MongoDB的配置增强(连接池等)
15 | public static void main(String[] args) {
16 | SpringApplication.run(Msadv6Application.class, args);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/msadv6/src/main/java/com/manulife/msadv6/domain/Client.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv6.domain;
2 |
3 | import org.springframework.data.annotation.Id;
4 |
5 | public class Client {
6 | @Id
7 | private Long id;
8 |
9 | private String userName;
10 | private Integer age;
11 |
12 | public Client(Long id, String userName, Integer age){
13 | this.id = id;
14 | this.userName = userName;
15 | this.age = age;
16 | }
17 |
18 | public Long getId() {
19 | return id;
20 | }
21 |
22 | public void setId(Long id) {
23 | this.id = id;
24 | }
25 |
26 | public String getUserName() {
27 | return userName;
28 | }
29 |
30 | public void setUserName(String userName) {
31 | this.userName = userName;
32 | }
33 |
34 | public Integer getAge() {
35 | return age;
36 | }
37 |
38 | public void setAge(Integer age) {
39 | this.age = age;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/msadv6/src/main/java/com/manulife/msadv6/domain/ClientRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv6.domain;
2 |
3 | import org.springframework.data.mongodb.repository.MongoRepository;
4 |
5 | public interface ClientRepository extends MongoRepository {
6 | Client findByUserName(String userName);
7 | }
8 |
--------------------------------------------------------------------------------
/src/msadv6/src/main/java/com/manulife/msadv6/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv6.domain;
2 |
3 | import java.io.Serializable;
4 |
5 | public class User implements Serializable {
6 | private static final long searialVersionUID = -1L;
7 |
8 | private String userName;
9 | private Integer age;
10 |
11 | public User() {
12 |
13 | }
14 |
15 | public User(String userName, Integer age) {
16 | this.userName = userName;
17 | this.age = age;
18 | }
19 |
20 | public String getUserName() {
21 | return userName;
22 | }
23 |
24 | public void setUserName(String userName) {
25 | this.userName = userName;
26 | }
27 |
28 | public Integer getAge() {
29 | return age;
30 | }
31 |
32 | public void setAge(Integer age) {
33 | this.age = age;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/msadv6/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | hbm2ddl:
14 | # options: create, create-drop, update, validate
15 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
16 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
17 | auto: update
18 | redis:
19 | database: 0
20 | host: 10.248.37.3
21 | port: 6379
22 | password:
23 | pool:
24 | max-active: 10
25 | max-wait: -1
26 | max-idle: 10
27 | min-idle: 0
28 | timeout: 0
29 | data:
30 | mongodb:
31 | host: 10.248.37.3
32 | port: 27017
33 | database: spring
34 | # need EnableMongoPlus, find more details: http://blog.didispace.com/springbootmongodb-plus/
35 | option:
36 | min-connection-per-host: 0
37 | max-connection-per-host: 100
38 | threads-allowed-to-block-for-connection-multipler: 5
39 | server-selection-timeout: 30000
40 |
41 |
--------------------------------------------------------------------------------
/src/msadv6/src/test/java/com/manulife/msadv6/MongoApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv6;
2 |
3 | import com.manulife.msadv6.domain.Client;
4 | import com.manulife.msadv6.domain.ClientRepository;
5 | import org.junit.Assert;
6 | import org.junit.Before;
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.boot.test.context.SpringBootTest;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | @RunWith(SpringRunner.class)
14 | @SpringBootTest
15 | public class MongoApplicationTest {
16 | @Autowired
17 | private ClientRepository clientRepository;
18 |
19 | @Before
20 | public void setUp(){
21 | clientRepository.deleteAll();
22 | }
23 |
24 | @Test
25 | public void testClientRepository(){
26 | // 01.创建三个Client到MongoDB,并验证Client总数
27 | clientRepository.save(new Client(1L, "Edison", 29));
28 | clientRepository.save(new Client(2L, "Andy", 30));
29 | clientRepository.save(new Client(3L, "Leo", 27));
30 |
31 | Assert.assertEquals(3, clientRepository.findAll().size());
32 |
33 | // 02.删除一个Client,再验证Client总数
34 | Client client = clientRepository.findOne(1L);
35 | clientRepository.delete(client);
36 |
37 | Assert.assertEquals(2, clientRepository.findAll().size());
38 |
39 | // 03.再删除一个Client,再验证Client总数
40 | client = clientRepository.findByUserName("Leo");
41 | clientRepository.delete(client);
42 |
43 | Assert.assertEquals(1, clientRepository.findAll().size());
44 |
45 | // 04.更改一个Client的age,再存入MongoDB,最后验证age
46 | client = clientRepository.findByUserName("Andy");
47 | client.setAge(31);
48 | clientRepository.save(client);
49 |
50 | Assert.assertEquals(31,
51 | clientRepository.findByUserName("Andy").getAge().intValue());
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/msadv6/src/test/java/com/manulife/msadv6/RedisApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv6;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.alibaba.fastjson.JSONObject;
5 | import com.manulife.msadv6.domain.User;
6 | import org.junit.Assert;
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.boot.test.context.SpringBootTest;
11 | import org.springframework.data.redis.core.StringRedisTemplate;
12 | import org.springframework.test.context.junit4.SpringRunner;
13 |
14 | import java.util.ArrayList;
15 | import java.util.List;
16 |
17 | /*
18 | * 此示例主要演示如何通过自动配置的StringRedisTemplate对象进行Redis的读写操作
19 | * 但它只支持String类型,对于Object可以采用JSON序列化和反序列化的方式
20 | */
21 | @RunWith(SpringRunner.class)
22 | @SpringBootTest
23 | public class RedisApplicationTest {
24 | private JSONObject json = new JSONObject();
25 | @Autowired
26 | private StringRedisTemplate stringRedisTemplate;
27 |
28 | @Test
29 | public void testSetAndGetString() throws Exception {
30 | stringRedisTemplate.opsForValue().set("testKey20180807", "testValue");
31 |
32 | Assert.assertEquals("testValue",
33 | stringRedisTemplate.opsForValue().get("testKey20180807"));
34 | }
35 |
36 | @Test
37 | public void testSetAndGetObject() throws Exception{
38 | User newUser = new User("Edison", 29);
39 | stringRedisTemplate.opsForValue().set(newUser.getUserName(),
40 | json.toJSONString(newUser));
41 |
42 | User redisUser = JSON.parseObject(stringRedisTemplate.opsForValue().get("Edison"),
43 | User.class);
44 | Assert.assertEquals(29, redisUser.getAge().longValue());
45 | }
46 |
47 | @Test
48 | public void testSetAndGetList() throws Exception{
49 | User newUser1 = new User("Edison", 29);
50 | User newUser2 = new User("Andy", 30);
51 | User newUser3 = new User("Leo", 27);
52 |
53 | List userList = new ArrayList<>();
54 | userList.add(newUser1);
55 | userList.add(newUser2);
56 | userList.add(newUser3);
57 |
58 | stringRedisTemplate.opsForValue().set("UserList", json.toJSONString(userList));
59 |
60 | List redisUserList = JSON.parseArray(stringRedisTemplate.opsForValue().get("UserList"),
61 | User.class);
62 | Assert.assertEquals(3, redisUserList.size());
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/msadv7/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv7/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv7/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv7/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv7/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv7
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv7
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 | org.springframework.boot
34 | spring-boot-starter-test
35 | test
36 |
37 |
38 |
39 | org.mybatis.spring.boot
40 | mybatis-spring-boot-starter
41 | 1.3.2
42 |
43 |
44 |
45 | mysql
46 | mysql-connector-java
47 | runtime
48 |
49 |
50 |
51 |
52 |
53 |
54 | org.springframework.boot
55 | spring-boot-maven-plugin
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/src/msadv7/src/main/java/com/manulife/msadv7/Msadv7Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv7;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Msadv7Application {
8 |
9 | /*
10 | * 此示例主要演示以下内容:
11 | * 1. 整合MyBatis
12 | * 2. MyBatis传参方式 => 使用@Param, Map 或 对象
13 | * 3. MyBatis增删改查单元测试示例
14 | * 4. 返回结果的绑定 => 使用@Results和@Result注解进行包装
15 | */
16 | public static void main(String[] args) {
17 | SpringApplication.run(Msadv7Application.class, args);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/msadv7/src/main/java/com/manulife/msadv7/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv7.domain;
2 |
3 | public class User {
4 | private Long id;
5 | private String name;
6 | private Integer age;
7 |
8 | public Long getId() {
9 | return id;
10 | }
11 |
12 | public void setId(Long id) {
13 | this.id = id;
14 | }
15 |
16 | public String getName() {
17 | return name;
18 | }
19 |
20 | public void setName(String name) {
21 | this.name = name;
22 | }
23 |
24 | public Integer getAge() {
25 | return age;
26 | }
27 |
28 | public void setAge(Integer age) {
29 | this.age = age;
30 | }
31 | }
32 |
33 |
--------------------------------------------------------------------------------
/src/msadv7/src/main/java/com/manulife/msadv7/domain/UserMapper.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv7.domain;
2 |
3 | import org.apache.ibatis.annotations.*;
4 |
5 | import java.util.List;
6 | import java.util.Map;
7 |
8 | @Mapper
9 | public interface UserMapper {
10 | /*
11 | * 方式一:使用@Param
12 | * 使用:@Param("xxxx") => #{xxx}
13 | */
14 | @Select("SELECT * FROM USER WHERE NAME = #{name}")
15 | User findByName(@Param("name") String name);
16 |
17 | @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
18 | int insert(@Param("name") String name, @Param("age") Integer age);
19 |
20 | /*
21 | * 方式二:使用@Map
22 | * 使用:Map
23 | */
24 | @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})")
25 | int insertByMap(Map map);
26 |
27 | /*
28 | * 方式三:使用对象
29 | * 使用:Map
30 | */
31 | @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
32 | int insertByUser(User user);
33 |
34 | @Update("UPDATE user SET age=#{age} WHERE name=#{name}")
35 | void update(User user);
36 |
37 | @Delete("DELETE FROM user WHERE id=#{id}")
38 | void delete(Long id);
39 |
40 | /*
41 | * 使用@Results和@Result注解绑定返回结果
42 | */
43 | @Results({
44 | @Result(property = "name", column = "name"),
45 | @Result(property = "age", column = "age")
46 | })
47 | @Select("SELECT name, age FROM user")
48 | List findAll();
49 | }
50 |
--------------------------------------------------------------------------------
/src/msadv7/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | # 注意这里的driver-class-name 不再是 com.mysql.cj.jdbc.Driver
10 | driver-class-name: com.mysql.jdbc.Driver
11 | jpa:
12 | properties:
13 | hibernate:
14 | hbm2ddl:
15 | # options: create, create-drop, update, validate
16 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
17 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
18 | auto: update
19 |
20 |
--------------------------------------------------------------------------------
/src/msadv7/src/test/java/com/manulife/msadv7/MyBatisApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv7;
2 |
3 | import com.manulife.msadv7.domain.User;
4 | import com.manulife.msadv7.domain.UserMapper;
5 | import org.junit.Assert;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.test.annotation.Rollback;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | import java.util.HashMap;
14 | import java.util.List;
15 | import java.util.Map;
16 |
17 | @RunWith(SpringRunner.class)
18 | @SpringBootTest
19 | public class MyBatisApplicationTests {
20 | @Autowired
21 | private UserMapper userMapper;
22 |
23 | @Test
24 | @Rollback
25 | public void testFindByName() throws Exception {
26 | userMapper.insert("ABCD", 29);
27 |
28 | User user = userMapper.findByName("ABCD");
29 | Assert.assertEquals(29, user.getAge().intValue());
30 | }
31 |
32 | @Test
33 | @Rollback
34 | public void testInsertByMap() throws Exception {
35 | Map map = new HashMap<>();
36 | map.put("name", "CCCC");
37 | map.put("age", 40);
38 |
39 | userMapper.insertByMap(map);
40 | User user = userMapper.findByName("CCCC");
41 | Assert.assertEquals(40, user.getAge().intValue());
42 | }
43 |
44 | @Test
45 | @Rollback
46 | public void testInsertByUser() throws Exception {
47 | User user = new User();
48 | user.setName("EDC");
49 | user.setAge(29);
50 |
51 | userMapper.insertByUser(user);
52 |
53 | Assert.assertEquals(29, userMapper.findByName("EDC").getAge().intValue());
54 | }
55 |
56 | @Test
57 | @Rollback
58 | public void testUpdate() throws Exception {
59 | User user = userMapper.findByName("EDC");
60 | user.setAge(30);
61 |
62 | userMapper.update(user);
63 |
64 | Assert.assertEquals(30, userMapper.findByName("EDC").getAge().intValue());
65 | }
66 |
67 | @Test
68 | @Rollback
69 | public void testDelete() throws Exception {
70 | User user = userMapper.findByName("EDC");
71 |
72 | userMapper.delete(user.getId());
73 |
74 | Assert.assertEquals(null, userMapper.findByName("EDC"));
75 | }
76 |
77 | @Test
78 | @Rollback
79 | public void testFindAll() throws Exception {
80 | List userList = userMapper.findAll();
81 |
82 | for (User user : userList){
83 | Assert.assertEquals(null, user.getId());
84 | Assert.assertNotEquals(null, user.getName());
85 | Assert.assertNotEquals(null, user.getAge());
86 | }
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/src/msadv8/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv8/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv8/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv8/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv8/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv8
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv8
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 | org.springframework.boot
34 | spring-boot-starter-test
35 | test
36 |
37 |
38 |
39 | org.springframework.boot
40 | spring-boot-starter-jdbc
41 |
42 |
43 |
44 | org.springframework.boot
45 | spring-boot-starter-data-jpa
46 |
47 |
48 |
49 | mysql
50 | mysql-connector-java
51 | 8.0.11
52 |
53 |
54 |
55 | org.flywaydb
56 | flyway-core
57 | 5.0.3
58 |
59 |
60 |
61 |
62 |
63 |
64 | org.springframework.boot
65 | spring-boot-maven-plugin
66 |
67 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/java/com/manulife/msadv8/Msadv8Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
5 | import org.springframework.boot.autoconfigure.SpringBootApplication;
6 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
7 |
8 | @SpringBootApplication
9 | public class Msadv8Application {
10 |
11 | /*
12 | * 此示例主要演示以下内容:
13 | * 1.Spring Boot中的事务管理(JPA @Transactional注解)
14 | * 2.使用Flyway管理数据库版本(请新建一个数据库来使用Flyway,否则会报错)
15 | * 3.使用LDAP统计管理用户信息
16 | */
17 | public static void main(String[] args) {
18 | SpringApplication.run(Msadv8Application.class, args);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/java/com/manulife/msadv8/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8.domain;
2 |
3 | import javax.persistence.Column;
4 | import javax.persistence.Entity;
5 | import javax.persistence.GeneratedValue;
6 | import javax.persistence.Id;
7 |
8 | @Entity
9 | public class User {
10 | @Id
11 | @GeneratedValue
12 | private Long id;
13 |
14 | @Column(nullable = false, length = 5)
15 | private String name;
16 |
17 | @Column(nullable = false)
18 | private Integer age;
19 |
20 | public Long getId() {
21 | return id;
22 | }
23 |
24 | public void setId(Long id) {
25 | this.id = id;
26 | }
27 |
28 | public String getName() {
29 | return name;
30 | }
31 |
32 | public void setName(String name) {
33 | this.name = name;
34 | }
35 |
36 | public Integer getAge() {
37 | return age;
38 | }
39 |
40 | public void setAge(Integer age) {
41 | this.age = age;
42 | }
43 |
44 | public User() {
45 | }
46 |
47 | public User(String name, Integer age) {
48 | this.name = name;
49 | this.age = age;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/java/com/manulife/msadv8/domain/UserRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8.domain;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 | import org.springframework.data.jpa.repository.Query;
5 | import org.springframework.data.repository.query.Param;
6 |
7 | public interface UserRepository extends JpaRepository {
8 | // spring-data-jpa可以通过解析方法名创建查询
9 | User findByName(String name);
10 |
11 | User findByNameAndAge(String name, Integer age);
12 |
13 | @Query("from User u where u.name = :name")
14 | User findUser(@Param("name") String name);
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/java/com/manulife/msadv8/service/ClientService.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8.service;
2 |
3 | import com.manulife.msadv8.domain.User;
4 | import javax.transaction.Transactional;
5 |
6 | /*
7 | * 通常单元测试为了保证每个测试之间的数据独立,会使用@Rollback注解让每个单元测试都能在结束时回滚。
8 | * 而真正在开发业务逻辑时,通常在service层接口中使用@Transactional来对各个业务逻辑进行事务管理的配置
9 | */
10 | public interface ClientService {
11 | @Transactional
12 | User login(String name, String password);
13 |
14 | // 指定不同的事务管理器
15 | // @Transactional(value = "transactionManagerPrimary")
16 | // User findUserByName(String name);
17 | }
18 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/java/com/manulife/msadv8/service/UserService.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8.service;
2 |
3 | public interface UserService {
4 | // 01.新增一个用户
5 | void create(String name, Integer age);
6 | // 02.根据name删除一个用户
7 | void deleteByName(String name);
8 | // 03.获取用户量
9 | Integer getAllUsers();
10 | // 04.删除所有用户
11 | void deleteAllUsers();
12 | }
13 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/java/com/manulife/msadv8/service/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8.service;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.jdbc.core.JdbcTemplate;
5 | import org.springframework.stereotype.Service;
6 |
7 | @Service
8 | public class UserServiceImpl implements UserService {
9 | @Autowired
10 | private JdbcTemplate jdbcTemplate;
11 |
12 | @Override
13 | public void create(String name, Integer age) {
14 | jdbcTemplate.update("insert into USER(NAME, AGE) values(?,?)", name, age);
15 | }
16 |
17 | @Override
18 | public void deleteByName(String name) {
19 | jdbcTemplate.update("delete from USER where NAME = ?", name);
20 | }
21 |
22 | @Override
23 | public Integer getAllUsers() {
24 | return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);
25 | }
26 |
27 | @Override
28 | public void deleteAllUsers() {
29 | jdbcTemplate.update("delete from USER");
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_flyway
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | hbm2ddl:
14 | # options: create, create-drop, update, validate
15 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
16 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
17 | auto: update
18 | redis:
19 | database: 0
20 | host: 10.248.37.3
21 | port: 6379
22 |
23 | flyway:
24 | # 配置Flyway要加载的SQL脚本位置
25 | locations: classpath:/db
26 |
--------------------------------------------------------------------------------
/src/msadv8/src/main/resources/db/V1.0__BaseVersion.sql:
--------------------------------------------------------------------------------
1 | DROP TABLE IF EXISTS user ;
2 | CREATE TABLE `user` (
3 | `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
4 | `name` varchar(20) NOT NULL COMMENT '姓名',
5 | `age` int(5) DEFAULT NULL COMMENT '年龄',
6 | PRIMARY KEY (`id`)
7 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
--------------------------------------------------------------------------------
/src/msadv8/src/test/java/com/manulife/msadv8/UserRepositoryTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8;
2 |
3 | import com.manulife.msadv8.domain.User;
4 | import com.manulife.msadv8.domain.UserRepository;
5 | import org.junit.Assert;
6 | import org.junit.Before;
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.boot.test.context.SpringBootTest;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | import javax.transaction.Transactional;
14 |
15 | @RunWith(SpringRunner.class)
16 | @SpringBootTest
17 | public class UserRepositoryTest {
18 | @Autowired
19 | private UserRepository userRepository;
20 |
21 | @Test
22 | @Transactional
23 | public void testAddNewRecords() {
24 | // 01.创建10条记录
25 | userRepository.save(new User("AAA",10));
26 | userRepository.save(new User("BBB",20));
27 | userRepository.save(new User("CCC",30));
28 | userRepository.save(new User("DDD",40));
29 | userRepository.save(new User("EEE",50));
30 | userRepository.save(new User("FFF",60));
31 | userRepository.save(new User("GGG",70));
32 | userRepository.save(new User("HHHHHHHHHH",80)); // 测试length>5
33 | userRepository.save(new User("III",90));
34 | userRepository.save(new User("JJJ",100));
35 |
36 | // 02.测试findAll
37 | Assert.assertEquals(10, userRepository.findAll().size());
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/src/msadv8/src/test/java/com/manulife/msadv8/UserServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv8;
2 |
3 | import com.manulife.msadv8.service.UserService;
4 | import org.junit.Assert;
5 | import org.junit.Before;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.test.context.junit4.SpringRunner;
11 |
12 | /*
13 | * 此单元测试主要用于演示Flyway的介入使用:
14 | * 1.第一次运行测试,Flyway检测到需要运行版本脚本来初始化数据库
15 | * 因此执行了(resources/db/V1.0__BaseVersion.sql)从而创建了user表
16 | * 2.第二次运行测试,Flyway检测到初始化脚本已经执行过就不再执行脚本了
17 | * 3.第三次运行之前,更改脚本中name字段的长度从20到25,运行时会报以下错误:
18 | * Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration version 1.0
19 | -> Applied to database : -338184704
20 | -> Resolved locally : 1332515276
21 | * 这是因为初始化脚本的改动导致Flyway校验失败,认为当前的脚本与上一次执行的内容不同
22 | * 所以提示报错并终止程序,以免造成更严重的数据结构破坏
23 | */
24 | @RunWith(SpringRunner.class)
25 | @SpringBootTest
26 | public class UserServiceTest {
27 |
28 | @Autowired
29 | private UserService userSerivce;
30 |
31 | @Before
32 | public void setUp(){
33 | // 准备工作:清空user表
34 | userSerivce.deleteAllUsers();
35 | }
36 |
37 | @Test
38 | public void test() throws Exception{
39 | // 01.插入5个用户
40 | userSerivce.create("aaa",1);
41 | userSerivce.create("bbb", 2);
42 | userSerivce.create("ccc",3);
43 | userSerivce.create("ddd",4);
44 | userSerivce.create("eee", 5);
45 |
46 | // 02.查数据库,这时应该有5个用户
47 | Assert.assertEquals(5, userSerivce.getAllUsers().intValue());
48 |
49 | // 03.删除两个用户
50 | userSerivce.deleteByName("aaa");
51 | userSerivce.deleteByName("ddd");
52 |
53 | // 04.查数据库,这时应该有3个用户
54 | Assert.assertEquals(3, userSerivce.getAllUsers().intValue());
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/msadv9/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/msadv9/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EdisonTalk/EDT.SpringBoot.Samples/6bb8721485128a9b8e668c18f1d04b449e1e3ab3/src/msadv9/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/src/msadv9/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
2 |
--------------------------------------------------------------------------------
/src/msadv9/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.manulife
7 | msadv9
8 | 0.0.1-SNAPSHOT
9 | jar
10 |
11 | msadv9
12 | Demo project for Spring Boot
13 |
14 |
15 | org.springframework.boot
16 | spring-boot-starter-parent
17 | 1.5.15.RELEASE
18 |
19 |
20 |
21 |
22 | UTF-8
23 | UTF-8
24 | 1.8
25 |
26 |
27 |
28 |
29 | org.springframework.boot
30 | spring-boot-starter-web
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-starter-test
36 | test
37 |
38 |
39 |
40 |
41 | org.springframework.boot
42 | spring-boot-starter-data-jpa
43 |
44 |
45 |
46 | mysql
47 | mysql-connector-java
48 | 8.0.11
49 |
50 |
51 |
52 | org.springframework.boot
53 | spring-boot-starter-cache
54 |
55 |
56 |
57 | net.sf.ehcache
58 | ehcache
59 |
60 |
61 |
62 |
63 |
64 |
65 | org.springframework.boot
66 | spring-boot-maven-plugin
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/src/msadv9/src/main/java/com/manulife/msadv9/Msadv9Application.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv9;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.cache.annotation.EnableCaching;
6 |
7 | @SpringBootApplication
8 | @EnableCaching // => 开启缓存功能,Spring Boot会根据以下顺序去侦测Cache Provider
9 | /*
10 | * Generic, JCache, EhCache, Hazelcast
11 | * Redis, Guava, Simple
12 | * 除了顺序侦测之外,还可以通过配置属性spring.cache.type来强制指定
13 | */
14 | public class Msadv9Application {
15 |
16 | /*
17 | * 此示例主要演示以下内容:
18 | * 1.缓存支持(1.1):注解配置
19 | * 2.缓存支持(1.2):EhCache使用
20 | */
21 | public static void main(String[] args) {
22 | SpringApplication.run(Msadv9Application.class, args);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/msadv9/src/main/java/com/manulife/msadv9/domain/User.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv9.domain;
2 |
3 | import javax.persistence.Column;
4 | import javax.persistence.Entity;
5 | import javax.persistence.GeneratedValue;
6 | import javax.persistence.Id;
7 |
8 | @Entity
9 | public class User {
10 | @Id
11 | @GeneratedValue
12 | private Long id;
13 |
14 | @Column(nullable = false)
15 | private String name;
16 |
17 | @Column(nullable = false)
18 | private Integer age;
19 |
20 | public Long getId() {
21 | return id;
22 | }
23 |
24 | public void setId(Long id) {
25 | this.id = id;
26 | }
27 |
28 | public String getName() {
29 | return name;
30 | }
31 |
32 | public void setName(String name) {
33 | this.name = name;
34 | }
35 |
36 | public Integer getAge() {
37 | return age;
38 | }
39 |
40 | public void setAge(Integer age) {
41 | this.age = age;
42 | }
43 |
44 | public User() {
45 | }
46 |
47 | public User(String name, Integer age) {
48 | this.name = name;
49 | this.age = age;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/msadv9/src/main/java/com/manulife/msadv9/domain/UserCacheRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv9.domain;
2 |
3 | import org.springframework.cache.annotation.CacheConfig;
4 | import org.springframework.cache.annotation.Cacheable;
5 | import org.springframework.data.jpa.repository.JpaRepository;
6 |
7 | /*
8 | * 使用了Cache注解的Repository
9 | * CacheConfig注解 : 主要用于配置该类中会用到的一些共用的缓存配置
10 | * Cacheable注解:配置了findByName函数的返回值将被加入缓存
11 | * 在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问
12 | */
13 | @CacheConfig(cacheNames = "users")
14 | public interface UserCacheRepository extends JpaRepository {
15 | @Cacheable
16 | //下面的参数表示:
17 | // 只有当第一个参数的长度小于3时,才会被缓存 => 这样“AAA”就不会被缓存
18 | //@Cacheable(key = "#p0", condition = "#p0.length() < 3")
19 | User findByName(String name);
20 | }
21 |
--------------------------------------------------------------------------------
/src/msadv9/src/main/java/com/manulife/msadv9/domain/UserRepository.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv9.domain;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 | import org.springframework.data.jpa.repository.Query;
5 | import org.springframework.data.repository.query.Param;
6 |
7 | public interface UserRepository extends JpaRepository {
8 | // spring-data-jpa可以通过解析方法名创建查询
9 | User findByName(String name);
10 |
11 | User findByNameAndAge(String name, Integer age);
12 |
13 | @Query("from User u where u.name = :name")
14 | User findUser(@Param("name") String name);
15 | }
16 |
--------------------------------------------------------------------------------
/src/msadv9/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 | spring:
5 | datasource:
6 | url: jdbc:mysql://10.248.37.3:3307/test_primary
7 | username: root
8 | password: 123qwe
9 | driver-class-name: com.mysql.cj.jdbc.Driver
10 | jpa:
11 | properties:
12 | hibernate:
13 | show_sql: true
14 | hbm2ddl:
15 | # options: create, create-drop, update, validate
16 | # create-drop: 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭表就自动删除
17 | # update: 最常用的属性,第一次加载hibernate时根据model类会自动建立表结构,以后加载时hibernate根据model类自动更新表结构
18 | auto: update
19 | redis:
20 | database: 0
21 | host: 10.248.37.3
22 | port: 6379
23 |
24 |
--------------------------------------------------------------------------------
/src/msadv9/src/main/resources/ehcache.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/msadv9/src/test/java/com/manulife/msadv9/UserCacheRepositoryTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv9;
2 |
3 | import com.manulife.msadv9.domain.User;
4 | import com.manulife.msadv9.domain.UserCacheRepository;
5 | import org.junit.Before;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.cache.CacheManager;
11 | import org.springframework.test.context.junit4.SpringRunner;
12 |
13 | @RunWith(SpringRunner.class)
14 | @SpringBootTest
15 | public class UserCacheRepositoryTest {
16 | @Autowired
17 | private UserCacheRepository userRepository;
18 |
19 | @Autowired
20 | private CacheManager cacheManager;
21 |
22 | @Before
23 | public void setUp(){
24 | userRepository.deleteAllInBatch();
25 | userRepository.save(new User("AAA", 10));
26 | }
27 |
28 | /*
29 | * 调用第二次findByName函数时,没有再执行select语句,也就直接减少了一次数据库的读取操作
30 | * Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
31 | 1st Query : 10
32 | 2nd Query : 10
33 | */
34 | @Test
35 | public void testFindByName() throws Exception {
36 | User u1 = userRepository.findByName("AAA");
37 | System.out.println("1st Query : " + u1.getAge());
38 |
39 | User u2 = userRepository.findByName("AAA");
40 | System.out.println("2nd Query : " + u2.getAge());
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/msadv9/src/test/java/com/manulife/msadv9/UserRepositoryTest.java:
--------------------------------------------------------------------------------
1 | package com.manulife.msadv9;
2 |
3 | import com.manulife.msadv9.domain.User;
4 | import com.manulife.msadv9.domain.UserRepository;
5 | import org.junit.Before;
6 | import org.junit.Test;
7 | import org.junit.runner.RunWith;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.boot.test.context.SpringBootTest;
10 | import org.springframework.test.context.junit4.SpringRunner;
11 |
12 | @RunWith(SpringRunner.class)
13 | @SpringBootTest
14 | public class UserRepositoryTest {
15 | @Autowired
16 | private UserRepository userRepository;
17 |
18 | @Before
19 | public void setUp(){
20 | userRepository.save(new User("AAA", 10));
21 | }
22 |
23 | @Test
24 | public void testFindByName() throws Exception{
25 | User u1 = userRepository.findByName("AAA");
26 | System.out.println("1st Query : " + u1.getAge());
27 |
28 | User u2 = userRepository.findByName("AAA");
29 | System.out.println("2nd Query : " + u2.getAge());
30 | }
31 | }
32 |
--------------------------------------------------------------------------------