├── .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 | [![N|SpringBoot](https://upload-images.jianshu.io/upload_images/7896890-9323041dd0ce883e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](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 | [![N|Intellij Idea](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1533644040260&di=f5ef1cf27c43f744cc8fbac384bfd0e9&imgtype=0&src=http%3A%2F%2Fimage.bubuko.com%2Finfo%2F201808%2F20180801214347937731.png)](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 |
16 |
17 |
18 |
19 |
20 | 21 | -------------------------------------------------------------------------------- /src/msadv4/src/main/resources/templates/logout.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | Hello World! 6 | 7 | 8 |

Hello [[${#httpServletRequest.remoteUser}]]!

9 |
10 | 11 |
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 | --------------------------------------------------------------------------------