Full Code of yudaocode/SpringBoot-Labs for AI

master 6c12efaed06d cached
3513 files
3.4 MB
1.2M tokens
6618 symbols
1 requests
Download .txt
Showing preview only (4,732K chars total). Download the full file or copy to clipboard to get everything.
Repository: yudaocode/SpringBoot-Labs
Branch: master
Commit: 6c12efaed06d
Files: 3513
Total size: 3.4 MB

Directory structure:
gitextract_g84ntzib/

├── .gitignore
├── README.md
├── httpRequests/
│   ├── 2020-12-20T004250.200.json
│   ├── 2020-12-20T004328.500.json
│   ├── 2020-12-20T004337.200.json
│   ├── 2020-12-20T004347.200.json
│   ├── 2020-12-20T004347.500.json
│   ├── 2020-12-20T004358.200.json
│   ├── 2020-12-20T004358.500.json
│   ├── 2020-12-20T004401.200.json
│   ├── 2020-12-20T004401.500.json
│   ├── 2020-12-20T004538.200.json
│   ├── 2020-12-20T004547.500.json
│   ├── 2020-12-20T004638.500.json
│   ├── 2020-12-20T004645.500.json
│   ├── 2020-12-20T004809.200.json
│   ├── 2020-12-20T004813.500.json
│   ├── 2020-12-20T010724.200.json
│   ├── 2020-12-20T010738.200.json
│   ├── 2020-12-20T010809.200.json
│   ├── 2020-12-20T010823.500.json
│   ├── 2020-12-20T010840.200.json
│   ├── 2020-12-20T011020.500.json
│   ├── 2020-12-20T011347.500.json
│   ├── 2020-12-20T011526.200.json
│   ├── 2020-12-20T011530.200.json
│   ├── 2020-12-20T011541.400.json
│   ├── 2020-12-20T011551.500.json
│   ├── 2020-12-20T011556.200.json
│   ├── 2020-12-20T011628-1.200.json
│   ├── 2020-12-20T011628.200.json
│   ├── 2020-12-20T011646.200.json
│   ├── 2020-12-20T011650.200.json
│   ├── 2020-12-20T011653.500.json
│   ├── 2020-12-20T011818.200.json
│   ├── 2020-12-20T011843.200.json
│   ├── 2020-12-20T011847.500.json
│   ├── 2020-12-20T012507.200.json
│   ├── 2020-12-20T012510.200.json
│   ├── 2020-12-20T012527.200.json
│   ├── 2020-12-20T012540.400.json
│   ├── 2020-12-20T012544.200.json
│   ├── 2020-12-20T012703.500.json
│   ├── 2020-12-20T012708.200.json
│   ├── 2020-12-20T012710.200.json
│   ├── 2020-12-20T013544.200.json
│   ├── 2020-12-20T013552.200.json
│   ├── 2020-12-20T013558.500.json
│   ├── 2020-12-20T013845.200.json
│   ├── 2020-12-20T014019.200.json
│   ├── 2020-12-20T021415.200.json
│   ├── http-client.cookies
│   └── http-requests-log.http
├── lab-01-spring-security/
│   ├── lab-01-springsecurity-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab01/
│   │           │                   └── springsecurity/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── AdminController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-01-springsecurity-demo-role/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab01/
│   │                               └── springsecurity/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── SecurityConfig.java
│   │                                   └── controller/
│   │                                       ├── DemoController.java
│   │                                       └── TestController.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 安全框架 Spring Security 入门》.md
├── lab-02-spring-security-oauth/
│   ├── authorization-code-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── labs/
│   │           │                   └── lab01/
│   │           │                       ├── Application.java
│   │           │                       ├── authorization/
│   │           │                       │   └── OAuth2AuthorizationServer.java
│   │           │                       └── resource/
│   │           │                           ├── OAuth2ResourceServer.java
│   │           │                           └── api/
│   │           │                               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── client-credentials-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── lab01/
│   │                   ├── Application.java
│   │                   ├── authorization/
│   │                   │   └── OAuth2AuthorizationServer.java
│   │                   └── resource/
│   │                       ├── OAuth2ResourceServer.java
│   │                       └── api/
│   │                           └── ExampleController.java
│   ├── implicit-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab01/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── pom.xml
│   ├── resource-owner-password-credentials-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab01/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── resource-owner-password-credentials-server-by-jdbc-token-store/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab02/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               ├── application.properties
│   │               ├── data.sql
│   │               └── schema.sql
│   ├── resource-owner-password-credentials-server-with-refresh-token/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab01/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── resource-owner-password-credentials-server-with-revoke-token/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab2/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   ├── OAuth2AuthorizationServer.java
│   │           │       │   └── token/
│   │           │       │       └── TokenController.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── 《芋道 Spring Security OAuth2 入门(新)》.md
│   └── 《芋道 Spring Security OAuth2 入门(老)》.md
├── lab-03-kafka/
│   ├── lab-03-kafka-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── KafkaConfiguration.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo01AConsumer.java
│   │       │   │                       │   ├── Demo01Consumer.java
│   │       │   │                       │   └── Demo04Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── Demo01Message.java
│   │       │   │                       │   └── Demo04Message.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── Demo01Producer.java
│   │       │   │                           └── Demo04Producer.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── application_bak.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── Demo01ProducerTest.java
│   │                                       └── Demo04ProducerTest.java
│   ├── lab-03-kafka-demo-ack/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo08Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo08Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo08Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo08ProducerTest.java
│   ├── lab-03-kafka-demo-batch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo02Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo02Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo02Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo02ProducerTest.java
│   ├── lab-03-kafka-demo-batch-consume/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo02Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo02Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo02Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo02ProducerTest.java
│   ├── lab-03-kafka-demo-broadcast/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo05Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-03-kafka-demo-concurrency/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo06Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo06Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo06Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo06ProducerTest.java
│   ├── lab-03-kafka-demo-transaction/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo07Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo07Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo07Producer.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── application_bak.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo07ProducerTest.java
│   ├── lab-03-kafka-native/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── ConsumerMain.java
│   │                                   └── ProducerMain.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 Kafka 入门》.md
├── lab-04-rabbitmq/
│   ├── lab-04-rabbitmq-consume-retry/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo07Consumer.java
│   │       │   │                       │   └── Demo07DeadConsumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo07Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo07Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo07ProducerTest.java
│   ├── lab-04-rabbitmq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo01Consumer.java
│   │       │   │                       │   ├── Demo02Consumer.java
│   │       │   │                       │   ├── Demo03ConsumerA.java
│   │       │   │                       │   ├── Demo03ConsumerB.java
│   │       │   │                       │   └── Demo04Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── Demo01Message.java
│   │       │   │                       │   ├── Demo02Message.java
│   │       │   │                       │   ├── Demo03Message.java
│   │       │   │                       │   └── Demo04Message.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── Demo01Producer.java
│   │       │   │                           ├── Demo02Producer.java
│   │       │   │                           ├── Demo03Producer.java
│   │       │   │                           └── Demo04Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── Demo01ProducerTest.java
│   │                                       ├── Demo02ProducerTest.java
│   │                                       ├── Demo03ProducerTest.java
│   │                                       └── Demo04ProducerTest.java
│   ├── lab-04-rabbitmq-demo-ack/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo12Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo12Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo12Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo12ProducerTest.java
│   ├── lab-04-rabbitmq-demo-batch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo05Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-04-rabbitmq-demo-batch-consume/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo06Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-04-rabbitmq-demo-batch-consume-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo06Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo06Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo06Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo06ProducerTest.java
│   ├── lab-04-rabbitmq-demo-concurrency/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo09Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo09Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo09Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo09ProducerTest.java
│   ├── lab-04-rabbitmq-demo-confirm/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo13Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo13Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo13Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo13ProducerTest.java
│   ├── lab-04-rabbitmq-demo-confirm-async/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo13Consumer.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── RabbitProducerConfirmCallback.java
│   │       │   │                       │   └── RabbitProducerReturnCallback.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo13Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo13Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo13ProducerTest.java
│   ├── lab-04-rabbitmq-demo-delay/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo08Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo08Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo08Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo08ProducerTest.java
│   ├── lab-04-rabbitmq-demo-error-handler/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo16Consumer.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── RabbitListenerErrorHandlerImpl.java
│   │       │   │                       │   └── RabbitLoggingErrorHandler.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo16Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo16Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo16ProducerTest.java
│   ├── lab-04-rabbitmq-demo-json/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo15Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo15Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo15Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo15ProducerTest.java
│   ├── lab-04-rabbitmq-demo-message-model/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── BroadcastConsumer.java
│   │       │   │                       │   └── ClusteringConsumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── BroadcastMessage.java
│   │       │   │                       │   └── ClusteringMessage.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── BroadcastProducer.java
│   │       │   │                           └── ClusteringProducer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── BroadcastProducerTest.java
│   │                                       └── ClusteringProducerTest.java
│   ├── lab-04-rabbitmq-demo-orderly/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo10Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo10Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo10Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo10ProducerTest.java
│   ├── lab-04-rabbitmq-demo-rpc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo14Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo14Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo14Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo14ProducerTest.java
│   ├── lab-04-rabbitmq-demo-transaction/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo11Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo11Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo11Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo11ProducerTest.java
│   ├── lab-04-rabbitmq-native/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── RabbitMQConsumer.java
│   │                                   └── RabbitMQProducer.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md
├── lab-05-benchmark-tomcat-jetty-undertow/
│   ├── lab-05-jetty/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── tomcat/
│   │                                       ├── Controller.java
│   │                                       └── JettyApplication.java
│   ├── lab-05-tomcat/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── tomcat/
│   │                                       ├── Controller.java
│   │                                       └── TomcatApplication.java
│   ├── lab-05-tomcat-apr/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── tomcat/
│   │                                       ├── Controller.java
│   │                                       └── TomcatAprApplication.java
│   ├── lab-05-undertow/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── undertow/
│   │                                       ├── Controller.java
│   │                                       └── UndertowApplication.java
│   ├── pom.xml
│   └── 《性能测试 —— Tomcat、Jetty、Undertow 基准测试》.md
├── lab-06/
│   ├── lab-06-springmvc-tomcat/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab06/
│   │                                   └── springmvc/
│   │                                       ├── Controller.java
│   │                                       └── SpringMVCApplication.java
│   ├── lab-06-webflux-netty/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab06/
│   │                                   └── webflux/
│   │                                       ├── Controller.java
│   │                                       └── WebfluxNettyApplication.java
│   ├── lab-06-webflux-tomcat/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab06/
│   │                                   └── webflux/
│   │                                       ├── Controller.java
│   │                                       └── WebfluxTomcatApplication.java
│   ├── pom.xml
│   └── 《性能测试 —— SpringMVC、Webflux 基准测试》.md
├── lab-07/
│   ├── lab-07-spring-cloud-gateway/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── labs/
│   │           │                   └── lab07/
│   │           │                       └── springcloudgateway/
│   │           │                           └── SpringCloudGatewayApplication.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-07-zuul/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── labs/
│   │           │                   └── lab07/
│   │           │                       └── zuul/
│   │           │                           └── ZuulApplication.java
│   │           └── resources/
│   │               └── application.yml
│   ├── pom.xml
│   └── 《性能测试 —— Spring Cloud Gateway、Zuul 基准测试》.md
├── lab-11-spring-data-redis/
│   ├── lab-07-spring-data-redis-unit-test/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── labs/
│   │       │   │                   └── lab10/
│   │       │   │                       └── springdatarediswithjedis/
│   │       │   │                           ├── Application.java
│   │       │   │                           ├── config/
│   │       │   │                           │   └── RedisConfiguration.java
│   │       │   │                           └── util/
│   │       │   │                               └── JSONUtil.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       └── redisson.yml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab10/
│   │                                   └── springdatarediswithjedis/
│   │                                       ├── Test01.java
│   │                                       └── config/
│   │                                           └── TestRedisConfiguration.java
│   ├── lab-07-spring-data-redis-with-jedis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── labs/
│   │       │   │                   └── lab10/
│   │       │   │                       └── springdatarediswithjedis/
│   │       │   │                           ├── Application.java
│   │       │   │                           ├── cacheobject/
│   │       │   │                           │   ├── ProductCacheObject.java
│   │       │   │                           │   └── UserCacheObject.java
│   │       │   │                           ├── config/
│   │       │   │                           │   └── RedisConfiguration.java
│   │       │   │                           ├── dao/
│   │       │   │                           │   ├── package-info.java
│   │       │   │                           │   └── redis/
│   │       │   │                           │       └── UserCacheDao.java
│   │       │   │                           ├── listener/
│   │       │   │                           │   ├── TestChannelTopicMessageListener.java
│   │       │   │                           │   └── TestPatternTopicMessageListener.java
│   │       │   │                           ├── service/
│   │       │   │                           │   ├── UserService01.java
│   │       │   │                           │   └── UserService02.java
│   │       │   │                           └── util/
│   │       │   │                               └── JSONUtil.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       └── lua/
│   │       │           ├── compareAndSet.lua
│   │       │           ├── compareAndSet2.lua
│   │       │           └── test.lua
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab10/
│   │                                   └── springdatarediswithjedis/
│   │                                       ├── PipelineTest.java
│   │                                       ├── PubSubTest.java
│   │                                       ├── ScriptTest.java
│   │                                       ├── SessionTest.java
│   │                                       ├── Test01.java
│   │                                       ├── TransactionTest.java
│   │                                       ├── UserService02Test.java
│   │                                       └── package-info.java
│   ├── lab-07-spring-data-redis-with-redisson/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── labs/
│   │       │   │                   └── lab10/
│   │       │   │                       └── springdatarediswithjedis/
│   │       │   │                           ├── Application.java
│   │       │   │                           ├── cacheobject/
│   │       │   │                           │   ├── ProductCacheObject.java
│   │       │   │                           │   └── UserCacheObject.java
│   │       │   │                           ├── config/
│   │       │   │                           │   └── RedisConfiguration.java
│   │       │   │                           ├── dao/
│   │       │   │                           │   ├── package-info.java
│   │       │   │                           │   └── redis/
│   │       │   │                           │       └── UserCacheDao.java
│   │       │   │                           ├── listener/
│   │       │   │                           │   ├── TestChannelTopicMessageListener.java
│   │       │   │                           │   └── TestPatternTopicMessageListener.java
│   │       │   │                           ├── service/
│   │       │   │                           │   ├── UserService01.java
│   │       │   │                           │   └── UserService02.java
│   │       │   │                           └── util/
│   │       │   │                               └── JSONUtil.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       ├── lua/
│   │       │       │   ├── compareAndSet.lua
│   │       │       │   ├── compareAndSet2.lua
│   │       │       │   └── test.lua
│   │       │       └── redisson.yml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab10/
│   │                                   └── springdatarediswithjedis/
│   │                                       ├── LockTest.java
│   │                                       ├── PipelineTest.java
│   │                                       ├── PubSubTest.java
│   │                                       ├── RateLimiterTest.java
│   │                                       ├── ScriptTest.java
│   │                                       ├── SessionTest.java
│   │                                       ├── Test01.java
│   │                                       ├── TransactionTest.java
│   │                                       ├── UserService02Test.java
│   │                                       └── package-info.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot Redis 入门》.md
├── lab-12-mybatis/
│   ├── lab-12-mybatis-annotation/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── lab-12-mybatis-plus/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── lab-12-mybatis-plus-tenant/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── AsyncConfig.java
│   │       │   │                       │   └── MybatisPlusConfig.java
│   │       │   │                       ├── context/
│   │       │   │                       │   └── TenantHolder.java
│   │       │   │                       ├── core/
│   │       │   │                       │   └── TtlThreadPoolTaskExecutor.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── UserDO.java
│   │       │   │                       │   └── UserProfileDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── UserMapper.java
│   │       │   │                       │   └── UserProfileMapper.java
│   │       │   │                       ├── service/
│   │       │   │                       │   └── UserService.java
│   │       │   │                       ├── util/
│   │       │   │                       │   └── TtlExecutorsUtil.java
│   │       │   │                       └── vo/
│   │       │   │                           └── UserDetailVO.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   ├── mapper/
│   │                                   │   └── UserMapperTest.java
│   │                                   └── service/
│   │                                       └── UserServiceTest.java
│   ├── lab-12-mybatis-tk/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── util/
│   │       │   │                           └── BaseMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── lab-12-mybatis-xml/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot MyBatis 入门》.md
├── lab-13-spring-data-jpa/
│   ├── lab-13-jpa/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab13/
│   │       │   │                   └── jpa/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── repository/
│   │       │   │                           ├── UserRepository01.java
│   │       │   │                           ├── UserRepository02.java
│   │       │   │                           ├── UserRepository03.java
│   │       │   │                           └── UserRepository04.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab13/
│   │                               └── jpa/
│   │                                   └── repository/
│   │                                       ├── UserRepository01Test.java
│   │                                       ├── UserRepository02Test.java
│   │                                       ├── UserRepository03Test.java
│   │                                       └── UserRepository04Test.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot JPA 入门》.md
├── lab-14-spring-jdbc-template/
│   ├── lab-14-jdbctemplate/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab14/
│   │       │   │                   └── jdbctemplate/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       └── dataobject/
│   │       │   │                           └── UserDO.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab14/
│   │                               └── jdbctemplate/
│   │                                   └── dao/
│   │                                       └── UserDaoTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot JdbcTemplate 入门》.md
├── lab-15-spring-data-es/
│   ├── lab-15-spring-data-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab15/
│   │       │   │                   └── springdataelasticsearch/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── bo/
│   │       │   │                       │   └── ProductConditionBO.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── FieldAnalyzer.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── ESProductDO.java
│   │       │   │                       └── repository/
│   │       │   │                           └── ProductRepository.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab15/
│   │                               └── springdataelasticsearch/
│   │                                   └── repository/
│   │                                       ├── ProductRepository04Test.java
│   │                                       └── ProductRepositoryTest.java
│   ├── lab-15-spring-data-jest/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab15/
│   │       │   │                   └── springdatajest/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── FieldAnalyzer.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── ESProductDO.java
│   │       │   │                       └── repository/
│   │       │   │                           ├── ProductRepository.java
│   │       │   │                           ├── ProductRepository02.java
│   │       │   │                           └── ProductRepository03.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab15/
│   │                               └── springdatajest/
│   │                                   └── repository/
│   │                                       ├── ProductRepository02Test.java
│   │                                       ├── ProductRepository03Test.java
│   │                                       └── ProductRepositoryTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot Elasticsearch 入门》.md
├── lab-16-spring-data-mongo/
│   ├── lab-16-spring-data-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab16/
│   │       │   │                   └── springdatamongodb/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── MongoDBConfig.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── ProductDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mongo/
│   │       │   │                       │   ├── IncIdEntity.java
│   │       │   │                       │   └── MongoInsertEventListener.java
│   │       │   │                       └── repository/
│   │       │   │                           ├── ProductRepository.java
│   │       │   │                           ├── UserRepository.java
│   │       │   │                           ├── UserRepository02.java
│   │       │   │                           └── UserRepository03.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab16/
│   │                               └── springdatamongodb/
│   │                                   ├── dao/
│   │                                   │   └── UserDaoTest.java
│   │                                   └── repository/
│   │                                       ├── ProductRepositoryTest.java
│   │                                       ├── UserRepository02Test.java
│   │                                       ├── UserRepository03Test.java
│   │                                       └── UserRepositoryTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot MongoDB 入门》.md
├── lab-17/
│   ├── lab-17-dynamic-datasource-baomidou-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── OrderMapper.java
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── OrderMapper.xml
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── mapper/
│   │                                   │   ├── OrderMapperTest.java
│   │                                   │   └── UserMapperTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-baomidou-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── OrderMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── OrderMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── dynamicdatasource/
│   │                   ├── mapper/
│   │                   │   └── OrderMapperTest.java
│   │                   └── service/
│   │                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-jdbctemplate/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── JdbcTemplateOrdersConfig.java
│   │       │   │                       │   └── JdbcTemplateUsersConfig.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   ├── OrderDao.java
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── dao/
│   │                                   │   ├── OrderDaoTest.java
│   │                                   │   └── UserDaoTest.java
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-mybatis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── MyBatisOrdersConfig.java
│   │       │   │                       │   └── MyBatisUsersConfig.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── orders/
│   │       │   │                       │   │   └── OrderMapper.java
│   │       │   │                       │   └── users/
│   │       │   │                       │       └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── orders/
│   │       │       │   │   └── OrderMapper.xml
│   │       │       │   └── users/
│   │       │       │       └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── mapper/
│   │                                   │   ├── orders/
│   │                                   │   │   └── OrderMapperTest.java
│   │                                   │   └── users/
│   │                                   │       └── UserMapperTest.java
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-sharding-jdbc-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── OrderMapper.java
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── OrderMapper.xml
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── dynamicdatasource/
│   │                   ├── mapper/
│   │                   │   ├── OrderMapperTest.java
│   │                   │   └── UserMapperTest.java
│   │                   └── service/
│   │                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-sharding-jdbc-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── OrderMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── OrderMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── mapper/
│   │                                   │   └── OrderMapperTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-springdatajpa/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── HibernateConfig.java
│   │       │   │                       │   ├── JpaOrdersConfig.java
│   │       │   │                       │   └── JpaUsersConfig.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── repository/
│   │       │   │                       │   ├── orders/
│   │       │   │                       │   │   └── OrderRepository.java
│   │       │   │                       │   └── users/
│   │       │   │                       │       └── UserRepository.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── package-info.java
│   │                                   ├── repository/
│   │                                   │   ├── orders/
│   │                                   │   │   └── OrderRepositoryTest.java
│   │                                   │   └── users/
│   │                                   │       └── UserRepositoryTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 多数据源(读写分离)入门》.md
├── lab-18/
│   ├── lab-18-sharding-datasource-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab18/
│   │       │   │                   └── shardingdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderConfigDO.java
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           ├── OrderConfigMapper.java
│   │       │   │                           └── OrderMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── OrderConfigMapper.xml
│   │       │       │   └── OrderMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           ├── lab18_orders_0.sql
│   │       │           └── lab18_orders_1.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab18/
│   │                               └── shardingdatasource/
│   │                                   └── mapper/
│   │                                       ├── OrderConfigMapperTest.java
│   │                                       └── OrderMapperTest.java
│   ├── lab-18-sharding-datasource-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab18/
│   │       │   │                   └── shardingdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── OrderMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab18/
│   │                               └── shardingdatasource/
│   │                                   ├── mapper/
│   │                                   │   └── OrderMapperTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 分库分表入门》.md
├── lab-19/
│   ├── lab-19-datasource-pool-druid-multiple/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── DataSourceConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-19-datasource-pool-druid-single/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DruidStatController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-19-datasource-pool-hikaricp-multiple/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── DataSourceConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-19-datasource-pool-hikaricp-single/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 数据库连接池入门》.md
├── lab-20/
│   ├── lab-20-database-version-control-flyway/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab20/
│   │           │                   └── databaseversioncontrol/
│   │           │                       ├── Application.java
│   │           │                       └── migration/
│   │           │                           ├── ExampleFlywayCallback.java
│   │           │                           └── V1_1__FixUsername.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── db/
│   │                   └── migration/
│   │                       └── V1.0__INIT_DB.sql
│   ├── lab-20-database-version-control-liquibase/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab20/
│   │           │                   └── databaseversioncontrol/
│   │           │                       ├── Application.java
│   │           │                       └── migration/
│   │           │                           └── CHANGE_SET_3_FixUsername.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── db/
│   │                   └── changelog/
│   │                       ├── db.changelog-master-bak.yaml
│   │                       ├── db.changelog-master.yaml
│   │                       └── sqlfile/
│   │                           └── CHAGE_SET_2_INIT_DB.sql
│   ├── pom.xml
│   └── 《芋道 Spring Boot 数据库版本管理入门》.md
├── lab-21/
│   ├── lab-21-cache-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab21/
│   │       │   │                   └── cache/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── UserCacheDao.java
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab21/
│   │                               └── cache/
│   │                                   └── UserMapperTest.java
│   ├── lab-21-cache-ehcache/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab21/
│   │       │   │                   └── cache/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── ehcache.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab21/
│   │                               └── cache/
│   │                                   └── UserMapperTest.java
│   ├── lab-21-cache-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab21/
│   │       │   │                   └── cache/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab21/
│   │                               └── cache/
│   │                                   └── UserMapperTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 缓存 Cache 入门》.md
├── lab-22/
│   ├── lab-22-validation-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab22/
│   │       │   │                   └── validation/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── ValidationConfiguration.java
│   │       │   │                       ├── constants/
│   │       │   │                       │   ├── GenderEnum.java
│   │       │   │                       │   └── ServiceExceptionEnum.java
│   │       │   │                       ├── controller/
│   │       │   │                       │   └── UserController.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── exception/
│   │       │   │                       │   │   └── ServiceException.java
│   │       │   │                       │   ├── package-info.java
│   │       │   │                       │   ├── validator/
│   │       │   │                       │   │   ├── InEnum.java
│   │       │   │                       │   │   ├── InEnumValidator.java
│   │       │   │                       │   │   └── IntArrayValuable.java
│   │       │   │                       │   ├── vo/
│   │       │   │                       │   │   └── CommonResult.java
│   │       │   │                       │   └── web/
│   │       │   │                       │       ├── GlobalExceptionHandler.java
│   │       │   │                       │       └── GlobalResponseBodyHandler.java
│   │       │   │                       ├── dto/
│   │       │   │                       │   ├── UserAddDTO.java
│   │       │   │                       │   ├── UserUpdateDTO.java
│   │       │   │                       │   ├── UserUpdateGenderDTO.java
│   │       │   │                       │   └── UserUpdateStatusDTO.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── i18n/
│   │       │           ├── messages.properties
│   │       │           ├── messages_en.properties
│   │       │           └── messages_ja.properties
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab22/
│   │                               └── validation/
│   │                                   └── service/
│   │                                       └── UserServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 参数校验 Validation 入门》.md
├── lab-23/
│   ├── lab-springmvc-23-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab23/
│   │       │                       └── springmvc/
│   │       │                           ├── Application.java
│   │       │                           ├── controller/
│   │       │                           │   ├── UserController.java
│   │       │                           │   └── UserController2.java
│   │       │                           ├── dto/
│   │       │                           │   ├── UserAddDTO.java
│   │       │                           │   └── UserUpdateDTO.java
│   │       │                           ├── service/
│   │       │                           │   └── UserService.java
│   │       │                           └── vo/
│   │       │                               └── UserVO.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab23/
│   │                               └── springmvc/
│   │                                   ├── controller/
│   │                                   │   ├── UserControllerTest.java
│   │                                   │   └── UserControllerTest2.java
│   │                                   └── package-info.java
│   ├── lab-springmvc-23-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab23/
│   │       │                       └── springmvc/
│   │       │                           ├── Application.java
│   │       │                           ├── config/
│   │       │                           │   └── SpringMVCConfiguration.java
│   │       │                           ├── constants/
│   │       │                           │   └── ServiceExceptionEnum.java
│   │       │                           ├── controller/
│   │       │                           │   ├── ProductController.java
│   │       │                           │   └── UserController.java
│   │       │                           ├── controller2/
│   │       │                           │   └── TestController.java
│   │       │                           ├── core/
│   │       │                           │   ├── exception/
│   │       │                           │   │   └── ServiceException.java
│   │       │                           │   ├── interceptor/
│   │       │                           │   │   ├── FirstInterceptor.java
│   │       │                           │   │   ├── SecondInterceptor.java
│   │       │                           │   │   └── ThirdInterceptor.java
│   │       │                           │   ├── package-info.java
│   │       │                           │   ├── servlet/
│   │       │                           │   │   ├── TestFilter02.java
│   │       │                           │   │   ├── TestServlet02.java
│   │       │                           │   │   └── TestServletContextListener02.java
│   │       │                           │   ├── vo/
│   │       │                           │   │   └── CommonResult.java
│   │       │                           │   └── web/
│   │       │                           │       ├── GlobalExceptionHandler.java
│   │       │                           │       └── GlobalResponseBodyHandler.java
│   │       │                           └── vo/
│   │       │                               ├── ProductVO.java
│   │       │                               └── UserVO.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab23/
│   │                               └── springmvc/
│   │                                   └── package-info.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot SpringMVC 入门》.md
├── lab-24/
│   ├── lab-24-apidoc-japidocs/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab24/
│   │                               ├── Application.java
│   │                               ├── TestJApiDocs.java
│   │                               ├── controller/
│   │                               │   └── UserController.java
│   │                               └── vo/
│   │                                   ├── UserCreateReqVO.java
│   │                                   ├── UserListReqVO.java
│   │                                   └── UserRespVO.java
│   ├── lab-24-apidoc-showdoc/
│   │   ├── pom.xml
│   │   ├── showdoc_api.sh
│   │   ├── showdoc_db.sh
│   │   ├── src/
│   │   │   └── main/
│   │   │       └── java/
│   │   │           └── cn/
│   │   │               └── iocoder/
│   │   │                   └── springboot/
│   │   │                       └── lab24/
│   │   │                           └── apidoc/
│   │   │                               ├── ShowDocApplication.java
│   │   │                               └── controller/
│   │   │                                   ├── UserController.java
│   │   │                                   └── vo/
│   │   │                                       ├── UserLoginReqVO.java
│   │   │                                       └── UserLoginRespVO.java
│   │   └── swagger.json
│   ├── lab-24-apidoc-swagger/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab24/
│   │                               └── apidoc/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── SwaggerConfiguration.java
│   │                                   ├── controller/
│   │                                   │   ├── TestController.java
│   │                                   │   └── UserController.java
│   │                                   ├── dto/
│   │                                   │   ├── UserAddDTO.java
│   │                                   │   └── UserUpdateDTO.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-24-apidoc-swagger-knife4j/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab24/
│   │                               └── apidoc/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── SwaggerConfiguration.java
│   │                                   ├── controller/
│   │                                   │   ├── TestController.java
│   │                                   │   └── UserController.java
│   │                                   ├── dto/
│   │                                   │   ├── UserAddDTO.java
│   │                                   │   └── UserUpdateDTO.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-24-apidoc-swagger-starter/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab24/
│   │           │                   ├── Application.java
│   │           │                   ├── config/
│   │           │                   │   └── SwaggerConfiguration.java
│   │           │                   ├── controller/
│   │           │                   │   └── UserController.java
│   │           │                   ├── dto/
│   │           │                   │   ├── UserAddDTO.java
│   │           │                   │   └── UserUpdateDTO.java
│   │           │                   └── vo/
│   │           │                       └── UserVO.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   ├── 《芋道 Spring Boot API 接口文档 JApiDocs 入门》.md
│   ├── 《芋道 Spring Boot API 接口文档 ShowDoc 入门》.md
│   ├── 《芋道 Spring Boot API 接口文档 Swagger Starter 入门》.md
│   └── 《芋道 Spring Boot API 接口文档 Swagger 入门》.md
├── lab-25/
│   ├── lab-websocket-25-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab25/
│   │                               └── springwebsocket/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── WebSocketConfiguration.java
│   │                                   ├── handler/
│   │                                   │   ├── AuthMessageHandler.java
│   │                                   │   ├── MessageHandler.java
│   │                                   │   ├── SendToAllHandler.java
│   │                                   │   └── SendToOneHandler.java
│   │                                   ├── message/
│   │                                   │   ├── AuthRequest.java
│   │                                   │   ├── AuthResponse.java
│   │                                   │   ├── Message.java
│   │                                   │   ├── SendResponse.java
│   │                                   │   ├── SendToAllRequest.java
│   │                                   │   ├── SendToOneRequest.java
│   │                                   │   ├── SendToUserRequest.java
│   │                                   │   └── UserJoinNoticeRequest.java
│   │                                   ├── util/
│   │                                   │   └── WebSocketUtil.java
│   │                                   └── websocket/
│   │                                       └── WebsocketServerEndpoint.java
│   ├── lab-websocket-25-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab25/
│   │                               └── springwebsocket/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── WebSocketConfiguration.java
│   │                                   ├── handler/
│   │                                   │   ├── AuthMessageHandler.java
│   │                                   │   ├── MessageHandler.java
│   │                                   │   ├── SendToAllHandler.java
│   │                                   │   └── SendToOneHandler.java
│   │                                   ├── message/
│   │                                   │   ├── AuthRequest.java
│   │                                   │   ├── AuthResponse.java
│   │                                   │   ├── Message.java
│   │                                   │   ├── SendResponse.java
│   │                                   │   ├── SendToAllRequest.java
│   │                                   │   ├── SendToOneRequest.java
│   │                                   │   ├── SendToUserRequest.java
│   │                                   │   └── UserJoinNoticeRequest.java
│   │                                   ├── util/
│   │                                   │   └── WebSocketUtil.java
│   │                                   └── websocket/
│   │                                       ├── DemoWebSocketHandler.java
│   │                                       └── DemoWebSocketShakeInterceptor.java
│   ├── lab-websocket-25-03/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab25/
│   │       │                       └── springwebsocket/
│   │       │                           ├── Application.java
│   │       │                           ├── config/
│   │       │                           │   └── WebSocketConfiguration.java
│   │       │                           ├── controller/
│   │       │                           │   └── SendController.java
│   │       │                           └── message/
│   │       │                               ├── AuthRequest.java
│   │       │                               ├── AuthResponse.java
│   │       │                               ├── Message.java
│   │       │                               ├── SendResponse.java
│   │       │                               ├── SendToAllRequest.java
│   │       │                               ├── SendToOneRequest.java
│   │       │                               ├── SendToUserRequest.java
│   │       │                               └── UserJoinNoticeRequest.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab25/
│   │                               └── springwebsocket/
│   │                                   ├── Main.java
│   │                                   └── client/
│   │                                       ├── DemoWebSocketStompClient.java
│   │                                       └── handler/
│   │                                           ├── ConnectHandler.java
│   │                                           └── SendToUserRequestHandler.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot WebSocket 入门》.md
├── lab-26/
│   ├── lab-26-distributed-session-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab26/
│   │           │                   └── distributedsession/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── SessionConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── SessionController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-26-distributed-session-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab26/
│   │           │                   └── distributedsession/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── SessionConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── SessionController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-26-distributed-session-springsecurity/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab26/
│   │           │                   └── distributedsession/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── SessionConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── SessionController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 分布式 Session 入门》.md
├── lab-27/
│   ├── lab-27-webflux-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab27/
│   │       │                       └── springwebflux/
│   │       │                           ├── Application.java
│   │       │                           ├── controller/
│   │       │                           │   ├── UserController.java
│   │       │                           │   └── UserRouter.java
│   │       │                           ├── dto/
│   │       │                           │   ├── UserAddDTO.java
│   │       │                           │   └── UserUpdateDTO.java
│   │       │                           ├── service/
│   │       │                           │   └── UserService.java
│   │       │                           └── vo/
│   │       │                               └── UserVO.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab27/
│   │                               └── springwebflux/
│   │                                   ├── controller/
│   │                                   │   ├── UserControllerTest.java
│   │                                   │   └── UserControllerTest2.java
│   │                                   └── package-info.java
│   ├── lab-27-webflux-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab27/
│   │                               └── springwebflux/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── WebFluxConfiguration.java
│   │                                   ├── constants/
│   │                                   │   └── ServiceExceptionEnum.java
│   │                                   ├── controller/
│   │                                   │   ├── UserController.java
│   │                                   │   └── UserRouter.java
│   │                                   ├── controller2/
│   │                                   │   └── TestController.java
│   │                                   ├── core/
│   │                                   │   ├── exception/
│   │                                   │   │   └── ServiceException.java
│   │                                   │   ├── filter/
│   │                                   │   │   └── DemoWebFilter.java
│   │                                   │   ├── package-info.java
│   │                                   │   ├── vo/
│   │                                   │   │   └── CommonResult.java
│   │                                   │   └── web/
│   │                                   │       ├── GlobalExceptionHandler.java
│   │                                   │       └── GlobalResponseBodyHandler.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-27-webflux-03/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab27/
│   │                               └── springwebflux/
│   │                                   ├── Application.java
│   │                                   ├── controller/
│   │                                   │   └── UserController.java
│   │                                   ├── core/
│   │                                   │   ├── package-info.java
│   │                                   │   └── servlet/
│   │                                   │       ├── TestFilter02.java
│   │                                   │       ├── TestServlet02.java
│   │                                   │       └── TestServletContextListener02.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-27-webflux-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ElasticsearchConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── UserController.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserRepository.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── UserDO.java
│   │           │                       ├── dto/
│   │           │                       │   ├── UserAddDTO.java
│   │           │                       │   └── UserUpdateDTO.java
│   │           │                       └── vo/
│   │           │                           └── UserVO.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-27-webflux-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── controller/
│   │           │                       │   └── UserController.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserRepository.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── UserDO.java
│   │           │                       ├── dto/
│   │           │                       │   ├── UserAddDTO.java
│   │           │                       │   └── UserUpdateDTO.java
│   │           │                       └── vo/
│   │           │                           └── UserVO.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-27-webflux-r2dbc/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── DatabaseConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── UserController.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserRepository.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── UserDO.java
│   │           │                       ├── dto/
│   │           │                       │   ├── UserAddDTO.java
│   │           │                       │   └── UserUpdateDTO.java
│   │           │                       └── vo/
│   │           │                           └── UserVO.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── sql/
│   │                   └── users.sql
│   ├── lab-27-webflux-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── cacheobject/
│   │           │                       │   └── UserCacheObject.java
│   │           │                       ├── config/
│   │           │                       │   └── RedisConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── UserController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 响应式 WebFlux 入门》.md
├── lab-28/
│   ├── lab-28-task-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab28/
│   │           │                   └── task/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ScheduleConfiguration.java
│   │           │                       └── job/
│   │           │                           └── DemoJob.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-28-task-quartz-jdbc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab28/
│   │       │   │                   └── task/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── Application02.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── DataSourceConfiguration.java
│   │       │   │                       │   └── ScheduleConfiguration.java
│   │       │   │                       ├── job/
│   │       │   │                       │   ├── DemoJob01.java
│   │       │   │                       │   └── DemoJob02.java
│   │       │   │                       └── service/
│   │       │   │                           └── DemoService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab28/
│   │                               └── task/
│   │                                   └── QuartzSchedulerTest.java
│   ├── lab-28-task-quartz-memory/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab28/
│   │           │                   └── task/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ScheduleConfiguration.java
│   │           │                       ├── job/
│   │           │                       │   ├── DemoJob01.java
│   │           │                       │   └── DemoJob02.java
│   │           │                       └── service/
│   │           │                           └── DemoService.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-28-task-xxl-job/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab28/
│   │           │                   └── task/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── XxlJobConfiguration.java
│   │           │                       └── job/
│   │           │                           └── DemoJob.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 定时任务入门》.md
├── lab-29/
│   ├── lab-29-async-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab29/
│   │       │   │                   └── asynctask/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── Demo.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── AsyncConfig.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── async/
│   │       │   │                       │   │   └── GlobalAsyncExceptionHandler.java
│   │       │   │                       │   └── package-info.java
│   │       │   │                       └── service/
│   │       │   │                           └── DemoService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab29/
│   │                               └── asynctask/
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── DemoServiceTest.java
│   ├── lab-29-async-two/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab29/
│   │       │   │                   └── asynctask/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── AsyncConfig.java
│   │       │   │                       └── service/
│   │       │   │                           └── DemoService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab29/
│   │                               └── asynctask/
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── DemoServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 异步任务入门》.md
├── lab-30/
│   ├── lab-30-dubbo-annotations-demo/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api-02/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   └── dto/
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer-02/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       └── ConsumerApplication.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── user-rpc-service-provider-02/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   └── application.yaml
│   ├── lab-30-dubbo-annotations-nacos/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api-03/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   └── dto/
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer-03/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       └── ConsumerApplication.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── user-rpc-service-provider-03/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   └── application.yaml
│   ├── lab-30-dubbo-annotations-sentinel/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api-04/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   └── dto/
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer-04/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       ├── ConsumerApplication.java
│   │   │           │                       └── controller/
│   │   │           │                           └── UserController.java
│   │   │           └── resources/
│   │   │               ├── application.yaml
│   │   │               └── sentinel.properties
│   │   └── user-rpc-service-provider-04/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   ├── application.yaml
│   │                   └── sentinel.properties
│   ├── lab-30-dubbo-xml-demo/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   ├── core/
│   │   │                                   │   ├── ServiceException.java
│   │   │                                   │   └── ServiceExceptionEnum.java
│   │   │                                   └── dto/
│   │   │                                       ├── UserAddDTO.java
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       └── ConsumerApplication.java
│   │   │           └── resources/
│   │   │               ├── application.yaml
│   │   │               └── dubbo.xml
│   │   └── user-rpc-service-provider/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       ├── filter/
│   │               │                       │   └── DubboExceptionFilter.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   ├── META-INF/
│   │                   │   └── dubbo/
│   │                   │       └── org.apache.dubbo.rpc.Filter
│   │                   ├── application.yaml
│   │                   └── dubbo.xml
│   ├── pom.xml
│   ├── 《芋道 Dubbo Admin 快速入门》.md
│   ├── 《芋道 Dubbo Swagger 快速入门》.md
│   └── 《芋道 Spring Boot Dubbo 入门》.md
├── lab-31/
│   ├── lab-31-rocketmq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab31/
│   │       │   │                   └── rocketmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo01AConsumer.java
│   │       │   │                       │   ├── Demo01Consumer.java
│   │       │   │                       │   ├── Demo02Consumer.java
│   │       │   │                       │   ├── Demo03Consumer.java
│   │       │   │                       │   ├── Demo04Consumer.java
│   │       │   │                       │   ├── Demo05Consumer.java
│   │       │   │                       │   ├── Demo06Consumer.java
│   │       │   │                       │   └── Demo07Consumer.java
│   │       │   │                       ├── core/
│   │       │   │                       │   └── ExtRocketMQTemplate.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── Demo01Message.java
│   │       │   │                       │   ├── Demo02Message.java
│   │       │   │                       │   ├── Demo03Message.java
│   │       │   │                       │   ├── Demo04Message.java
│   │       │   │                       │   ├── Demo05Message.java
│   │       │   │                       │   ├── Demo06Message.java
│   │       │   │                       │   └── Demo07Message.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── Demo01Producer.java
│   │       │   │                           ├── Demo02Producer.java
│   │       │   │                           ├── Demo03Producer.java
│   │       │   │                           ├── Demo04Producer.java
│   │       │   │                           ├── Demo05Producer.java
│   │       │   │                           ├── Demo06Producer.java
│   │       │   │                           └── Demo07Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab31/
│   │                               └── rocketmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── Demo01ProducerTest.java
│   │                                       ├── Demo02ProducerTest.java
│   │                                       ├── Demo03ProducerTest.java
│   │                                       ├── Demo04ProducerTest.java
│   │                                       ├── Demo05ProducerTest.java
│   │                                       ├── Demo06ProducerTest.java
│   │                                       └── Demo07ProducerTest.java
│   ├── lab-31-rocketmq-ons/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab31/
│   │       │   │                   └── rocketmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo01Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo01Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo01Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab31/
│   │                               └── rocketmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo01ProducerTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 RocketMQ 入门》.md
├── lab-32/
│   ├── lab-32-activemq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo01Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo01Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo01Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo01ProducerTest.java
│   ├── lab-32-activemq-demo-concurrency/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo03Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo03Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo03Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo03ProducerTest.java
│   ├── lab-32-activemq-demo-consume-retry/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── ActiveMQConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo05Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-32-activemq-demo-delay/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo02Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo02Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo02Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo02ProducerTest.java
│   ├── lab-32-activemq-demo-message-model/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── ActiveMQConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── BroadcastConsumer.java
│   │       │   │                       │   └── ClusteringConsumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── BroadcastMessage.java
│   │       │   │                       │   └── ClusteringMessage.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── BroadcastProducer.java
│   │       │   │                           └── ClusteringProducer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── BroadcastProducerTest.java
│   │                                       └── ClusteringProducerTest.java
│   ├── lab-32-activemq-demo-orderly/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo04Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo04Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo04Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo04ProducerTest.java
│   ├── lab-32-activemq-native/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── ActiveMQConsumer.java
│   │                                   └── ActiveMQProducer.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 ActiveMQ 入门》.md
├── lab-33/
│   ├── lab-33-shiro-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab01/
│   │           │                   └── shirodemo/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ShiroConfig.java
│   │           │                       └── controller/
│   │           │                           ├── DemoController.java
│   │           │                           ├── SecurityController.java
│   │           │                           └── TestController.java
│   │           └── resources/
│   │               └── static/
│   │                   └── login.html
│   ├── pom.xml
│   └── 《芋道 Spring Boot 安全框架 Shiro 入门》.md
├── lab-34/
│   ├── lab-34-actuator-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-auditevents/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── ActuateConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-custom-endpoint/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── endpoint/
│   │           │                           └── DemoEndPoint.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-health/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── actuate/
│   │           │                           └── DemoHealthIndicator.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-httptrace/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── ActuateConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-info/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ActuateConfig.java
│   │           │                       └── demo/
│   │           │                           └── DemoInfoContributor.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-metrics/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           ├── DemoController.java
│   │           │                           └── ExampleController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-security/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── SecurityConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-test/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── TestController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 监控端点 Actuator 入门》.md
├── lab-35/
│   ├── lab-35-admin-01-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab35/
│   │                               └── adminserver/
│   │                                   └── AdminServerApplication.java
│   ├── lab-35-admin-01-demo-application/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── demo/
│   │           │                       └── DemoApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-02-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── adminserver/
│   │           │                       └── AdminServerApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-02-demo-application/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── demo/
│   │           │                       ├── Demo01Application.java
│   │           │                       └── Demo02Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-02-eurekaserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── eurekaserver/
│   │           │                       └── EurekaServerApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-03-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab35/
│   │                               └── adminserver/
│   │                                   ├── AdminServerApplication.java
│   │                                   └── config/
│   │                                       └── SecurityConfig.java
│   ├── lab-35-admin-03-demo-application/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── demo/
│   │           │                       └── DemoApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-04-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── adminserver/
│   │           │                       └── AdminServerApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-05-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab35/
│   │                               └── adminserver/
│   │                                   ├── AdminServerApplication.java
│   │                                   └── notify/
│   │                                       └── LoggerNotifier.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 监控工具 Admin 入门》.md
├── lab-36/
│   ├── lab-36-prometheus-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab36/
│   │           │                   └── prometheusdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》.md
├── lab-37/
│   ├── lab-37-logging-actuator/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-aop/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       ├── aspect/
│   │           │                       │   └── HttpAccessAspect.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-debug/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-log4j2/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── log4j2-spring.xml
│   ├── lab-37-logging-logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── logback-spring.xml
│   ├── lab-37-logging-multi-env/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               └── application-prod.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 日志集成 Logging 入门》.md
├── lab-38/
│   ├── lab-38-elk-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab38/
│   │           │                   └── elkdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 日志平台 ELK + Filebeat 入门》.md
├── lab-39/
│   ├── lab-39-activemq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── ActiveMQApplication.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-async/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── AsyncApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       └── service/
│   │           │                           └── DemoService.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── ElasticsearchApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── ESUserDO.java
│   │           │                       └── repository/
│   │           │                           └── ESUserRepository.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-elasticsearch-jest/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── ElasticsearchJestApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── ESUserDO.java
│   │           │                       └── repository/
│   │           │                           └── ESUserRepository.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-kafka/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── KafkaApplication.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── LogbackApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               ├── application.yml
│   │               └── logback-spring.xml
│   ├── lab-39-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── MongoDBApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       └── dataobject/
│   │           │                           └── UserDO.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-mysql/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── MySQLApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-opentracing/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── OpentracingApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-rabbitmq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── RabbitMQApplication.java
│   │           │                       ├── config/
│   │           │                       │   └── RabbitConfig.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── RedisApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-rocketmq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       └── rocketmqdemo/
│   │           │                           ├── RocketMQApplication.java
│   │           │                           ├── consumer/
│   │           │                           │   └── DemoConsumer.java
│   │           │                           ├── controller/
│   │           │                           │   └── DemoController.java
│   │           │                           ├── message/
│   │           │                           │   └── DemoMessage.java
│   │           │                           └── producer/
│   │           │                               └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-skywalking-dubbo/
│   │   ├── lab-39-skywalking-dubbo-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab39/
│   │   │                               └── skywalkingdemo/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserService.java
│   │   │                                   └── package-info.java
│   │   ├── lab-39-skywalking-dubbo-consumer/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab39/
│   │   │           │                   └── skywalkingdemo/
│   │   │           │                       └── consumerdemo/
│   │   │           │                           ├── ConsumerApplication.java
│   │   │           │                           └── controller/
│   │   │           │                               └── UserController.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   ├── lab-39-skywalking-dubbo-provider/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab39/
│   │   │           │                   └── skywalkingdemo/
│   │   │           │                       └── providerdemo/
│   │   │           │                           ├── ProviderApplication.java
│   │   │           │                           └── service/
│   │   │           │                               └── UserServiceImpl.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── pom.xml
│   ├── lab-39-springmvc/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-trace-annotations/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── TraceAnnotationsApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md
├── lab-40/
│   ├── lab-40-activemq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── ActiveMQApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── Application.java
│   │           │                       ├── Application2.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── ElasticsearchApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── ESUserDO.java
│   │           │                       ├── repository/
│   │           │                       │   └── ESUserRepository.java
│   │           │                       └── spring/
│   │           │                           ├── ClusterNodes.java
│   │           │                           └── TracingTransportClientFactoryBean.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-40-kafka/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── KafkaApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── LogbackApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkin/
│   │           │                       ├── MongoDBApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       └── dataobject/
│   │           │                           └── UserDO.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-40-mysql/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── MySQLApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-opentracing/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── OpentracingApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-40-rabbitmq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── RabbitMQApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── RabbitConfig.java
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── RedisApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-springmvc/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── SpringMVCApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-zipkin-dubbo/
│   │   ├── lab-40-zipkin-dubbo-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab40/
│   │   │                               └── zipkindemo/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserService.java
│   │   │                                   └── package-info.java
│   │   ├── lab-40-zipkin-dubbo-consumer/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab40/
│   │   │           │                   └── zpkindemo/
│   │   │           │                       └── consumerdemo/
│   │   │           │                           ├── ConsumerApplication.java
│   │   │           │                           ├── config/
│   │   │           │                           │   ├── SpringMvcConfiguration.java
│   │   │           │                           │   └── ZipkinConfiguration.java
│   │   │           │                           └── controller/
│   │   │           │                               └── UserController.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   ├── lab-40-zipkin-dubbo-provider/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab40/
│   │   │           │                   └── zipkindemo/
│   │   │           │                       └── providerdemo/
│   │   │           │                           ├── ProviderApplication.java
│   │   │           │                           ├── config/
│   │   │           │                           │   └── ZipkinConfiguration.java
│   │   │           │                           └── service/
│   │   │           │                               └── UserServiceImpl.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── pom.xml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 链路追踪 Zipkin 入门》.md
├── lab-41/
│   ├── deploy.sh
│   ├── lab-41-demo01/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── jenkinsdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               ├── application-local.yaml
│   │               ├── application-pre.yaml
│   │               ├── application-prod.yaml
│   │               └── application-uat.yaml
│   ├── lab-41-demo02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── jenkinsdemo/
│   │           │                       ├── Demo02Application.java
│   │           │                       ├── actuate/
│   │           │                       │   └── ServerHealthIndicator.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               ├── application-local.yaml
│   │               ├── application-pre.yaml
│   │               ├── application-prod.yaml
│   │               └── application-uat.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 持续交付 Jenkins 入门》.md
├── lab-42/
│   ├── lab-42-demo01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab23/
│   │       │   │                   └── testdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── controller/
│   │       │   │                       │   └── UserController.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab23/
│   │           │                   └── testdemo/
│   │           │                       ├── controller/
│   │           │                       │   └── UserControllerTest.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserDaoTest.java
│   │           │                       ├── package-info.java
│   │           │                       └── service/
│   │           │                           └── UserServiceTest.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── sql/
│   │                   ├── clean.sql
│   │                   └── create_tables.sql
│   ├── lab-42-demo02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab23/
│   │       │   │                   └── testdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── controller/
│   │       │   │                       │   └── UserController.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab23/
│   │           │                   └── testdemo/
│   │           │                       ├── controller/
│   │           │                       │   └── UserControllerTest.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserDaoTest.java
│   │           │                       ├── package-info.java
│   │           │                       └── service/
│   │           │                           ├── UserServiceTest.java
│   │           │                           └── UserServiceTest2.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── sql/
│   │                   ├── clean.sql
│   │                   └── create_tables.sql
│   ├── pom.xml
│   └── 《芋道 Spring Boot 单元测试 Test 入门》.md
├── lab-43/
│   ├── lab-43-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab43/
│   │           │                   └── propertydemo/
│   │           │                       ├── Application.java
│   │           │                       └── OrderProperties.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-43-demo-configname/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab43/
│   │           │                   └── propertydemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── rpc.yaml
│   ├── lab-43-demo-jasypt/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab43/
│   │       │   │                   └── propertydemo/
│   │       │   │                       └── Application.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab43/
│   │                               └── propertydemo/
│   │                                   └── JasyptTest.java
│   ├── lab-43-demo-profiles/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab43/
│   │           │                   └── propertydemo/
│   │           │                       └── ProfilesApplication.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               ├── application-local.yaml
│   │               ├── application-pre.yaml
│   │               ├── application-prod.yaml
│   │               ├── application-uat.yaml
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 配置文件入门》.md
├── lab-44/
│   ├── lab-44-nacos-config-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab44/
│   │           │                   └── nacosdemo/
│   │           │                       ├── Application.java
│   │           │                       └── OrderProperties.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-44-nacos-config-demo-actuator/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab44/
│   │           │                   └── nacosdemo/
│   │           │                       ├── Application.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── listener/
│   │           │                       │   └── LoggingSystemConfigListener.java
│   │           │                       └── properties/
│   │           │                           └── TestProperties.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-44-nacos-config-demo-auto-refresh/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │         

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### Java template
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

SpringBoot-Labs.ipr
SpringBoot-Labs.iws
target/**
*.lst
*.iml
*ipr
*.iws

### IntelliJ IDEA
.idea
target

================================================
FILE: README.md
================================================
> 友情提示:因为提供了 50000+ 行示例代码,所以艿艿默认注释了所有 Maven Module。
>
> 胖友可以根据自己的需要,修改 [`pom.xml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/pom.xml) 即可。

一个涵盖六个主流技术栈的**正经**仓库:
* [《Spring Boot 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-boot-%E4%B8%93%E6%A0%8F)
* [《Spring Cloud Alibaba 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-cloud-alibaba-%E4%B8%93%E6%A0%8F)
* [《Spring Cloud 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-cloud-%E4%B8%93%E6%A0%8F)
* [《Dubbo 专栏》](https://github.com/YunaiV/SpringBoot-Labs#Dubbo-%E4%B8%93%E6%A0%8F)
* [《消息队列 MQ 专栏》](https://github.com/YunaiV/SpringBoot-Labs#%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97-mq-%E4%B8%93%E6%A0%8F)
* [《分布式事务专栏》](https://github.com/YunaiV/SpringBoot-Labs#分布式事务专栏)

作为一个热爱**深夜**撸码的 18 岁头发茂密的可爱小男孩,希望大佬能够**一键三连**。

![一间三连](http://static.iocoder.cn/github-star.jpg)

> **亲,一键三连啊**

# 交流群

扫码如下**二维码**,回复「艿艿」关键字。

可以添加 18 岁的我为好友,并拉你进一个~~交流~~**装逼群**。

![骚气的二维码](http://www.iocoder.cn/images/common/erweima.jpg)

😈 等后面,艿艿**头发**重新长一点出来,给旁友们录制点视频哈!

# Spring Boot 专栏

基于 Spring Boot 2.X 版本的**深度**入门教程。

市面上的 Spring Boot **基础**入门文章很多,但是**深度**入门文章却很少。对于很多开发者来说,入门即是其对某个技术栈的最终理解,一方面是开发者“比较懒”,另一方面是文章作者把 Spring Boot 入门写的太浅,又或者不够全面。

因此,艿艿开始了这个 Spring Boot 专栏,一个**深度**且**全面**的 Spring Boot 2.X 入门。
* 在带你快速学会 SpringMVC API 接口的编写的同时,我还想告诉你还有全局返回、全局异常、拦截器、跨域处理等等功能。
* 在带你快速学会 MQ 消息的发送与消费的同时,我还想告诉你 MQ 还有集群消费、广播消费、顺序消息、定时消息、事务消息、消费重试等等特性。
* 在带你快速学会 Job 任务的编写的同时,我还想告诉你还有 Quartz 单体、Quartz 集群、XXL-JOB 等等企业使用更多的调度平台。
* ...

让我们一起愉快的挖坑,挖深坑,哇哈哈。

## 打好基础

* [《芋道 Spring Boot 快速入门》](http://www.iocoder.cn/Spring-Boot/quick-start/?github)
* [《芋道 Spring Boot 自动配置原理》](http://www.iocoder.cn/Spring-Boot/autoconfigure/?github) 对应 [lab-47](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-47)
* [《芋道 Spring Boot Jar 启动原理》](http://www.iocoder.cn/Spring-Boot/jar/?github)
* [《芋道 Spring Boot 调试环境》](http://www.iocoder.cn/Spring-Boot/build-debugging-environment-2-6-0/?github)

## 开发工具

* [《芋道 Spring Boot 热部署入门》](http://www.iocoder.cn/Spring-Boot/hot-swap/?github) 对应 [lab-48-hot-swap](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-48-hot-swap)
* [《芋道 Spring Boot 消除冗余代码 Lombok 入门》](http://www.iocoder.cn/Spring-Boot/Lombok/?github) 对应 [lab-49](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-49)
* [《芋道 Spring Boot 对象转换 MapStruct 入门》](http://www.iocoder.cn/Spring-Boot/MapStruct/?github) 对应 [lab-55](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-55)

## Web 开发

* [《芋道 Spring Boot SpringMVC 入门》](http://www.iocoder.cn/Spring-Boot/SpringMVC/?github) 对应 [lab-23](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-23)
* [《芋道 Spring Boot WebFlux 入门》](http://www.iocoder.cn/Spring-Boot/WebFlux/?github) 对应 [lab-27](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-27)
* [《芋道 Spring Boot 分布式 Session 入门》](http://www.iocoder.cn/Spring-Boot/Distributed-Session/?github) 对应 [lab-26](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-26)
* [《芋道 Spring Boot API 接口文档 Swagger 入门》](http://www.iocoder.cn/Spring-Boot/Swagger/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
* [《芋道 Spring Boot API 接口文档 Swagger Starter 入门》](http://www.iocoder.cn/Spring-Boot/Swagger-Starter/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
* [《芋道 Spring Boot 参数校验 Validation 入门》](http://www.iocoder.cn/Spring-Boot/Validation/?github) 对应 [lab-22](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-22)
* [《芋道 Spring Boot WebSocket 入门》](http://www.iocoder.cn/Spring-Boot/WebSocket/?github) 对应 [lab-25](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-25)
* [《性能测试 —— Tomcat、Jetty、Undertow 基准测试》](http://www.iocoder.cn/Performance-Testing/Tomcat-Jetty-Undertow-benchmark/?github) 对应 [lab-05-benchmark-tomcat-jetty-undertow](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-05-benchmark-tomcat-jetty-undertow)
* [《性能测试 —— SpringMVC、Webflux 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringMVC-Webflux-benchmark/?github) 对应 [lab-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-06)
* [《芋道 Spring Boot API 接口文档 JApiDocs 入门》](http://www.iocoder.cn/Spring-Boot/JApiDocs/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
* [《芋道 Spring Boot API 接口文档 ShowDoc 入门》](http://www.iocoder.cn/Spring-Boot/ShowDoc/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
* [《芋道 Spring Boot API 接口调试 IDEA HTTP Client》](http://www.iocoder.cn/Spring-Boot/IDEA-HTTP-Client/?github) 对应 [lab-71-http-debug](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-71-http-debug/)

## RPC 开发

* [《芋道 Spring Boot Netty 入门》](http://www.iocoder.cn/Spring-Boot/Netty/?github) 对应 [lab-67](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-67)
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30)
* [《芋道 Spring Boot 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Boot/Feign/?github) 对应 [lab-58](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-58)
* [《芋道 Spring Boot gRPC 入门》](http://www.iocoder.cn/Spring-Boot/gRPC/?github) 对应 [lab-64](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-64)
* [《芋道 Spring Boot Web Services 入门》](http://www.iocoder.cn/Spring-Boot/Web-Services/?github) 对应 [lab-65](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-65)
* [《芋道 Spring Boot SOFARPC 入门》](http://www.iocoder.cn/Spring-Boot/SOFARPC/?github) 对应 [lab-62](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-62)
* [《芋道 Spring Boot Motan 入门》](http://www.iocoder.cn/Spring-Boot/Motan/?github) 对应 [lab-63](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-63)
* 《芋道 Spring Boot RSocket 入门》计划中...
* 《芋道 Spring Boot Tars 入门》计划中...

## 文件存储

* [《芋道 Spring Boot 对象存储 MinIO 入门》](https://www.iocoder.cn/Spring-Boot/MinIO/?github) 对应 [lab-72-minio](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-72-minio)

## 数据访问

**关系数据库**

* [《芋道 Spring Boot 数据库连接池入门》](http://www.iocoder.cn/Spring-Boot/datasource-pool/?github) 对应 [lab-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-19)
* [《芋道 Spring Boot MyBatis 入门》](http://www.iocoder.cn/Spring-Boot/MyBatis/?github) 对应 [lab-12-mybatis](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-12-mybatis)
* [《芋道 Spring Boot JPA 入门》](http://www.iocoder.cn/Spring-Boot/JPA/?github) 对应 [lab-13-spring-data-jpa](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-13-spring-data-jpa)
* [《芋道 Spring Boot JdbcTemplate 入门》](http://www.iocoder.cn/Spring-Boot/JdbcTemplate/?github) 对应 [lab-14-spring-jdbc-template](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-14-spring-jdbc-template)
* [《芋道 Spring Boot 多数据源(读写分离)入门》](http://www.iocoder.cn/Spring-Boot/dynamic-datasource/?github) 对应 [lab-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-17)
* [《芋道 Spring Boot 分库分表入门》](http://www.iocoder.cn/Spring-Boot/sharding-datasource/?github) 对应 [lab-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-18)
* [《芋道 Spring Boot 数据库版本管理入门》](http://www.iocoder.cn/Spring-Boot/database-version-control/?github) 对应 [lab-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-20)
* [《芋道 Spring Boot 数据表结构文档》](http://www.iocoder.cn/Spring-Boot/DB-Doc-screw/?github) 对应 [lab-70-db-doc](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-70-db-doc)

**非关系数据库**

* [《芋道 Spring Boot Redis 入门》](http://www.iocoder.cn/Spring-Boot/Redis/?github) 对应 [lab-11-spring-data-redis](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-11-spring-data-redis)
* [《芋道 Spring Boot 缓存 Cache 入门》](http://www.iocoder.cn/Spring-Boot/Cache/?github) 对应 [lab-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-21)
* [《芋道 Spring Boot MongoDB 入门》](http://www.iocoder.cn/Spring-Boot/MongoDB/?github) 对应 [lab-16-spring-data-mongo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-16-spring-data-mongo)
* [《芋道 Spring Boot Elasticsearch 入门》](http://www.iocoder.cn/Spring-Boot/Elasticsearch/?github) 对应 [lab-15-spring-data-es](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-15-spring-data-es)
* [《芋道 Spring Boot Solr 入门》](http://www.iocoder.cn/Spring-Boot/Solr/?github) 对应 [lab-66](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-66)

## 事务管理

* [《芋道 Spring Boot 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Boot/Seata/?github) 对应 [lab-52](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-52)

## 安全控制

* [《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?github) 对应 [lab-01-spring-security](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security)
* [《芋道 Spring Boot 安全框架 Shiro 入门》](http://www.iocoder.cn/Spring-Boot/Shiro/?github) 对应 [lab-33](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-33)

**OAuth 2.0**
* [《芋道 Spring Security OAuth2 入门》](http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
* [《芋道 Spring Security OAuth2 存储器》](http://www.iocoder.cn/Spring-Security/OAuth2-learning-store/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
* [《芋道 Spring Security OAuth2 单点登陆》](http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)

## 定时任务与异步任务

* [《芋道 Spring Boot 定时任务入门》](http://www.iocoder.cn/Spring-Boot/Job/?github) 对应 [lab-28](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-28)
* [《芋道 Spring Boot 异步任务入门》](http://www.iocoder.cn/Spring-Boot/Async-Job/?github) 对应 [lab-29](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-29)

## 消息队列

* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 对应 [lab-31](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-31)
* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03-kafka)
* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04-rabbitmq)
* [《芋道 Spring Boot 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Boot/ActiveMQ/?github) 对应 [lab-32](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-32)
* [《芋道 Spring Boot 事件机制 Event 入门》](http://www.iocoder.cn/Spring-Boot/Event/?github) 对应 对应 [lab-54](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-54)

## 配置中心

* [《芋道 Spring Boot 配置文件入门》](http://www.iocoder.cn/Spring-Boot/config-file/?github) 对应 [lab-43](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-43)
* [《芋道 Spring Boot 配置中心 Apollo 入门》](http://www.iocoder.cn/Spring-Boot/config-apollo/?github) 对应 [lab-45](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-45)
* [《芋道 Spring Boot 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Boot/config-nacos/?github) 对应 [lab-44](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-44)

## 注册中心

* [《芋道 Spring Boot 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Boot/registry-nacos/?github) 对应 [lab-44](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-44)

## 持续交付

* [《芋道 Spring Boot 持续交付 Jenkins 入门》](http://www.iocoder.cn/Spring-Boot/Jenkins/?github) 对应 [lab-41](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-41)
* [《芋道 Spring Boot 单元测试 Test 入门》](http://www.iocoder.cn/Spring-Boot/Unit-Test/?github) 对应 [lab-42](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-42)
* 《芋道 Spring Boot 容器 Docker 入门》计划中...

## 服务容错

* [《芋道 Spring Boot 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Boot/Sentinel/?github) 对应 [lab-46](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-46)
* [《芋道 Spring Boot 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Boot/Hystrix/?github) 对应 [lab-57](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-57)
* [《芋道 Spring Boot 服务容错 Resilience4j 入门》](http://www.iocoder.cn/Spring-Boot/Resilience4j/?github) 对应 [lab-59](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-59)

## 监控管理

* [《芋道 Spring Boot 异常管理平台 Sentry 入门》](http://www.iocoder.cn/Spring-Boot/Sentry/?github) 对应 [lab-51](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-51)
* [《芋道 Spring Boot 监控端点 Actuator 入门》](http://www.iocoder.cn/Spring-Boot/Actuator/?github) 对应 [lab-34](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-34)
* [《芋道 Spring Boot 监控工具 Admin 入门》](http://www.iocoder.cn/Spring-Boot/Admin/?github) 对应 [lab-35](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-35)
* [《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》](http://www.iocoder.cn/Spring-Boot/Prometheus-and-Grafana/?github) 对应 [lab-36](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-36)
* [《芋道 Spring Boot 监控平台 CAT 入门》](http://www.iocoder.cn/Spring-Boot/CAT/?github) 对应 [lab-61](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-61)

## 日志管理

* [《芋道 Spring Boot 日志集成 Logging 入门》](http://www.iocoder.cn/Spring-Boot/Logging/?github) 对应 [lab-37](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-37)
* [《芋道 Spring Boot 日志平台 ELK + Filebeat 入门》](http://www.iocoder.cn/Spring-Boot/ELK/?github) 对应 [lab-38](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38)
* 《芋道 Spring Boot 日志平台 Loki 入门》计划中...

## 链路追踪

* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 对应 [lab-39](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-39)
* [《芋道 Spring Boot 链路追踪 Zipkin 入门》](http://www.iocoder.cn/Spring-Boot/Zipkin/?github) 对应 [lab-40](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-40)
* 《芋道 Spring Boot 链路追踪 Pinpoint 入门》计划中...
* 《芋道 Spring Boot 链路追踪 Elastic APM 入门》计划中...

# Spring Cloud Alibaba 专栏

## Spring Cloud Alibaba 全家桶

* [《芋道 Spring Cloud Alibaba 介绍》](http://www.iocoder.cn/Spring-Cloud-Alibaba/intro/?github)
* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01-spring-cloud-alibaba-nacos-discovery](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01-spring-cloud-alibaba-nacos-discovery)
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04-spring-cloud-alibaba-sentinel](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04-spring-cloud-alibaba-sentinel)
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05-spring-cloud-alibaba-nacos-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05-spring-cloud-alibaba-nacos-config)
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github) 对应 [labx-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-17)

## 推荐搭配食用

* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02-spring-cloud-netflix-ribbon](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02-spring-cloud-netflix-ribbon)
* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03-spring-cloud-feign](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03-spring-cloud-feign)
* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08-spring-cloud-gateway](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08-spring-cloud-gateway)
* [《芋道 Spring Cloud 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Cloud/SkyWalking/?github) 对应 [labx-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-14)
* [《芋道 Dubbo Admin 快速入门》](http://www.iocoder.cn/Dubbo/Admin/?github)
* [《芋道 Dubbo Swagger 快速入门》](http://www.iocoder.cn/Dubbo/Swagger/?github) 对应 [swagger-dubbo](https://github.com/YunaiV/swagger-dubbo)
 
# Spring Cloud 专栏

## 注册中心

* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01-spring-cloud-alibaba-nacos-discovery](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01-spring-cloud-alibaba-nacos-discovery)
* [《芋道 Spring Cloud Netflix 注册中心 Eureka 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Eureka?github) 对应 [labx-22](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-22)
* [《芋道 Spring Cloud 注册中心 Zookeeper 入门》](http://www.iocoder.cn/Spring-Cloud/ZooKeeper-Discovery/?github) 对应 [labx-25](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-25)
* [《芋道 Spring Cloud 注册中心 Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Consul-Discovery/?github) 对应 [labx-27](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-27)
* [《芋道 Spring Cloud 注册中心 Etcd 入门》](http://www.iocoder.cn/Spring-Cloud/Etcd/?github)

## 服务调用

* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02-spring-cloud-netflix-ribbon](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02-spring-cloud-netflix-ribbon)
* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03-spring-cloud-feign](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03-spring-cloud-feign)
* [《芋道 Spring Cloud 服务调用 gRPC 入门》](http://www.iocoder.cn/Spring-Cloud/gRPC/?github) 对应 [labx-30-spring-cloud-grpc](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-30-spring-cloud-grpc)

## 服务容错

* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04-spring-cloud-alibaba-sentinel](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04-spring-cloud-alibaba-sentinel)
* [《芋道 Spring Cloud Netflix 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Hystrix/?github) 对应 [labx-23](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-23)
* [《芋道 Spring Cloud 服务容错 Resilience4j 入门》](http://www.iocoder.cn/Spring-Cloud/Resilience4j/?github) 对应 [lab-59](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-59)
* 《芋道 Spring Cloud 服务容错 Spring Cloud CircuitBreaker》计划中...

## API 网关

* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08-spring-cloud-gateway](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08-spring-cloud-gateway)
* [《芋道 Spring Cloud Netflix 服务网关 Zuul 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Zuul/?github) 对应 对应 [labx-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-21)
* [《性能测试 —— Spring Cloud Gateway、Zuul 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringCloudGateway-Zuul-benchmark/?github) 对应 [lab-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-07)

> 如下非 Spring Cloud 网关,先放在这里...

* [《芋道 APISIX 极简入门(国产微服务网关)》](http://www.iocoder.cn/APISIX/install/?github) 对应 [lab-56](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-56)
* [《芋道 Soul 极简入门(国产微服务网关)》](http://www.iocoder.cn/Soul/install/?github) 对应 [lab-60](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-60)
* [《芋道 Kong 极简入门(微服务网关)》](http://www.iocoder.cn/Kong/install/?github) 对应 [lab-56](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-56)

## 配置中心

* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05-spring-cloud-alibaba-nacos-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05-spring-cloud-alibaba-nacos-config)
* [《芋道 Spring Cloud 配置中心 Apollo 入门》](http://www.iocoder.cn/Spring-Cloud/Apollo/?github) 对应 [labx-09-spring-cloud-apollo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-09-spring-cloud-apollo)
* [《芋道 Spring Cloud 配置中心 Spring Cloud Config 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Config/?github) 对应 [labx-12-spring-cloud-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-12-spring-cloud-config)
* [《芋道 Spring Cloud 配置中心 Zookeeper 入门》](http://www.iocoder.cn/Spring-Cloud/ZooKeeper-Config/?github) 对应 [labx-26](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-26)
* [《芋道 Spring Cloud 配置中心 Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Consul-Config/?github) 对应 [labx-28](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-28)
* [《芋道 Spring Cloud 配置中心 Etcd 入门》](http://www.iocoder.cn/Spring-Cloud/Etcd/?github)

## 消息队列

**Spring Cloud Stream**
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10-spring-cloud-stream-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10-spring-cloud-stream-rabbitmq)
* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11-spring-cloud-stream-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11-spring-cloud-stream-kafka)
* [《芋道 Spring Cloud 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Cloud/ActiveMQ/?github)

**Spring Cloud Bus**
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 Spring Cloud 事件总线 Bus RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-RabbitMQ/?github) 对应 [labx-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-19)
* [《芋道 Spring Cloud 事件总线 Bus Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Kafka/?github) 对应 [labx-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-18)
* [《芋道 Spring Cloud 事件总线 Bus Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Consul/?github) 对应 [labx-29-spring-cloud-consul-bus](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-29-spring-cloud-consul-bus)

## 分布式事务

* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github) 对应 [labx-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-17)

## 监控管理

* [《芋道 Spring Boot 异常管理平台 Sentry 入门》](http://www.iocoder.cn/Spring-Boot/Sentry/?github) 对应 [lab-51](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-51)
* [《芋道 Spring Boot 监控端点 Actuator 入门》](http://www.iocoder.cn/Spring-Boot/Actuator/?github) 对应 [lab-34](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-34)
* [《芋道 Spring Cloud 监控工具 Admin 入门》](http://www.iocoder.cn/Spring-Cloud/SB-Admin/?github) 对应 [labx-15](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-15)
* [《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》](http://www.iocoder.cn/Spring-Boot/Prometheus-and-Grafana/?github) 对应 [lab-36](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-36)

## 持续交付

* [《芋道 Spring Cloud 持续交付 Jenkins 入门》](http://www.iocoder.cn/Spring-Cloud/Jenkins/?github) 对应 [labx-16](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-16)
* [《芋道 Spring Boot 单元测试 Test 入门》](http://www.iocoder.cn/Spring-Boot/Unit-Test/?github) 对应 [lab-42](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-42)
* 《芋道 Spring Cloud 容器 Docker 入门》计划中...

## 链路追踪

* [《芋道 Spring Cloud 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Cloud/SkyWalking/?github) 对应 [labx-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-14)
* [《芋道 Spring Cloud 链路追踪 Spring Cloud Sleuth》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 对应 [labx-13](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-13)

# Dubbo 专栏

## 基础入门

* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30)
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
* [《性能测试 —— Dubbo 基准测试》](http://www.iocoder.cn/Performance-Testing/Dubbo-benchmark/?github)
* [《芋道 Dubbo Swagger 快速入门》](http://www.iocoder.cn/Dubbo/Swagger/?github) 对应 [swagger-dubbo](https://github.com/YunaiV/swagger-dubbo)

## 注册中心

**[Zookeeper](http://www.iocoder.cn/Zookeeper/install/?github)**
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github)的[「2. XML 配置」](#)和[「3. 注解配置」](#)小节

**[Nacos](http://www.iocoder.cn/Nacos/install/?github)**
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github)的[「6. 整合 Nacos」](#)小节
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github)的[「2. 快速入门」](#)小节

## 服务容错

**[Sentinel](http://www.iocoder.cn/Sentinel/install/?github)**
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github)的[「7. 整合 Sentinel」](#)小节
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github)的[「6. 整合 Sentinel」](#)小节

**[Hystrix](http://www.iocoder.cn/categories/Hystrix/?github)**
* [《芋道 Spring Boot 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Boot/Hystrix/?github)的[「6. 集成到 Dubbo」](#)小节
* [《芋道 Spring Cloud Netflix 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Hystrix/?github)的[「10. 集成到 Dubbo」](#)小节

**[Resilience4j](http://www.iocoder.cn/categories/Resilience4j/?github)**
* [《芋道 Spring Boot 服务容错 Resilience4j 入门》](http://www.iocoder.cn/Spring-Boot/Resilience4j/?github)的[「10. 集成到 Dubbo」](#)小节

## API 网关

* [《芋道 Soul 极简入门(国产微服务网关)》](http://www.iocoder.cn/Soul/install/?github)的[「3. 接入 Dubbo 应用」](#)小节

## 分布式事务

**[Seata](http://www.iocoder.cn/Seata/install/?github)**
* [《芋道 Dubbo 分布式事务 Seata 入门》](http://www.iocoder.cn/Dubbo/Seata/?github) 对应 [lab-53](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-53)
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github)的[「2. AT 模式 + Dubbo」](#)小节

**[TCC Transaction](http://www.iocoder.cn/categories/TCC-Transaction/?github)**
* [《TCC-Transaction 源码分析 —— Dubbo 支持》](http://www.iocoder.cn/TCC-Transaction/dubbo-support/?self)

## 链路追踪

**[SkyWalking](http://www.iocoder.cn/SkyWalking/install/?github)**
* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 的[「16. Dubbo 示例」](#)小节
* [《芋道 Spring Cloud 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Cloud/SkyWalking/?github) 的[「7. Dubbo 示例」](#)小节

**[Zipkin](http://www.iocoder.cn/Zipkin/install/?github)**
* [《芋道 Spring Boot 链路追踪 Zipkin》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 的[「13. Dubbo 示例」](#)小节
* [《芋道 Spring Cloud 链路追踪 Spring Cloud Sleuth》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 的[「7. Dubbo 示例」](#)小节

## 监控管理

**[CAT](http://www.iocoder.cn/CAT/install/?github)**
* [《芋道 Spring Boot 监控平台 CAT 入门》](http://www.iocoder.cn/Spring-Boot/CAT/?github) 的[「13. Dubbo 集成」](#)小节

**[Dubbo Admin](http://www.iocoder.cn/Dubbo/Admin/?github)**
* [《芋道 Dubbo Admin 快速入门》](http://www.iocoder.cn/Dubbo/Admin/?github)

# 消息队列 MQ 专栏

## RocketMQ

* [《RocketMQ 极简入门》](http://www.iocoder.cn/RocketMQ/install/?github)
* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 对应 [lab-31](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-31)
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 RocketMQ 源码解析系列》](http://www.iocoder.cn/categories/RocketMQ/?github)
* [《性能测试 —— RocketMQ 基准测试》](http://www.iocoder.cn/Performance-Testing/RocketMQ-benchmark/?github)
* [《RocketMQ 书单整理》](http://www.iocoder.cn/Books/RocketMQ-books-recommended/?github)

## RabbitMQ

* [《RabbitMQ 极简入门》](http://www.iocoder.cn/RabbitMQ/install/?github)
* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04-rabbitmq)
* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10-spring-cloud-stream-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10-spring-cloud-stream-rabbitmq)
* [《芋道 Spring Cloud 事件总线 Bus RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-RabbitMQ/?github) 对应 [labx-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-19)
* [《RabbitMQ 书单整理》](http://www.iocoder.cn/Books/RabbitMQ-books-recommended/?github)

## Kafka

* [《Kafka 极简入门》](http://www.iocoder.cn/Kafka/install/?github)
* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03)
* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11-spring-cloud-stream-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11-spring-cloud-stream-kafka)
* [《芋道 Spring Cloud 事件总线 Bus Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Kafka/?github) 对应 [labx-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-18)
* [《Kafka 书单整理》](http://www.iocoder.cn/Books/Kafka-books-recommended/?github)

## ActiveMQ

* [《ActiveMQ 极简入门》](http://www.iocoder.cn/ActiveMQ/install/?github)
* [《芋道 Spring Boot 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Boot/ActiveMQ/?github) 对应 [lab-32](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-32)
* [《芋道 Spring Cloud 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Cloud/ActiveMQ/?github)

# 分布式事务专栏

目前分布式事务的解决方案有 AT、TCC、Saga、MQ、XA、BED 六种。

## AT 方案

* [《芋道 Spring Boot 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Boot/Seata/?github)的[「2. AT 模式 + 多数据源」](#)小节,实现单体 Spring Boot 项目在多数据源下的分布式事务
* [《芋道 Spring Boot 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Boot/Seata/?github)的[「AT 模式 + HttpClient 远程调用」](#)小节,实现多个 Spring Boot 项目的分布式事务
* [《芋道 Dubbo 分布式事务 Seata 入门》](http://www.iocoder.cn/Dubbo/Seata/?github) 的[「2. AT 模式」](#)小节,实现多个 Dubbo 服务的分布式事务。
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github)的[「3. AT 模式 + Feign」](#)小节,实现多个 Spring Cloud 服务下的分布式事务。

## TCC 方案

* [《TCC-Transaction 源码解析系列》](http://www.iocoder.cn/categories/TCC-Transaction/?github)

## Saga 方案

## MQ 方案

* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 的[「9. 事务消息」](#)小节
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 的[「10. 事务消息」](#)小节
* [《RocketMQ 源码分析 —— 事务消息》](http://www.iocoder.cn/RocketMQ/message-transaction/?github)

## XA 方案

* [《MyCAT 源码分析 —— XA分布式事务》](http://www.iocoder.cn/MyCAT/xa-distributed-transaction/?github)

## BED 方案

* [《Sharding-JDBC 源码分析 —— 分布式事务(一)之最大努力型》](http://www.iocoder.cn/Sharding-JDBC/transaction-bed/?github)

---------

如下是草稿目录,未来需要整理下

# lab-50

Email 示例

# lab-69-proxy

动态代理


================================================
FILE: httpRequests/2020-12-20T004250.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T004328.500.json
================================================
{
  "timestamp": "2020-12-19T16:43:28.332+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T004337.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T004347.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T004347.500.json
================================================
{
  "timestamp": "2020-12-19T16:43:47.777+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T004358.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T004358.500.json
================================================
{
  "timestamp": "2020-12-19T16:43:58.210+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T004401.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T004401.500.json
================================================
{
  "timestamp": "2020-12-19T16:44:01.275+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T004538.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T004547.500.json
================================================
{
  "timestamp": "2020-12-19T16:45:47.364+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T004638.500.json
================================================
{
  "timestamp": "2020-12-19T16:46:38.505+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T004645.500.json
================================================
{
  "timestamp": "2020-12-19T16:46:45.875+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T004809.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T004813.500.json
================================================
{
  "timestamp": "2020-12-19T16:48:13.674+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T010724.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T010738.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T010809.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T010823.500.json
================================================
{
  "timestamp": "2020-12-19T17:08:23.036+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T010840.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T011020.500.json
================================================
{
  "timestamp": "2020-12-19T17:10:20.615+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你的账号密码不正确哟!",
  "path": "/user/login"
}


================================================
FILE: httpRequests/2020-12-20T011347.500.json
================================================
{
  "timestamp": "2020-12-19T17:13:47.777+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你没有登录哟!",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T011526.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T011530.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T011541.400.json
================================================
{
  "timestamp": "2020-12-19T17:15:40.992+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "Missing request header 'Authorization' for method parameter of type String",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T011551.500.json
================================================
{
  "timestamp": "2020-12-19T17:15:51.919+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你没有登录哟!",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T011556.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T011628-1.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T011628.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T011646.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T011650.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T011653.500.json
================================================
{
  "timestamp": "2020-12-19T17:16:53.489+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你没有登录哟!",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T011818.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T011843.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T011847.500.json
================================================
{
  "timestamp": "2020-12-19T17:18:47.862+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你没有登录哟!",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T012507.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T012510.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T012527.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T012540.400.json
================================================
{
  "timestamp": "2020-12-19T17:25:40.604+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "Missing request header 'Authorization' for method parameter of type String",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T012544.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T012703.500.json
================================================
{
  "timestamp": "2020-12-19T17:27:03.272+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你没有登录哟!",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T012708.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T012710.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T013544.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T013552.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T013558.500.json
================================================
{
  "timestamp": "2020-12-19T17:35:58.033+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "小朋友,你没有登录哟!",
  "path": "/user/get-current"
}


================================================
FILE: httpRequests/2020-12-20T013845.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/2020-12-20T014019.200.json
================================================
{
  "gender": 1,
  "nickname": "芋道源码",
  "id": 1
}


================================================
FILE: httpRequests/2020-12-20T021415.200.json
================================================
{
  "userId": 1,
  "token": "token001"
}


================================================
FILE: httpRequests/http-client.cookies
================================================
# domain	path	name	value	date


================================================
FILE: httpRequests/http-requests-log.http
================================================
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T021415.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T014019.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T013845.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: 1

<> 2020-12-20T013558.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T013552.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T013544.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T012710.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T012708.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: {{token_from_server}}

<> 2020-12-20T012703.500.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: {{token_from_server}}

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T012544.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true

<> 2020-12-20T012540.400.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T012527.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T012510.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T012507.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: 1

<> 2020-12-20T011847.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T011843.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T011818.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: 0

<> 2020-12-20T011653.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T011650.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T011646.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T011628-1.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T011628.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T011556.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: {{token_from_server1}}

<> 2020-12-20T011551.500.json

###

GET http://127.0.0.1:8080/user/get-current?full=true

<> 2020-12-20T011541.400.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001

<> 2020-12-20T011530.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T011526.200.json

###

GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token002

<> 2020-12-20T011347.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T011020.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T010840.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T010823.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T010809.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T010738.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T010724.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004813.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T004809.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004645.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004638.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004547.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T004538.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004401.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T004401.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004358.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T004358.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004347.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T004347.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T004337.200.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=buzhidao

<> 2020-12-20T004328.500.json

###

POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded

username=yudaoyuanma&password=123456

<> 2020-12-20T004250.200.json

###



================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-01-springsecurity-demo</artifactId>

    <dependencies>
        <!-- 实现对 Spring MVC 的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 实现对 Spring Security 的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
================================================
package cn.iocoder.springboot.lab01.springsecurity;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/admin")
public class AdminController {

    @GetMapping("/demo")
    public String demo() {
        return "示例返回";
    }

}


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/resources/application.yaml
================================================
spring:
  # Spring Security 配置项,对应 SecurityProperties 配置类
  security:
    # 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。
    user:
      name: user # 账号
      password: user # 密码
      roles: ADMIN # 拥有角色


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-01-springsecurity-demo-role</artifactId>

    <dependencies>
        <!-- 实现对 Spring MVC 的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 实现对 Spring Security 的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
================================================
package cn.iocoder.springboot.lab01.springsecurity;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                // 配置请求地址的权限
                .authorizeRequests()
                    .antMatchers("/test/demo").permitAll() // 所有用户可访问
                    .antMatchers("/test/admin").hasRole("ADMIN") // 需要 ADMIN 角色
                    .antMatchers("/test/normal").access("hasRole('ROLE_NORMAL')") // 需要 NORMAL 角色。
                    // 任何请求,访问的用户都需要经过认证
                    .anyRequest().authenticated()
                .and()
                // 设置 Form 表单登陆
                .formLogin()
//                    .loginPage("/login") // 登陆 URL 地址
                    .permitAll() // 所有用户可访问
                .and()
                // 配置退出相关
                .logout()
//                    .logoutUrl("/logout") // 退出 URL 地址
                    .permitAll(); // 所有用户可访问
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.
                // 使用内存中的 InMemoryUserDetailsManager
                inMemoryAuthentication()
                // 不使用 PasswordEncoder 密码编码器
                .passwordEncoder(NoOpPasswordEncoder.getInstance())
                // 配置 admin 用户
                .withUser("admin").password("admin").roles("ADMIN")
                // 配置 normal 用户
                .and().withUser("normal").password("normal").roles("NORMAL");
    }

}


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.security.PermitAll;

@RestController
@RequestMapping("/demo")
public class DemoController {

    @PermitAll
    @GetMapping("/echo")
    public String demo() {
        return "示例返回";
    }

    @GetMapping("/home")
    public String home() {
        return "我是首页";
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping("/admin")
    public String admin() {
        return "我是管理员";
    }

    @PreAuthorize("hasRole('ROLE_NORMAL')")
    @GetMapping("/normal")
    public String normal() {
        return "我是普通用户";
    }

}


================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/demo")
    public String demo() {
        return "示例返回";
    }

    @GetMapping("/home")
    public String home() {
        return "我是首页";
    }

    @GetMapping("/admin")
    public String admin() {
        return "我是管理员";
    }

    @GetMapping("/normal")
    public String normal() {
        return "我是普通用户";
    }

}


================================================
FILE: lab-01-spring-security/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>labs-parent</artifactId>
        <groupId>cn.iocoder.springboot.labs</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-02-spring-security</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>lab-01-springsecurity-demo</module>
        <module>lab-01-springsecurity-demo-role</module>
    </modules>


</project>


================================================
FILE: lab-01-spring-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md
================================================
<http://www.iocoder.cn/Spring-Boot/Spring-Security/?github>


================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>authorization-code-server</artifactId>

    <dependencies>
        <!-- for Spring MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>

    </dependencies>

</project>

================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java
================================================
package cn.iocoder.springboot.labs.lab01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package cn.iocoder.springboot.labs.lab01.authorization;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientapp").secret("112233") // Client 账号、密码。
                .redirectUris("http://localhost:9001/callback") // 配置回调地址,选填。
                .authorizedGrantTypes("authorization_code") // 授权码模式
                .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
//                .and().withClient() // 可以继续配置新的 Client
                ;
    }

}

================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java
================================================
package cn.iocoder.springboot.labs.lab01.resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 对 "/api/**" 开启认证
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**");
    }

}

// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。

================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java
================================================
package cn.iocoder.springboot.labs.lab01.resource.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 示例模块 Controller
 */
@RestController
@RequestMapping("/api/example")
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024

================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>client-credentials-server</artifactId>

    <dependencies>
        <!-- for Spring MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>

    </dependencies>


</project>

================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/Application.java
================================================
package lab01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientapp").secret("112233") // Client 账号、密码。
                .authorizedGrantTypes("client_credentials") // 授权码模式
                .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
//                .and().withClient() // 可以继续配置新的 Client
                ;
    }

}

================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 对 "/api/**" 开启认证
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**");
    }

}

// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。

================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 示例模块 Controller
 */
@RestController
@RequestMapping("/api/example")
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

================================================
FILE: lab-02-spring-security-oauth/implicit-server/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>implicit-server</artifactId>

    <dependencies>
        <!-- for Spring MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>

    </dependencies>

</project>

================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/Application.java
================================================
package lab01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientapp").secret("112233") // Client 账号、密码。
                .redirectUris("http://localhost:9001/callback") // 配置回调地址,选填。
                .authorizedGrantTypes("implicit") // 授权码模式
                .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
//                .and().withClient() // 可以继续配置新的 Client
                ;
    }

}

================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 对 "/api/**" 开启认证
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**")
//                .and()
//                .cors()
        ;
    }

}

// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。

================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 示例模块 Controller
 */
@RestController
@RequestMapping("/api/example")
public class ExampleController {

//    @CrossOrigin
    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024

================================================
FILE: lab-02-spring-security-oauth/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>labs-parent</artifactId>
        <groupId>cn.iocoder.springboot.labs</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-02-spring-security-oauth</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>authorization-code-server</module>
        <module>resource-owner-password-credentials-server</module>
        <module>implicit-server</module>
        <module>client-credentials-server</module>
        <module>resource-owner-password-credentials-server-with-refresh-token</module>
        <module>resource-owner-password-credentials-server-with-revoke-token</module>
        <module>resource-owner-password-credentials-server-by-jdbc-token-store</module>
    </modules>


</project>


================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>resource-owner-password-credentials-server</artifactId>

    <dependencies>
        <!-- for Spring MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>

    </dependencies>

</project>

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/Application.java
================================================
package lab01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    // 用户认证
    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientapp").secret("112233") // Client 账号、密码。
                .authorizedGrantTypes("password") // 密码模式
                .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
//                .and().withClient() // 可以继续配置新的 Client
                ;
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 对 "/api/**" 开启认证
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**");
    }

}

// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 示例模块 Controller
 */
@RestController
@RequestMapping("/api/example")
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>resource-owner-password-credentials-server-by-jdbc-token-store</artifactId>

    <dependencies>
        <!-- for Spring MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>

        <!-- jdbc token store -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>


    </dependencies>

</project>

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java
================================================
package lab02;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java
================================================
package lab02.authorization;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JdbcTokenStore;

import javax.sql.DataSource;

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private Environment env;

    // 用户认证
    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore()) // 设置 tokenStore
                .authenticationManager(authenticationManager); // 设置 authenticationManager
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//        clients.inMemory()
//                .withClient("clientapp").secret("112233") // Client 账号、密码。
//                .authorizedGrantTypes("password") // 密码模式
//                .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
////                .and().withClient() // 可以继续配置新的 Client
//                ;

        // 加载 ClientDetails
        clients.jdbc(dataSource());
    }

    @Bean
    public DataSource dataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));
        return dataSource;
    }

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource());
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java
================================================
package lab02.resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 对 "/api/**" 开启认证
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**");
    }

}

// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java
================================================
package lab02.resource.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 示例模块 Controller
 */
@RestController
@RequestMapping("/api/example")
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024

##################### MySQL #####################
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:33061/oauth2
jdbc.user=root
jdbc.pass=123456

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/data.sql
================================================
INSERT INTO oauth_client_details
	(client_id, client_secret, scope, authorized_grant_types,
	web_server_redirect_uri, authorities, access_token_validity,
	refresh_token_validity, additional_information, autoapprove)
VALUES
	('fooClientIdPassword', 'secret', 'foo,read,write',
	'password,authorization_code,refresh_token', null, null, 36000, 36000, null, true);
INSERT INTO oauth_client_details
	(client_id, client_secret, scope, authorized_grant_types,
	web_server_redirect_uri, authorities, access_token_validity,
	refresh_token_validity, additional_information, autoapprove)
VALUES
	('sampleClientId', 'secret', 'read,write,foo,bar',
	'implicit', null, null, 36000, 36000, null, false);
INSERT INTO oauth_client_details
	(client_id, client_secret, scope, authorized_grant_types,
	web_server_redirect_uri, authorities, access_token_validity,
	refresh_token_validity, additional_information, autoapprove)
VALUES
	('barClientIdPassword', 'secret', 'bar,read,write',
	'password,authorization_code,refresh_token', null, null, 36000, 36000, null, true);

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql
================================================
--------------- MySQL ---------------
drop table if exists oauth_client_details;
create table oauth_client_details (
  client_id VARCHAR(255) PRIMARY KEY,
  resource_ids VARCHAR(255),
  client_secret VARCHAR(255),
  scope VARCHAR(255),
  authorized_grant_types VARCHAR(255),
  web_server_redirect_uri VARCHAR(255),
  authorities VARCHAR(255),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additional_information VARCHAR(4096),
  autoapprove VARCHAR(255)
);

create table if not exists oauth_client_token (
  token_id VARCHAR(255),
  token LONG VARBINARY,
  authentication_id VARCHAR(255) PRIMARY KEY,
  user_name VARCHAR(255),
  client_id VARCHAR(255)
);

create table if not exists oauth_access_token (
  token_id VARCHAR(255),
  token LONG VARBINARY,
  authentication_id VARCHAR(255) PRIMARY KEY,
  user_name VARCHAR(255),
  client_id VARCHAR(255),
  authentication LONG VARBINARY,
  refresh_token VARCHAR(255)
);

create table if not exists oauth_refresh_token (
  token_id VARCHAR(255),
  token LONG VARBINARY,
  authentication LONG VARBINARY
);

create table if not exists oauth_code (
  code VARCHAR(255), authentication LONG VARBINARY
);

create table if not exists oauth_approvals (
	userId VARCHAR(255),
	clientId VARCHAR(255),
	scope VARCHAR(255),
	status VARCHAR(10),
	expiresAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	lastModifiedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

create table if not exists ClientDetails (
  appId VARCHAR(255) PRIMARY KEY,
  resourceIds VARCHAR(255),
  appSecret VARCHAR(255),
  scope VARCHAR(255),
  grantTypes VARCHAR(255),
  redirectUrl VARCHAR(255),
  authorities VARCHAR(255),
  access_token_validity INTEGER,
  refresh_token_validity INTEGER,
  additionalInformation VARCHAR(4096),
  autoApproveScopes VARCHAR(255)
);

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>resource-owner-password-credentials-server-with-refresh-token</artifactId>

    <dependencies>
        <!-- for Spring MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>

    </dependencies>

</project>

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java
================================================
package lab01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    // 用户认证
    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientapp").secret("112233") // Client 账号、密码。
                .authorizedGrantTypes("password", "refresh_token") // 密码模式
                .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
                .refreshTokenValiditySeconds(1200) // 1200 秒过期
//                .and().withClient() // 可以继续配置新的 Client
                ;
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 对 "/api/**" 开启认证
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**");
    }

}

// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 示例模块 Controller
 */
@RestController
@RequestMapping("/api/example")
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>resource-owner-password-credentials-server-with-revoke-token</artifactId>

    <dependencies>
        <!-- for Spring MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- for Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- for OAuth 2.0 -->
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>

    </dependencies>

</project>

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java
================================================
package lab2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java
================================================
package lab2.authorization;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    // 用户认证
    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientapp").secret("112233") // Client 账号、密码。
                .authorizedGrantTypes("password", "refresh_token") // 密码模式
                .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
                .refreshTokenValiditySeconds(1200) // 1200 秒过期
//                .and().withClient() // 可以继续配置新的 Client
                ;
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java
================================================
package lab2.authorization.token;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken;
import org.springframework.security.oauth2.provider.token.ConsumerTokenServices;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TokenController {

    @Autowired
    private ConsumerTokenServices tokenServices;
    @Autowired(required = false)
    private TokenStore tokenStore;

    @RequestMapping(method = RequestMethod.POST, value = "api/access_token/revoke")
    public String revokeToken(@RequestParam("token") String token) {
        tokenServices.revokeToken(token);
        return token;
    }

    @RequestMapping(method = RequestMethod.POST, value = "api/refresh_token/revoke")
    public String revokeRefreshToken(@RequestParam("token") String token) {
        tokenStore.removeRefreshToken(new DefaultOAuth2RefreshToken(token));
        return token;
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java
================================================
package lab2.resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 对 "/api/**" 开启认证
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                .antMatchers("/api/**");
    }

}

// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java
================================================
package lab2.resource.api;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 示例模块 Controller
 */
@RestController
@RequestMapping("/api/example")
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        return "world";
    }

}

================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024

================================================
FILE: lab-02-spring-security-oauth/《芋道 Spring Security OAuth2 入门(新)》.md
================================================
<http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github>

对应 [lab-68](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68) 示例。


================================================
FILE: lab-02-spring-security-oauth/《芋道 Spring Security OAuth2 入门(老)》.md
================================================
<http://www.iocoder.cn/Spring-Security/OAuth2-learning-old/?github>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-demo</artifactId>

    <dependencies>
        <!-- 引入 Spring-Kafka 依赖 -->
        <!-- 已经内置 kafka-clients 依赖,所以无需重复引入 -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <!-- 实现对 JSON 的自动化配置 -->
        <!-- 因为,Kafka 对复杂对象的 Message 序列化时,我们会使用到 JSON -->
        <!--
            同时,spring-boot-starter-json 引入了 spring-boot-starter ,而 spring-boot-starter 又引入了 spring-boot-autoconfigure 。
            spring-boot-autoconfigure 实现了 Spring-Kafka 的自动化配置
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.listener.*;
import org.springframework.util.backoff.BackOff;
import org.springframework.util.backoff.FixedBackOff;

@Configuration
public class KafkaConfiguration {

    @Bean
    @Primary
    public ErrorHandler kafkaErrorHandler(KafkaTemplate<?, ?> template) {
        // 创建 DeadLetterPublishingRecoverer 对象
        ConsumerRecordRecoverer recoverer = new DeadLetterPublishingRecoverer(template);
        // 创建 FixedBackOff 对象
        BackOff backOff = new FixedBackOff(10 * 1000L, 3L);
        // 创建 SeekToCurrentErrorHandler 对象
        return new SeekToCurrentErrorHandler(recoverer, backOff);
    }

//    @Bean
//    @Primary
//    public BatchErrorHandler kafkaBatchErrorHandler() {
//        // 创建 SeekToCurrentBatchErrorHandler 对象
//        SeekToCurrentBatchErrorHandler batchErrorHandler = new SeekToCurrentBatchErrorHandler();
//        // 创建 FixedBackOff 对象
//        BackOff backOff = new FixedBackOff(10 * 1000L, 3L);
//        batchErrorHandler.setBackOff(backOff);
//        // 返回
//        return batchErrorHandler;
//    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo01Message;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class Demo01AConsumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo01Message.TOPIC,
            groupId = "demo01-A-consumer-group-" + Demo01Message.TOPIC)
    public void onMessage(ConsumerRecord<Integer, String> record) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), record);
    }

//    @KafkaListener(topics = Demo01Message.TOPIC,
//            groupId = "demo01-B-consumer-group-" + Demo01Message.TOPIC)
//    public void onMessage(ConsumerRecord<Integer, String> record) throws InterruptedException {
//        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), record.partition());
//        Thread.sleep(10 * 1000L);
//        Thread.sleep(1L);
//        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), record.partition());
//    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo01Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class Demo01Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo01Message.TOPIC,
            groupId = "demo01-consumer-group-" + Demo01Message.TOPIC)
    public void onMessage(Demo01Message message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo04Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicInteger;

@Component
public class Demo04Consumer {

    private AtomicInteger count = new AtomicInteger(0);

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo04Message.TOPIC,
            groupId = "demo04-consumer-group-" + Demo04Message.TOPIC)
    public void onMessage(Demo04Message message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
        // 注意,此处抛出一个 RuntimeException 异常,模拟消费失败
        throw new RuntimeException("我就是故意抛出一个异常");
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 01 的 Message 消息
 */
public class Demo01Message {

    public static final String TOPIC = "DEMO_01";

    /**
     * 编号
     */
    private Integer id;

    public Demo01Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo01Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 04 的 Message 消息
 */
public class Demo04Message {

    public static final String TOPIC = "DEMO_04";

    /**
     * 编号
     */
    private Integer id;

    public Demo04Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo04Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo01Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;

@Component
public class Demo01Producer {

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException {
        // 创建 Demo01Message 消息
        Demo01Message message = new Demo01Message();
        message.setId(id);
        // 同步发送消息
        return kafkaTemplate.send(Demo01Message.TOPIC, message).get();
    }

    public ListenableFuture<SendResult<Object, Object>> asyncSend(Integer id) {
        // 创建 Demo01Message 消息
        Demo01Message message = new Demo01Message();
        message.setId(id);
        // 异步发送消息
        return kafkaTemplate.send(Demo01Message.TOPIC, message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo04Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;

@Component
public class Demo04Producer {

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException {
        // 创建 Demo04Message 消息
        Demo04Message message = new Demo04Message();
        message.setId(id);
        // 同步发送消息
        return kafkaTemplate.send(Demo04Message.TOPIC, message).get();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/resources/application.yaml
================================================
spring:
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
    # Kafka Consumer 配置项
    consumer:
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/resources/application_bak.yaml
================================================
spring:
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      batch-size: 16384 # 每次批量发送消息的最大数量
      buffer-memory: 33554432 # 每次批量发送消息的最大内存
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
    # Kafka Consumer 配置项
    consumer:
      enable-auto-commit: false # true-使用 kafka 默认自带的提交模式。false-使用 Spring-Kafka 的自动提交 offset 机制。建议设置为 false 使用 kafka-spring 的机制,分析见 https://juejin.im/entry/5a6e8dea518825732472710c 。
      auto-commit-interval: 1000 # 在开启 enable-auto-commit 时,自动提交消费进度频率,单位:毫秒。如果 enable-auto-commit 为 false 时候,可以不设置
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      concurrency: 10 # 每个消费者监听器最大并发数,默认为 1 。可以通过设置 n ,这样对于每个监听器就会使用 n 个线程消费消息,提高整体消费速度。详细可参考博客 https://www.jianshu.com/p/ad0e5424edbd 理解。


logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.concurrent.ListenableFutureCallback;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo01ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo01Producer producer;

    @Test
    public void testSyncSend() throws ExecutionException, InterruptedException {
        int id = (int) (System.currentTimeMillis() / 1000);
        SendResult result = producer.syncSend(id);
        logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

    @Test
    public void testASyncSend() throws InterruptedException {
        int id = (int) (System.currentTimeMillis() / 1000);
        producer.asyncSend(id).addCallback(new ListenableFutureCallback<SendResult<Object, Object>>() {

            @Override
            public void onFailure(Throwable e) {
                logger.info("[testASyncSend][发送编号:[{}] 发送异常]]", id, e);
            }

            @Override
            public void onSuccess(SendResult<Object, Object> result) {
                logger.info("[testASyncSend][发送编号:[{}] 发送成功,结果为:[{}]]", id, result);
            }

        });

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }
//
//    @Test
//    public void testOnewaySend() throws InterruptedException {
//        int id = (int) (System.currentTimeMillis() / 1000);
//        producer.onewaySend(id);
//        logger.info("[testOnewaySend][发送编号:[{}] 发送完成]", id);
//
//        // 阻塞等待,保证消费
//        new CountDownLatch(1).await();
//    }

//    @Test
//    public void testSyncSendMore() throws ExecutionException, InterruptedException {
//        for (int i = 0; i < 1000; i++) {
//            int id = (int) (System.currentTimeMillis() / 1000);
//            SendResult result = producer.syncSend(id);
//            logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);
//            Thread.sleep(10);
//        }
//
//        // 阻塞等待,保证消费
//        new CountDownLatch(1).await();
//    }
//
//    @Test
//    public void block() throws InterruptedException {
//        // 阻塞等待,保证消费
//        new CountDownLatch(1).await();
//    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo04ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo04Producer producer;

    @Test
    public void testSyncSend() throws ExecutionException, InterruptedException {
        int id = (int) (System.currentTimeMillis() / 1000);
        SendResult result = producer.syncSend(id);
        logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

    @Test
    public void testSyncSendX() throws ExecutionException, InterruptedException {
        for (int i = 0; i < 100; i++) {
            int id = (int) (System.currentTimeMillis() / 1000);
            SendResult result = producer.syncSend(id);
            logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);
            Thread.sleep(10 * 1000L);
        }

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-demo-ack</artifactId>

    <dependencies>
        <!-- 引入 Spring-Kafka 依赖 -->
        <!-- 已经内置 kafka-clients 依赖,所以无需重复引入 -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <!-- 实现对 JSON 的自动化配置 -->
        <!-- 因为,Kafka 对复杂对象的 Message 序列化时,我们会使用到 JSON -->
        <!--
            同时,spring-boot-starter-json 引入了 spring-boot-starter ,而 spring-boot-starter 又引入了 spring-boot-autoconfigure 。
            spring-boot-autoconfigure 实现了 Spring-Kafka 的自动化配置
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo08Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo08Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.stereotype.Component;

@Component
public class Demo08Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo08Message.TOPIC,
            groupId = "demo08-consumer-group-" + Demo08Message.TOPIC)
    public void onMessage(Demo08Message message, Acknowledgment acknowledgment) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
        // 提交消费进度
        if (message.getId() % 2 == 1) {
            acknowledgment.acknowledge();
        }
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo08Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 08 的 Message 消息
 */
public class Demo08Message {

    public static final String TOPIC = "DEMO_08";

    /**
     * 编号
     */
    private Integer id;

    public Demo08Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo08Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo08Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;

@Component
public class Demo08Producer {

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException {
        // 创建 Demo08Message 消息
        Demo08Message message = new Demo08Message();
        message.setId(id);
        // 同步发送消息
        return kafkaTemplate.send(Demo08Message.TOPIC, message).get();
    }
    
}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/resources/application.yaml
================================================
spring:
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
    # Kafka Consumer 配置项
    consumer:
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      enable-auto-commit: false # 使用 Spring-Kafka 的消费进度的提交机制
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错
      ack-mode: MANUAL

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.concurrent.ListenableFutureCallback;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo08ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo08Producer producer;

    @Test
    public void testSyncSend() throws ExecutionException, InterruptedException {
        for (int id = 1; id <= 2; id++) {
            SendResult result = producer.syncSend(id);
            logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);
        }

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-demo-batch</artifactId>

    <dependencies>
        <!-- 引入 Spring-Kafka 依赖 -->
        <!-- 已经内置 kafka-clients 依赖,所以无需重复引入 -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <!-- 实现对 JSON 的自动化配置 -->
        <!-- 因为,Kafka 对复杂对象的 Message 序列化时,我们会使用到 JSON -->
        <!--
            同时,spring-boot-starter-json 引入了 spring-boot-starter ,而 spring-boot-starter 又引入了 spring-boot-autoconfigure 。
            spring-boot-autoconfigure 实现了 Spring-Kafka 的自动化配置
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo02Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class Demo02Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo02Message.TOPIC,
            groupId = "demo02-consumer-group-" + Demo02Message.TOPIC)
    public void onMessage(Demo02Message message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 01 的 Message 消息
 */
public class Demo02Message {

    public static final String TOPIC = "DEMO_02";

    /**
     * 编号
     */
    private Integer id;

    public Demo02Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo01Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo02Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;

import javax.annotation.Resource;

@Component
public class Demo02Producer {

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public ListenableFuture<SendResult<Object, Object>> asyncSend(Integer id) {
        // 创建 Demo02Message 消息
        Demo02Message message = new Demo02Message();
        message.setId(id);
        // 异步发送消息
        return kafkaTemplate.send(Demo02Message.TOPIC, message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/resources/application.yaml
================================================
spring:
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
      batch-size: 16384 # 每次批量发送消息的最大数量
      buffer-memory: 33554432 # 每次批量发送消息的最大内存
      properties:
        linger:
          ms: 30000 # 批处理延迟时间上限。这里配置为 30 * 1000 ms 过后,不管是否消息数量是否到达 batch-size 或者消息大小到达 buffer-memory 后,都直接发送一次请求。
    # Kafka Consumer 配置项
    consumer:
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.concurrent.ListenableFutureCallback;

import java.util.concurrent.CountDownLatch;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo02ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo02Producer producer;

    @Test
    public void testASyncSend() throws InterruptedException {
        logger.info("[testASyncSend][开始执行]");

        for (int i = 0; i < 3; i++) {
            int id = (int) (System.currentTimeMillis() / 1000);
            producer.asyncSend(id).addCallback(new ListenableFutureCallback<SendResult<Object, Object>>() {

                @Override
                public void onFailure(Throwable e) {
                    logger.info("[testASyncSend][发送编号:[{}] 发送异常]]", id, e);
                }

                @Override
                public void onSuccess(SendResult<Object, Object> result) {
                    logger.info("[testASyncSend][发送编号:[{}] 发送成功,结果为:[{}]]", id, result);
                }

            });

            // 故意每条消息之间,隔离 10 秒
            Thread.sleep(10 * 1000L);
        }

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-demo-batch-consume</artifactId>

    <dependencies>
        <!-- 引入 Spring-Kafka 依赖 -->
        <!-- 已经内置 kafka-clients 依赖,所以无需重复引入 -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <!-- 实现对 JSON 的自动化配置 -->
        <!-- 因为,Kafka 对复杂对象的 Message 序列化时,我们会使用到 JSON -->
        <!--
            同时,spring-boot-starter-json 引入了 spring-boot-starter ,而 spring-boot-starter 又引入了 spring-boot-autoconfigure 。
            spring-boot-autoconfigure 实现了 Spring-Kafka 的自动化配置
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo02Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class Demo02Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo02Message.TOPIC,
            groupId = "demo02-consumer-group-" + Demo02Message.TOPIC)
    public void onMessage(List<Demo02Message> messages) {
        logger.info("[onMessage][线程编号:{} 消息数量:{}]", Thread.currentThread().getId(), messages.size());
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 01 的 Message 消息
 */
public class Demo02Message {

    public static final String TOPIC = "DEMO_02";

    /**
     * 编号
     */
    private Integer id;

    public Demo02Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo01Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo02Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;

import javax.annotation.Resource;

@Component
public class Demo02Producer {

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public ListenableFuture<SendResult<Object, Object>> asyncSend(Integer id) {
        // 创建 Demo02Message 消息
        Demo02Message message = new Demo02Message();
        message.setId(id);
        // 异步发送消息
        return kafkaTemplate.send(Demo02Message.TOPIC, message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/resources/application.yaml
================================================
spring:
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
      batch-size: 16384 # 每次批量发送消息的最大数量
      buffer-memory: 33554432 # 每次批量发送消息的最大内存
      properties:
        linger:
          ms: 30000 # 批处理延迟时间上限。这里配置为 30 * 1000 ms 过后,不管是否消息数量是否到达 batch-size 或者消息大小到达 buffer-memory 后,都直接发送一次请求。
    # Kafka Consumer 配置项
    consumer:
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      fetch-max-wait: 10000 # poll 一次拉取的阻塞的最大时长,单位:毫秒。这里指的是阻塞拉取需要满足至少 fetch-min-size 条消息
      fetch-min-size: 10 # poll 一次消息拉取的最小数量
      max-poll-records: 100 # poll 一次消息拉取的最大数量
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      type: BATCH # 监听器类型,默认为 SINGLE ,只监听单条消息。这里我们配置 BATCH ,监听多条消息,批量消费
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.concurrent.ListenableFutureCallback;

import java.util.concurrent.CountDownLatch;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo02ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo02Producer producer;

    @Test
    public void testASyncSend() throws InterruptedException {
        logger.info("[testASyncSend][开始执行]");

        for (int i = 0; i < 3; i++) {
            int id = (int) (System.currentTimeMillis() / 1000);
            producer.asyncSend(id).addCallback(new ListenableFutureCallback<SendResult<Object, Object>>() {

                @Override
                public void onFailure(Throwable e) {
                    logger.info("[testASyncSend][发送编号:[{}] 发送异常]]", id, e);
                }

                @Override
                public void onSuccess(SendResult<Object, Object> result) {
                    logger.info("[testASyncSend][发送编号:[{}] 发送成功,结果为:[{}]]", id, result);
                }

            });

            // 故意每条消息之间,隔离 10 秒
            Thread.sleep(10 * 1000L);
        }

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-demo-broadcast</artifactId>

    <dependencies>
        <!-- 引入 Spring-Kafka 依赖 -->
        <!-- 已经内置 kafka-clients 依赖,所以无需重复引入 -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <!-- 实现对 JSON 的自动化配置 -->
        <!-- 因为,Kafka 对复杂对象的 Message 序列化时,我们会使用到 JSON -->
        <!--
            同时,spring-boot-starter-json 引入了 spring-boot-starter ,而 spring-boot-starter 又引入了 spring-boot-autoconfigure 。
            spring-boot-autoconfigure 实现了 Spring-Kafka 的自动化配置
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo05Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo05Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class Demo05Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo05Message.TOPIC,
            groupId = "demo05-consumer-group-" + Demo05Message.TOPIC + "-" + "#{T(java.util.UUID).randomUUID()}")
    public void onMessage(Demo05Message message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo05Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 05 的 Message 消息
 */
public class Demo05Message {

    public static final String TOPIC = "DEMO_05";

    /**
     * 编号
     */
    private Integer id;

    public Demo05Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo05Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo05Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;

@Component
public class Demo05Producer {

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException {
        // 创建 Demo05Message 消息
        Demo05Message message = new Demo05Message();
        message.setId(id);
        // 同步发送消息
        return kafkaTemplate.send(Demo05Message.TOPIC, message).get();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/resources/application.yaml
================================================
spring:
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
    # Kafka Consumer 配置项
    consumer:
      auto-offset-reset: latest # 设置消费者分组最初的消费进度为 latest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo05ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo05Producer producer;

    @Test
    public void test() throws InterruptedException {
        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

    @Test
    public void testSyncSend() throws ExecutionException, InterruptedException {
        int id = (int) (System.currentTimeMillis() / 1000);
        SendResult result = producer.syncSend(id);
        logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-demo-concurrency</artifactId>

    <dependencies>
        <!-- 引入 Spring-Kafka 依赖 -->
        <!-- 已经内置 kafka-clients 依赖,所以无需重复引入 -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <!-- 实现对 JSON 的自动化配置 -->
        <!-- 因为,Kafka 对复杂对象的 Message 序列化时,我们会使用到 JSON -->
        <!--
            同时,spring-boot-starter-json 引入了 spring-boot-starter ,而 spring-boot-starter 又引入了 spring-boot-autoconfigure 。
            spring-boot-autoconfigure 实现了 Spring-Kafka 的自动化配置
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo06Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo06Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class Demo06Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo06Message.TOPIC,
            groupId = "demo06-consumer-group-" + Demo06Message.TOPIC,
            concurrency = "2")
    public void onMessage(Demo06Message message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo06Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 06 的 Message 消息
 */
public class Demo06Message {

    public static final String TOPIC = "DEMO_06";

    /**
     * 编号
     */
    private Integer id;

    public Demo06Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo06Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo06Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;

@Component
public class Demo06Producer {

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException {
        // 创建 Demo01Message 消息
        Demo06Message message = new Demo06Message();
        message.setId(id);
        // 同步发送消息
        return kafkaTemplate.send(Demo06Message.TOPIC, message).get();
    }

    public SendResult syncSendOrderly(Integer id) throws ExecutionException, InterruptedException {
        // 创建 Demo01Message 消息
        Demo06Message message = new Demo06Message();
        message.setId(id);
        // 同步发送消息
        // 因为我们使用 String 的方式序列化 key ,所以需要将 id 转换成 String
        return kafkaTemplate.send(Demo06Message.TOPIC, String.valueOf(id), message).get();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/resources/application.yaml
================================================
spring:
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
    # Kafka Consumer 配置项
    consumer:
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo06ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo06Producer producer;

    @Test
    public void testSyncSend() throws ExecutionException, InterruptedException {
        for (int i = 0; i < 10; i++) {
            int id = (int) (System.currentTimeMillis() / 1000);
            SendResult result = producer.syncSend(id);
//        logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);
        }

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

    @Test
    public void testSyncSendOrderly() throws ExecutionException, InterruptedException {
        for (int i = 0; i < 10; i++) {
            int id = 1;
            SendResult result = producer.syncSendOrderly(id);
            logger.info("[testSyncSend][发送编号:[{}] 发送队列:[{}]]", id, result.getRecordMetadata().partition());
        }

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-demo-transaction</artifactId>

    <dependencies>
        <!-- 引入 Spring-Kafka 依赖 -->
        <!-- 已经内置 kafka-clients 依赖,所以无需重复引入 -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

        <!-- 实现对 JSON 的自动化配置 -->
        <!-- 因为,Kafka 对复杂对象的 Message 序列化时,我们会使用到 JSON -->
        <!--
            同时,spring-boot-starter-json 引入了 spring-boot-starter ,而 spring-boot-starter 又引入了 spring-boot-autoconfigure 。
            spring-boot-autoconfigure 实现了 Spring-Kafka 的自动化配置
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo07Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo07Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class Demo07Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @KafkaListener(topics = Demo07Message.TOPIC,
            groupId = "demo07-consumer-group-" + Demo07Message.TOPIC)
    public void onMessage(Demo07Message message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo07Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;

/**
 * 示例 07 的 Message 消息
 */
public class Demo07Message {

    public static final String TOPIC = "DEMO_07";

    /**
     * 编号
     */
    private Integer id;

    public Demo07Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo07Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.message.Demo07Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.core.KafkaOperations;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;

import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;

@Component
public class Demo07Producer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Resource
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException {
        // 创建 Demo07Message 消息
        Demo07Message message = new Demo07Message();
        message.setId(id);
        // 同步发送消息
        return kafkaTemplate.send(Demo07Message.TOPIC, message).get();
    }

    public String syncSendInTransaction(Integer id, Runnable runner) throws ExecutionException, InterruptedException {
        return kafkaTemplate.executeInTransaction(new KafkaOperations.OperationsCallback<Object, Object, String>() {

            @Override
            public String doInOperations(KafkaOperations<Object, Object> kafkaOperations) {
                // 创建 Demo07Message 消息
                Demo07Message message = new Demo07Message();
                message.setId(id);
                try {
                    SendResult<Object, Object> sendResult = kafkaOperations.send(Demo07Message.TOPIC, message).get();
                    logger.info("[doInOperations][发送编号:[{}] 发送结果:[{}]]", id, sendResult);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }

                // 本地业务逻辑... biubiubiu
                runner.run();

                // 返回结果
                return "success";
            }

        });
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application.yaml
================================================
spring:
  # Kafka 配置项,对应 KafkaProperties 配置类
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: all # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
      transaction-id-prefix: demo. # 事务编号前缀
    # Kafka Consumer 配置项
    consumer:
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
        isolation:
          level: read_committed # 读取已提交的消息
    # Kafka Consumer Listener 监听器配置
    listener:
      missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application_bak.yaml
================================================
spring:
  kafka:
    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
    # Kafka Producer 配置项
    producer:
      acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
      retries: 3 # 发送失败时,重试发送的次数
      batch-size: 16384 # 每次批量发送消息的最大数量
      buffer-memory: 33554432 # 每次批量发送消息的最大内存
      key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化
    # Kafka Consumer 配置项
    consumer:
      enable-auto-commit: false # true-使用 kafka 默认自带的提交模式。false-使用 Spring-Kafka 的自动提交 offset 机制。建议设置为 false 使用 kafka-spring 的机制,分析见 https://juejin.im/entry/5a6e8dea518825732472710c 。
      auto-commit-interval: 1000 # 在开启 enable-auto-commit 时,自动提交消费进度频率,单位:毫秒。如果 enable-auto-commit 为 false 时候,可以不设置
      auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring:
          json:
            trusted:
              packages: cn.iocoder.springboot.lab03.kafkademo.message
    # Kafka Consumer Listener 监听器配置
    listener:
      concurrency: 10 # 每个消费者监听器最大并发数,默认为 1 。可以通过设置 n ,这样对于每个监听器就会使用 n 个线程消费消息,提高整体消费速度。详细可参考博客 https://www.jianshu.com/p/ad0e5424edbd 理解。
    # Producer 配置项

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别
      apache:
        kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;


================================================
FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07ProducerTest.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;

import cn.iocoder.springboot.lab03.kafkademo.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.support.SendResult;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.concurrent.ListenableFutureCallback;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Demo07ProducerTest {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private Demo07Producer producer;

    @Test
    public void testSyncSend() throws ExecutionException, InterruptedException {
        int id = (int) (System.currentTimeMillis() / 1000);
        SendResult result = producer.syncSend(id);
        logger.info("[testSyncSend][发送编号:[{}] 发送结果:[{}]]", id, result);

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

    @Test
    public void testSyncSendInTransaction() throws ExecutionException, InterruptedException {
        int id = (int) (System.currentTimeMillis() / 1000);
        producer.syncSendInTransaction(id, new Runnable() {

            @Override
            public void run() {
                logger.info("[run][我要开始睡觉了]");
                try {
                    Thread.sleep(10 * 1000L);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                logger.info("[run][我睡醒了]");
            }

        });

        // 阻塞等待,保证消费
        new CountDownLatch(1).await();
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-native/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka-native</artifactId>

    <dependencies>
        <!-- 引入 Kafka 客户端依赖 -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ConsumerMain.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class ConsumerMain {

    private static Consumer<String, String> createConsumer() {
        // 设置 Producer 的属性
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "127.0.0.1:9092"); // 设置 Broker 的地址
        properties.put("group.id", "demo-consumer-group"); // 消费者分组
        properties.put("auto.offset.reset", "earliest"); // 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解
        properties.put("enable.auto.commit", true); // 是否自动提交消费进度
        properties.put("auto.commit.interval.ms", "1000"); // 自动提交消费进度频率
        properties.put("key.deserializer", StringDeserializer.class.getName()); // 消息的 key 的反序列化方式
        properties.put("value.deserializer", StringDeserializer.class.getName()); // 消息的 value 的反序列化方式

        // 创建 KafkaProducer 对象
        // 因为我们消息的 key 和 value 都使用 String 类型,所以创建的 Producer 是 <String, String> 的泛型。
        return new KafkaConsumer<>(properties);
    }

    public static void main(String[] args) {
        // 创建 KafkaConsumer 对象
        Consumer<String, String> consumer = createConsumer();

        // 订阅消息
        consumer.subscribe(Collections.singleton("TestTopic"));

        // 拉取消息
        while (true) {
            // 拉取消息。如果拉取不到消息,阻塞等待最多 10 秒,或者等待拉取到消息。
            ConsumerRecords records = consumer.poll(Duration.ofSeconds(10));
            // 遍历处理消息
            records.forEach(new java.util.function.Consumer<ConsumerRecord>() {

                @Override
                public void accept(ConsumerRecord record) {
                    System.out.println(record.key() + "\t" + record.value());
                }

            });
        }
    }

}


================================================
FILE: lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ProducerMain.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class ProducerMain {

    private static Producer<String, String> createProducer() {
        // 设置 Producer 的属性
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "127.0.0.1:9092"); // 设置 Broker 的地址
        properties.put("acks", "1"); // 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。
        properties.put("retries", 3); // 发送失败时,重试发送的次数
//        properties.put("batch.size", 16384);
//        properties.put("linger.ms", 1);
//        properties.put("client.id", "DemoProducer");
//        properties.put("buffer.memory", 33554432);
        properties.put("key.serializer", StringSerializer.class.getName()); // 消息的 key 的序列化方式
        properties.put("value.serializer", StringSerializer.class.getName()); // 消息的 value 的序列化方式

        // 创建 KafkaProducer 对象
        // 因为我们消息的 key 和 value 都使用 String 类型,所以创建的 Producer 是 <String, String> 的泛型。
        return new KafkaProducer<>(properties);
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建 KafkaProducer 对象
        Producer<String, String> producer = createProducer();

        // 创建消息。传入的三个参数,分别是 Topic ,消息的 key ,消息的 message 。
        ProducerRecord<String, String> message = new ProducerRecord<>("TestTopic", "key", "yudaoyuanma");

        // 同步发送消息
        Future<RecordMetadata> sendResultFuture = producer.send(message);
        RecordMetadata result = sendResultFuture.get();
        System.out.println("message sent to " + result.topic() + ", partition " + result.partition() + ", offset " + result.offset());
    }

}


================================================
FILE: lab-03-kafka/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-03-kafka</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>lab-03-kafka-native</module>
        <module>lab-03-kafka-demo</module>
        <module>lab-03-kafka-demo-batch</module>
        <module>lab-03-kafka-demo-batch-consume</module>
        <module>lab-03-kafka-demo-broadcast</module>
        <module>lab-03-kafka-demo-concurrency</module>
        <module>lab-03-kafka-demo-transaction</module>
        <module>lab-03-kafka-demo-ack</module>
    </modules>

</project>


================================================
FILE: lab-03-kafka/《芋道 Spring Boot 消息队列 Kafka 入门》.md
================================================
<http://www.iocoder.cn/Spring-Boot/Kafka/?github>


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lab-04-rabbitmq-consume-retry</artifactId>

    <dependencies>
        <!-- 实现对 RabbitMQ 的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
================================================
package cn.iocoder.springboot.lab04.rabbitmqdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
================================================
package cn.iocoder.springboot.lab04.rabbitmqdemo.config;

import cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo07Message;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

    /**
     * Direct Exchange 示例的配置类
     */
    public static class DirectExchangeDemoConfiguration {

        // 创建 Queue
        @Bean
        public Queue demo07Queue() {
            return QueueBuilder.durable(Demo07Message.QUEUE) // durable: 是否持久化
                    .exclusive() // exclusive: 是否排它
                    .autoDelete() // autoDelete: 是否自动删除
                    .deadLetterExchange(Demo07Message.EXCHANGE)
                    .deadLetterRoutingKey(Demo07Message.DEAD_ROUTING_KEY)
                    .build();
        }

        // 创建 Dead Queue
        @Bean
        public Queue demo07DeadQueue() {
            return new Queue(Demo07Message.DEAD_QUEUE, // Queue 名字
                    true, // durable: 是否持久化
                    false, // exclusive: 是否排它
                    false); // autoDelete: 是否自动删除
        }

        // 创建 Direct Exchange
        @Bean
        public DirectExchange demo07Exchange() {
            return new DirectExchange(Demo07Message.EXCHANGE,
                    true,  // durable: 是否持久化
                    false);  // exclusive: 是否排它
        }

        // 创建 Binding
        // Exchange:Demo07Message.EXCHANGE
        // Routing key:Demo07Message.ROUTING_KEY
        // Queue:Demo07Message.QUEUE
        @Bean
        public Binding demo07Binding() {
            return BindingBuilder.bind(demo07Queue()).to(demo07Exchange()).with(Demo07Message.ROUTING_KEY);
        }

        // 创建 Dead Binding
        // Exchange:Demo07Message.EXCHANGE
        // Routing key:Demo07Message.DEAD_ROUTING_KEY
        // Queue:Demo07Message.DEAD_QUEUE
        @Bean
        public Binding demo07DeadBinding() {
            return BindingBuilder.bind(demo07DeadQueue()).to(demo07Exchange()).with(Demo07Message.DEAD_ROUTING_KEY);
        }

    }

}


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07Consumer.java
================================================
package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;

import cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo07Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = Demo07Message.QUEUE)
public class Demo07Consumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @RabbitHandler
    public void onMessage(Demo07Message message) {
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
        // <X> 注意,此处抛出一个 RuntimeException 异常,模拟消费失败
        throw new RuntimeException("我就是故意抛出一个异常");
    }

}


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07DeadConsumer.java
================================================
package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;

import cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo07Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = Demo07Message.DEAD_QUEUE)
public class Demo07DeadConsumer {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @RabbitHandler
    public void onMessage(Demo07Message message) {
        logger.info("[onMessage][【死信队列】线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }

}


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo07Message.java
================================================
package cn.iocoder.springboot.lab04.rabbitmqdemo.message;

import java.io.Serializable;

public class Demo07Message implements Serializable {

    public static final String QUEUE = "QUEUE_DEMO_07"; // 正常队列
    public static final String DEAD_QUEUE = "DEAD_QUEUE_DEMO_07"; // 死信队列

    public static final String EXCHANGE = "EXCHANGE_DEMO_07";

    public static final String ROUTING_KEY = "ROUTING_KEY_07"; // 正常路由键
    public static final String DEAD_ROUTING_KEY = "DEAD_ROUTING_KEY_07"; // 死信路由键


    /**
     * 编号
     */
    private Integer id;

    public Demo07Message setId(Integer id) {
        this.id = id;
        return this;
    }

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Demo07Message{" +
                "id=" + id +
                '}';
    }

}


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07Producer.java
================================================
package cn.iocoder.springboot.lab04.rabbitmqdemo.producer;

import cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo07Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Demo07Producer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void syncSend(Integer id) {
        // 创建 Demo07Message 消息
        Demo07Message message = new Demo07Message();
        message.setId(id);
        // 同步发送消息
        rabbitTemplate.convertAndSend(Demo07Message.EXCHANGE, Demo07Message.ROUTING_KEY, message);
    }

}


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/resources/application.yaml
================================================
spring:
  # RabbitMQ 配置项,对应 RabbitProperties 配置类
  rabbitmq:
    host: 127.0.0.1 # RabbitMQ 服务的地址
    port: 5672 # RabbitMQ 服务的端口
    username: guest # RabbitMQ 服务的账号
    password: guest # RabbitMQ 服务的密码
    template:
      # 对应 RabbitProperties.Retry 类
      retry:
        enabled: true # 开启发送机制
        max-attempts: 3 # 最大重试次数。默认为 3 。
        initial-interval: 1000 # 重试间隔,单位为毫秒。默认为 1000 。
    listener:
      simple:
        # 对应 RabbitProperties.ListenerRetry 类
        retry:
          enabled: true # 开启消费重试机制
          max-attempts: 3 # 最大重试次数。默认为 3 。
          initial-interval: 1000 # 重试间隔,单位为毫秒。默认为 1000 。


================================================
FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java
================================================
package cn.iocoder.springboot.lab04.rabbitmqdemo;


================================================
F
Download .txt
Showing preview only (461K chars total). Download the full file or copy to clipboard to get everything.
gitextract_g84ntzib/

├── .gitignore
├── README.md
├── httpRequests/
│   ├── 2020-12-20T004250.200.json
│   ├── 2020-12-20T004328.500.json
│   ├── 2020-12-20T004337.200.json
│   ├── 2020-12-20T004347.200.json
│   ├── 2020-12-20T004347.500.json
│   ├── 2020-12-20T004358.200.json
│   ├── 2020-12-20T004358.500.json
│   ├── 2020-12-20T004401.200.json
│   ├── 2020-12-20T004401.500.json
│   ├── 2020-12-20T004538.200.json
│   ├── 2020-12-20T004547.500.json
│   ├── 2020-12-20T004638.500.json
│   ├── 2020-12-20T004645.500.json
│   ├── 2020-12-20T004809.200.json
│   ├── 2020-12-20T004813.500.json
│   ├── 2020-12-20T010724.200.json
│   ├── 2020-12-20T010738.200.json
│   ├── 2020-12-20T010809.200.json
│   ├── 2020-12-20T010823.500.json
│   ├── 2020-12-20T010840.200.json
│   ├── 2020-12-20T011020.500.json
│   ├── 2020-12-20T011347.500.json
│   ├── 2020-12-20T011526.200.json
│   ├── 2020-12-20T011530.200.json
│   ├── 2020-12-20T011541.400.json
│   ├── 2020-12-20T011551.500.json
│   ├── 2020-12-20T011556.200.json
│   ├── 2020-12-20T011628-1.200.json
│   ├── 2020-12-20T011628.200.json
│   ├── 2020-12-20T011646.200.json
│   ├── 2020-12-20T011650.200.json
│   ├── 2020-12-20T011653.500.json
│   ├── 2020-12-20T011818.200.json
│   ├── 2020-12-20T011843.200.json
│   ├── 2020-12-20T011847.500.json
│   ├── 2020-12-20T012507.200.json
│   ├── 2020-12-20T012510.200.json
│   ├── 2020-12-20T012527.200.json
│   ├── 2020-12-20T012540.400.json
│   ├── 2020-12-20T012544.200.json
│   ├── 2020-12-20T012703.500.json
│   ├── 2020-12-20T012708.200.json
│   ├── 2020-12-20T012710.200.json
│   ├── 2020-12-20T013544.200.json
│   ├── 2020-12-20T013552.200.json
│   ├── 2020-12-20T013558.500.json
│   ├── 2020-12-20T013845.200.json
│   ├── 2020-12-20T014019.200.json
│   ├── 2020-12-20T021415.200.json
│   ├── http-client.cookies
│   └── http-requests-log.http
├── lab-01-spring-security/
│   ├── lab-01-springsecurity-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab01/
│   │           │                   └── springsecurity/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── AdminController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-01-springsecurity-demo-role/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab01/
│   │                               └── springsecurity/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── SecurityConfig.java
│   │                                   └── controller/
│   │                                       ├── DemoController.java
│   │                                       └── TestController.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 安全框架 Spring Security 入门》.md
├── lab-02-spring-security-oauth/
│   ├── authorization-code-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── labs/
│   │           │                   └── lab01/
│   │           │                       ├── Application.java
│   │           │                       ├── authorization/
│   │           │                       │   └── OAuth2AuthorizationServer.java
│   │           │                       └── resource/
│   │           │                           ├── OAuth2ResourceServer.java
│   │           │                           └── api/
│   │           │                               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── client-credentials-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── lab01/
│   │                   ├── Application.java
│   │                   ├── authorization/
│   │                   │   └── OAuth2AuthorizationServer.java
│   │                   └── resource/
│   │                       ├── OAuth2ResourceServer.java
│   │                       └── api/
│   │                           └── ExampleController.java
│   ├── implicit-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab01/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── pom.xml
│   ├── resource-owner-password-credentials-server/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab01/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── resource-owner-password-credentials-server-by-jdbc-token-store/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab02/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               ├── application.properties
│   │               ├── data.sql
│   │               └── schema.sql
│   ├── resource-owner-password-credentials-server-with-refresh-token/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab01/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   └── OAuth2AuthorizationServer.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── resource-owner-password-credentials-server-with-revoke-token/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── lab2/
│   │           │       ├── Application.java
│   │           │       ├── authorization/
│   │           │       │   ├── OAuth2AuthorizationServer.java
│   │           │       │   └── token/
│   │           │       │       └── TokenController.java
│   │           │       └── resource/
│   │           │           ├── OAuth2ResourceServer.java
│   │           │           └── api/
│   │           │               └── ExampleController.java
│   │           └── resources/
│   │               └── application.properties
│   ├── 《芋道 Spring Security OAuth2 入门(新)》.md
│   └── 《芋道 Spring Security OAuth2 入门(老)》.md
├── lab-03-kafka/
│   ├── lab-03-kafka-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── KafkaConfiguration.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo01AConsumer.java
│   │       │   │                       │   ├── Demo01Consumer.java
│   │       │   │                       │   └── Demo04Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── Demo01Message.java
│   │       │   │                       │   └── Demo04Message.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── Demo01Producer.java
│   │       │   │                           └── Demo04Producer.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── application_bak.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── Demo01ProducerTest.java
│   │                                       └── Demo04ProducerTest.java
│   ├── lab-03-kafka-demo-ack/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo08Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo08Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo08Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo08ProducerTest.java
│   ├── lab-03-kafka-demo-batch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo02Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo02Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo02Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo02ProducerTest.java
│   ├── lab-03-kafka-demo-batch-consume/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo02Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo02Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo02Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo02ProducerTest.java
│   ├── lab-03-kafka-demo-broadcast/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo05Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-03-kafka-demo-concurrency/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo06Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo06Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo06Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo06ProducerTest.java
│   ├── lab-03-kafka-demo-transaction/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab03/
│   │       │   │                   └── kafkademo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo07Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo07Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo07Producer.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── application_bak.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo07ProducerTest.java
│   ├── lab-03-kafka-native/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab03/
│   │                               └── kafkademo/
│   │                                   ├── ConsumerMain.java
│   │                                   └── ProducerMain.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 Kafka 入门》.md
├── lab-04-rabbitmq/
│   ├── lab-04-rabbitmq-consume-retry/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo07Consumer.java
│   │       │   │                       │   └── Demo07DeadConsumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo07Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo07Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo07ProducerTest.java
│   ├── lab-04-rabbitmq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo01Consumer.java
│   │       │   │                       │   ├── Demo02Consumer.java
│   │       │   │                       │   ├── Demo03ConsumerA.java
│   │       │   │                       │   ├── Demo03ConsumerB.java
│   │       │   │                       │   └── Demo04Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── Demo01Message.java
│   │       │   │                       │   ├── Demo02Message.java
│   │       │   │                       │   ├── Demo03Message.java
│   │       │   │                       │   └── Demo04Message.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── Demo01Producer.java
│   │       │   │                           ├── Demo02Producer.java
│   │       │   │                           ├── Demo03Producer.java
│   │       │   │                           └── Demo04Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── Demo01ProducerTest.java
│   │                                       ├── Demo02ProducerTest.java
│   │                                       ├── Demo03ProducerTest.java
│   │                                       └── Demo04ProducerTest.java
│   ├── lab-04-rabbitmq-demo-ack/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo12Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo12Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo12Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo12ProducerTest.java
│   ├── lab-04-rabbitmq-demo-batch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo05Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-04-rabbitmq-demo-batch-consume/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo06Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-04-rabbitmq-demo-batch-consume-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo06Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo06Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo06Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo06ProducerTest.java
│   ├── lab-04-rabbitmq-demo-concurrency/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo09Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo09Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo09Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo09ProducerTest.java
│   ├── lab-04-rabbitmq-demo-confirm/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo13Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo13Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo13Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo13ProducerTest.java
│   ├── lab-04-rabbitmq-demo-confirm-async/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo13Consumer.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── RabbitProducerConfirmCallback.java
│   │       │   │                       │   └── RabbitProducerReturnCallback.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo13Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo13Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo13ProducerTest.java
│   ├── lab-04-rabbitmq-demo-delay/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo08Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo08Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo08Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo08ProducerTest.java
│   ├── lab-04-rabbitmq-demo-error-handler/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo16Consumer.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── RabbitListenerErrorHandlerImpl.java
│   │       │   │                       │   └── RabbitLoggingErrorHandler.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo16Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo16Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo16ProducerTest.java
│   ├── lab-04-rabbitmq-demo-json/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo15Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo15Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo15Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo15ProducerTest.java
│   ├── lab-04-rabbitmq-demo-message-model/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── BroadcastConsumer.java
│   │       │   │                       │   └── ClusteringConsumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── BroadcastMessage.java
│   │       │   │                       │   └── ClusteringMessage.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── BroadcastProducer.java
│   │       │   │                           └── ClusteringProducer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── BroadcastProducerTest.java
│   │                                       └── ClusteringProducerTest.java
│   ├── lab-04-rabbitmq-demo-orderly/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo10Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo10Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo10Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo10ProducerTest.java
│   ├── lab-04-rabbitmq-demo-rpc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo14Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo14Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo14Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo14ProducerTest.java
│   ├── lab-04-rabbitmq-demo-transaction/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab04/
│   │       │   │                   └── rabbitmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── RabbitConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo11Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo11Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo11Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo11ProducerTest.java
│   ├── lab-04-rabbitmq-native/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab04/
│   │                               └── rabbitmqdemo/
│   │                                   ├── RabbitMQConsumer.java
│   │                                   └── RabbitMQProducer.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md
├── lab-05-benchmark-tomcat-jetty-undertow/
│   ├── lab-05-jetty/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── tomcat/
│   │                                       ├── Controller.java
│   │                                       └── JettyApplication.java
│   ├── lab-05-tomcat/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── tomcat/
│   │                                       ├── Controller.java
│   │                                       └── TomcatApplication.java
│   ├── lab-05-tomcat-apr/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── tomcat/
│   │                                       ├── Controller.java
│   │                                       └── TomcatAprApplication.java
│   ├── lab-05-undertow/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab05/
│   │                                   └── undertow/
│   │                                       ├── Controller.java
│   │                                       └── UndertowApplication.java
│   ├── pom.xml
│   └── 《性能测试 —— Tomcat、Jetty、Undertow 基准测试》.md
├── lab-06/
│   ├── lab-06-springmvc-tomcat/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab06/
│   │                                   └── springmvc/
│   │                                       ├── Controller.java
│   │                                       └── SpringMVCApplication.java
│   ├── lab-06-webflux-netty/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab06/
│   │                                   └── webflux/
│   │                                       ├── Controller.java
│   │                                       └── WebfluxNettyApplication.java
│   ├── lab-06-webflux-tomcat/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab06/
│   │                                   └── webflux/
│   │                                       ├── Controller.java
│   │                                       └── WebfluxTomcatApplication.java
│   ├── pom.xml
│   └── 《性能测试 —— SpringMVC、Webflux 基准测试》.md
├── lab-07/
│   ├── lab-07-spring-cloud-gateway/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── labs/
│   │           │                   └── lab07/
│   │           │                       └── springcloudgateway/
│   │           │                           └── SpringCloudGatewayApplication.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-07-zuul/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── labs/
│   │           │                   └── lab07/
│   │           │                       └── zuul/
│   │           │                           └── ZuulApplication.java
│   │           └── resources/
│   │               └── application.yml
│   ├── pom.xml
│   └── 《性能测试 —— Spring Cloud Gateway、Zuul 基准测试》.md
├── lab-11-spring-data-redis/
│   ├── lab-07-spring-data-redis-unit-test/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── labs/
│   │       │   │                   └── lab10/
│   │       │   │                       └── springdatarediswithjedis/
│   │       │   │                           ├── Application.java
│   │       │   │                           ├── config/
│   │       │   │                           │   └── RedisConfiguration.java
│   │       │   │                           └── util/
│   │       │   │                               └── JSONUtil.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       └── redisson.yml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab10/
│   │                                   └── springdatarediswithjedis/
│   │                                       ├── Test01.java
│   │                                       └── config/
│   │                                           └── TestRedisConfiguration.java
│   ├── lab-07-spring-data-redis-with-jedis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── labs/
│   │       │   │                   └── lab10/
│   │       │   │                       └── springdatarediswithjedis/
│   │       │   │                           ├── Application.java
│   │       │   │                           ├── cacheobject/
│   │       │   │                           │   ├── ProductCacheObject.java
│   │       │   │                           │   └── UserCacheObject.java
│   │       │   │                           ├── config/
│   │       │   │                           │   └── RedisConfiguration.java
│   │       │   │                           ├── dao/
│   │       │   │                           │   ├── package-info.java
│   │       │   │                           │   └── redis/
│   │       │   │                           │       └── UserCacheDao.java
│   │       │   │                           ├── listener/
│   │       │   │                           │   ├── TestChannelTopicMessageListener.java
│   │       │   │                           │   └── TestPatternTopicMessageListener.java
│   │       │   │                           ├── service/
│   │       │   │                           │   ├── UserService01.java
│   │       │   │                           │   └── UserService02.java
│   │       │   │                           └── util/
│   │       │   │                               └── JSONUtil.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       └── lua/
│   │       │           ├── compareAndSet.lua
│   │       │           ├── compareAndSet2.lua
│   │       │           └── test.lua
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab10/
│   │                                   └── springdatarediswithjedis/
│   │                                       ├── PipelineTest.java
│   │                                       ├── PubSubTest.java
│   │                                       ├── ScriptTest.java
│   │                                       ├── SessionTest.java
│   │                                       ├── Test01.java
│   │                                       ├── TransactionTest.java
│   │                                       ├── UserService02Test.java
│   │                                       └── package-info.java
│   ├── lab-07-spring-data-redis-with-redisson/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── labs/
│   │       │   │                   └── lab10/
│   │       │   │                       └── springdatarediswithjedis/
│   │       │   │                           ├── Application.java
│   │       │   │                           ├── cacheobject/
│   │       │   │                           │   ├── ProductCacheObject.java
│   │       │   │                           │   └── UserCacheObject.java
│   │       │   │                           ├── config/
│   │       │   │                           │   └── RedisConfiguration.java
│   │       │   │                           ├── dao/
│   │       │   │                           │   ├── package-info.java
│   │       │   │                           │   └── redis/
│   │       │   │                           │       └── UserCacheDao.java
│   │       │   │                           ├── listener/
│   │       │   │                           │   ├── TestChannelTopicMessageListener.java
│   │       │   │                           │   └── TestPatternTopicMessageListener.java
│   │       │   │                           ├── service/
│   │       │   │                           │   ├── UserService01.java
│   │       │   │                           │   └── UserService02.java
│   │       │   │                           └── util/
│   │       │   │                               └── JSONUtil.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       ├── lua/
│   │       │       │   ├── compareAndSet.lua
│   │       │       │   ├── compareAndSet2.lua
│   │       │       │   └── test.lua
│   │       │       └── redisson.yml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── labs/
│   │                               └── lab10/
│   │                                   └── springdatarediswithjedis/
│   │                                       ├── LockTest.java
│   │                                       ├── PipelineTest.java
│   │                                       ├── PubSubTest.java
│   │                                       ├── RateLimiterTest.java
│   │                                       ├── ScriptTest.java
│   │                                       ├── SessionTest.java
│   │                                       ├── Test01.java
│   │                                       ├── TransactionTest.java
│   │                                       ├── UserService02Test.java
│   │                                       └── package-info.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot Redis 入门》.md
├── lab-12-mybatis/
│   ├── lab-12-mybatis-annotation/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── lab-12-mybatis-plus/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── lab-12-mybatis-plus-tenant/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── AsyncConfig.java
│   │       │   │                       │   └── MybatisPlusConfig.java
│   │       │   │                       ├── context/
│   │       │   │                       │   └── TenantHolder.java
│   │       │   │                       ├── core/
│   │       │   │                       │   └── TtlThreadPoolTaskExecutor.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── UserDO.java
│   │       │   │                       │   └── UserProfileDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── UserMapper.java
│   │       │   │                       │   └── UserProfileMapper.java
│   │       │   │                       ├── service/
│   │       │   │                       │   └── UserService.java
│   │       │   │                       ├── util/
│   │       │   │                       │   └── TtlExecutorsUtil.java
│   │       │   │                       └── vo/
│   │       │   │                           └── UserDetailVO.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   ├── mapper/
│   │                                   │   └── UserMapperTest.java
│   │                                   └── service/
│   │                                       └── UserServiceTest.java
│   ├── lab-12-mybatis-tk/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── util/
│   │       │   │                           └── BaseMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── lab-12-mybatis-xml/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab12/
│   │       │   │                   └── mybatis/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab12/
│   │                               └── mybatis/
│   │                                   └── mapper/
│   │                                       └── UserMapperTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot MyBatis 入门》.md
├── lab-13-spring-data-jpa/
│   ├── lab-13-jpa/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab13/
│   │       │   │                   └── jpa/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── repository/
│   │       │   │                           ├── UserRepository01.java
│   │       │   │                           ├── UserRepository02.java
│   │       │   │                           ├── UserRepository03.java
│   │       │   │                           └── UserRepository04.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab13/
│   │                               └── jpa/
│   │                                   └── repository/
│   │                                       ├── UserRepository01Test.java
│   │                                       ├── UserRepository02Test.java
│   │                                       ├── UserRepository03Test.java
│   │                                       └── UserRepository04Test.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot JPA 入门》.md
├── lab-14-spring-jdbc-template/
│   ├── lab-14-jdbctemplate/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab14/
│   │       │   │                   └── jdbctemplate/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       └── dataobject/
│   │       │   │                           └── UserDO.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab14/
│   │                               └── jdbctemplate/
│   │                                   └── dao/
│   │                                       └── UserDaoTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot JdbcTemplate 入门》.md
├── lab-15-spring-data-es/
│   ├── lab-15-spring-data-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab15/
│   │       │   │                   └── springdataelasticsearch/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── bo/
│   │       │   │                       │   └── ProductConditionBO.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── FieldAnalyzer.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── ESProductDO.java
│   │       │   │                       └── repository/
│   │       │   │                           └── ProductRepository.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab15/
│   │                               └── springdataelasticsearch/
│   │                                   └── repository/
│   │                                       ├── ProductRepository04Test.java
│   │                                       └── ProductRepositoryTest.java
│   ├── lab-15-spring-data-jest/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab15/
│   │       │   │                   └── springdatajest/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── FieldAnalyzer.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── ESProductDO.java
│   │       │   │                       └── repository/
│   │       │   │                           ├── ProductRepository.java
│   │       │   │                           ├── ProductRepository02.java
│   │       │   │                           └── ProductRepository03.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab15/
│   │                               └── springdatajest/
│   │                                   └── repository/
│   │                                       ├── ProductRepository02Test.java
│   │                                       ├── ProductRepository03Test.java
│   │                                       └── ProductRepositoryTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot Elasticsearch 入门》.md
├── lab-16-spring-data-mongo/
│   ├── lab-16-spring-data-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab16/
│   │       │   │                   └── springdatamongodb/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── MongoDBConfig.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── ProductDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mongo/
│   │       │   │                       │   ├── IncIdEntity.java
│   │       │   │                       │   └── MongoInsertEventListener.java
│   │       │   │                       └── repository/
│   │       │   │                           ├── ProductRepository.java
│   │       │   │                           ├── UserRepository.java
│   │       │   │                           ├── UserRepository02.java
│   │       │   │                           └── UserRepository03.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab16/
│   │                               └── springdatamongodb/
│   │                                   ├── dao/
│   │                                   │   └── UserDaoTest.java
│   │                                   └── repository/
│   │                                       ├── ProductRepositoryTest.java
│   │                                       ├── UserRepository02Test.java
│   │                                       ├── UserRepository03Test.java
│   │                                       └── UserRepositoryTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot MongoDB 入门》.md
├── lab-17/
│   ├── lab-17-dynamic-datasource-baomidou-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── OrderMapper.java
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── OrderMapper.xml
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── mapper/
│   │                                   │   ├── OrderMapperTest.java
│   │                                   │   └── UserMapperTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-baomidou-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── OrderMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── OrderMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── dynamicdatasource/
│   │                   ├── mapper/
│   │                   │   └── OrderMapperTest.java
│   │                   └── service/
│   │                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-jdbctemplate/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── JdbcTemplateOrdersConfig.java
│   │       │   │                       │   └── JdbcTemplateUsersConfig.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   ├── OrderDao.java
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── dao/
│   │                                   │   ├── OrderDaoTest.java
│   │                                   │   └── UserDaoTest.java
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-mybatis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── MyBatisOrdersConfig.java
│   │       │   │                       │   └── MyBatisUsersConfig.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── orders/
│   │       │   │                       │   │   └── OrderMapper.java
│   │       │   │                       │   └── users/
│   │       │   │                       │       └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── orders/
│   │       │       │   │   └── OrderMapper.xml
│   │       │       │   └── users/
│   │       │       │       └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── mapper/
│   │                                   │   ├── orders/
│   │                                   │   │   └── OrderMapperTest.java
│   │                                   │   └── users/
│   │                                   │       └── UserMapperTest.java
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-sharding-jdbc-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── OrderMapper.java
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── OrderMapper.xml
│   │       │       │   └── UserMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── dynamicdatasource/
│   │                   ├── mapper/
│   │                   │   ├── OrderMapperTest.java
│   │                   │   └── UserMapperTest.java
│   │                   └── service/
│   │                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-sharding-jdbc-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── OrderMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   └── OrderMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── mapper/
│   │                                   │   └── OrderMapperTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── lab-17-dynamic-datasource-springdatajpa/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab17/
│   │       │   │                   └── dynamicdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── HibernateConfig.java
│   │       │   │                       │   ├── JpaOrdersConfig.java
│   │       │   │                       │   └── JpaUsersConfig.java
│   │       │   │                       ├── constant/
│   │       │   │                       │   └── DBConstants.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderDO.java
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── repository/
│   │       │   │                       │   ├── orders/
│   │       │   │                       │   │   └── OrderRepository.java
│   │       │   │                       │   └── users/
│   │       │   │                       │       └── UserRepository.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── sql/
│   │       │           └── db.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab17/
│   │                               └── dynamicdatasource/
│   │                                   ├── package-info.java
│   │                                   ├── repository/
│   │                                   │   ├── orders/
│   │                                   │   │   └── OrderRepositoryTest.java
│   │                                   │   └── users/
│   │                                   │       └── UserRepositoryTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 多数据源(读写分离)入门》.md
├── lab-18/
│   ├── lab-18-sharding-datasource-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab18/
│   │       │   │                   └── shardingdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   ├── OrderConfigDO.java
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           ├── OrderConfigMapper.java
│   │       │   │                           └── OrderMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── mapper/
│   │       │       │   ├── OrderConfigMapper.xml
│   │       │       │   └── OrderMapper.xml
│   │       │       ├── mybatis-config.xml
│   │       │       └── sql/
│   │       │           ├── lab18_orders_0.sql
│   │       │           └── lab18_orders_1.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab18/
│   │                               └── shardingdatasource/
│   │                                   └── mapper/
│   │                                       ├── OrderConfigMapperTest.java
│   │                                       └── OrderMapperTest.java
│   ├── lab-18-sharding-datasource-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab18/
│   │       │   │                   └── shardingdatasource/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── OrderDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   └── OrderMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── OrderService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab18/
│   │                               └── shardingdatasource/
│   │                                   ├── mapper/
│   │                                   │   └── OrderMapperTest.java
│   │                                   └── service/
│   │                                       └── OrderServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 分库分表入门》.md
├── lab-19/
│   ├── lab-19-datasource-pool-druid-multiple/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── DataSourceConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-19-datasource-pool-druid-single/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DruidStatController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-19-datasource-pool-hikaricp-multiple/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── DataSourceConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-19-datasource-pool-hikaricp-single/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab19/
│   │           │                   └── datasourcepool/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 数据库连接池入门》.md
├── lab-20/
│   ├── lab-20-database-version-control-flyway/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab20/
│   │           │                   └── databaseversioncontrol/
│   │           │                       ├── Application.java
│   │           │                       └── migration/
│   │           │                           ├── ExampleFlywayCallback.java
│   │           │                           └── V1_1__FixUsername.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── db/
│   │                   └── migration/
│   │                       └── V1.0__INIT_DB.sql
│   ├── lab-20-database-version-control-liquibase/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab20/
│   │           │                   └── databaseversioncontrol/
│   │           │                       ├── Application.java
│   │           │                       └── migration/
│   │           │                           └── CHANGE_SET_3_FixUsername.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── db/
│   │                   └── changelog/
│   │                       ├── db.changelog-master-bak.yaml
│   │                       ├── db.changelog-master.yaml
│   │                       └── sqlfile/
│   │                           └── CHAGE_SET_2_INIT_DB.sql
│   ├── pom.xml
│   └── 《芋道 Spring Boot 数据库版本管理入门》.md
├── lab-21/
│   ├── lab-21-cache-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab21/
│   │       │   │                   └── cache/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       ├── mapper/
│   │       │   │                       │   ├── UserCacheDao.java
│   │       │   │                       │   └── UserMapper.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab21/
│   │                               └── cache/
│   │                                   └── UserMapperTest.java
│   ├── lab-21-cache-ehcache/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab21/
│   │       │   │                   └── cache/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       ├── ehcache.xml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab21/
│   │                               └── cache/
│   │                                   └── UserMapperTest.java
│   ├── lab-21-cache-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab21/
│   │       │   │                   └── cache/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── mapper/
│   │       │   │                           └── UserMapper.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── sql/
│   │       │           └── users.sql
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab21/
│   │                               └── cache/
│   │                                   └── UserMapperTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 缓存 Cache 入门》.md
├── lab-22/
│   ├── lab-22-validation-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab22/
│   │       │   │                   └── validation/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── ValidationConfiguration.java
│   │       │   │                       ├── constants/
│   │       │   │                       │   ├── GenderEnum.java
│   │       │   │                       │   └── ServiceExceptionEnum.java
│   │       │   │                       ├── controller/
│   │       │   │                       │   └── UserController.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── exception/
│   │       │   │                       │   │   └── ServiceException.java
│   │       │   │                       │   ├── package-info.java
│   │       │   │                       │   ├── validator/
│   │       │   │                       │   │   ├── InEnum.java
│   │       │   │                       │   │   ├── InEnumValidator.java
│   │       │   │                       │   │   └── IntArrayValuable.java
│   │       │   │                       │   ├── vo/
│   │       │   │                       │   │   └── CommonResult.java
│   │       │   │                       │   └── web/
│   │       │   │                       │       ├── GlobalExceptionHandler.java
│   │       │   │                       │       └── GlobalResponseBodyHandler.java
│   │       │   │                       ├── dto/
│   │       │   │                       │   ├── UserAddDTO.java
│   │       │   │                       │   ├── UserUpdateDTO.java
│   │       │   │                       │   ├── UserUpdateGenderDTO.java
│   │       │   │                       │   └── UserUpdateStatusDTO.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       ├── application.yaml
│   │       │       └── i18n/
│   │       │           ├── messages.properties
│   │       │           ├── messages_en.properties
│   │       │           └── messages_ja.properties
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab22/
│   │                               └── validation/
│   │                                   └── service/
│   │                                       └── UserServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 参数校验 Validation 入门》.md
├── lab-23/
│   ├── lab-springmvc-23-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab23/
│   │       │                       └── springmvc/
│   │       │                           ├── Application.java
│   │       │                           ├── controller/
│   │       │                           │   ├── UserController.java
│   │       │                           │   └── UserController2.java
│   │       │                           ├── dto/
│   │       │                           │   ├── UserAddDTO.java
│   │       │                           │   └── UserUpdateDTO.java
│   │       │                           ├── service/
│   │       │                           │   └── UserService.java
│   │       │                           └── vo/
│   │       │                               └── UserVO.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab23/
│   │                               └── springmvc/
│   │                                   ├── controller/
│   │                                   │   ├── UserControllerTest.java
│   │                                   │   └── UserControllerTest2.java
│   │                                   └── package-info.java
│   ├── lab-springmvc-23-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab23/
│   │       │                       └── springmvc/
│   │       │                           ├── Application.java
│   │       │                           ├── config/
│   │       │                           │   └── SpringMVCConfiguration.java
│   │       │                           ├── constants/
│   │       │                           │   └── ServiceExceptionEnum.java
│   │       │                           ├── controller/
│   │       │                           │   ├── ProductController.java
│   │       │                           │   └── UserController.java
│   │       │                           ├── controller2/
│   │       │                           │   └── TestController.java
│   │       │                           ├── core/
│   │       │                           │   ├── exception/
│   │       │                           │   │   └── ServiceException.java
│   │       │                           │   ├── interceptor/
│   │       │                           │   │   ├── FirstInterceptor.java
│   │       │                           │   │   ├── SecondInterceptor.java
│   │       │                           │   │   └── ThirdInterceptor.java
│   │       │                           │   ├── package-info.java
│   │       │                           │   ├── servlet/
│   │       │                           │   │   ├── TestFilter02.java
│   │       │                           │   │   ├── TestServlet02.java
│   │       │                           │   │   └── TestServletContextListener02.java
│   │       │                           │   ├── vo/
│   │       │                           │   │   └── CommonResult.java
│   │       │                           │   └── web/
│   │       │                           │       ├── GlobalExceptionHandler.java
│   │       │                           │       └── GlobalResponseBodyHandler.java
│   │       │                           └── vo/
│   │       │                               ├── ProductVO.java
│   │       │                               └── UserVO.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab23/
│   │                               └── springmvc/
│   │                                   └── package-info.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot SpringMVC 入门》.md
├── lab-24/
│   ├── lab-24-apidoc-japidocs/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab24/
│   │                               ├── Application.java
│   │                               ├── TestJApiDocs.java
│   │                               ├── controller/
│   │                               │   └── UserController.java
│   │                               └── vo/
│   │                                   ├── UserCreateReqVO.java
│   │                                   ├── UserListReqVO.java
│   │                                   └── UserRespVO.java
│   ├── lab-24-apidoc-showdoc/
│   │   ├── pom.xml
│   │   ├── showdoc_api.sh
│   │   ├── showdoc_db.sh
│   │   ├── src/
│   │   │   └── main/
│   │   │       └── java/
│   │   │           └── cn/
│   │   │               └── iocoder/
│   │   │                   └── springboot/
│   │   │                       └── lab24/
│   │   │                           └── apidoc/
│   │   │                               ├── ShowDocApplication.java
│   │   │                               └── controller/
│   │   │                                   ├── UserController.java
│   │   │                                   └── vo/
│   │   │                                       ├── UserLoginReqVO.java
│   │   │                                       └── UserLoginRespVO.java
│   │   └── swagger.json
│   ├── lab-24-apidoc-swagger/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab24/
│   │                               └── apidoc/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── SwaggerConfiguration.java
│   │                                   ├── controller/
│   │                                   │   ├── TestController.java
│   │                                   │   └── UserController.java
│   │                                   ├── dto/
│   │                                   │   ├── UserAddDTO.java
│   │                                   │   └── UserUpdateDTO.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-24-apidoc-swagger-knife4j/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab24/
│   │                               └── apidoc/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── SwaggerConfiguration.java
│   │                                   ├── controller/
│   │                                   │   ├── TestController.java
│   │                                   │   └── UserController.java
│   │                                   ├── dto/
│   │                                   │   ├── UserAddDTO.java
│   │                                   │   └── UserUpdateDTO.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-24-apidoc-swagger-starter/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab24/
│   │           │                   ├── Application.java
│   │           │                   ├── config/
│   │           │                   │   └── SwaggerConfiguration.java
│   │           │                   ├── controller/
│   │           │                   │   └── UserController.java
│   │           │                   ├── dto/
│   │           │                   │   ├── UserAddDTO.java
│   │           │                   │   └── UserUpdateDTO.java
│   │           │                   └── vo/
│   │           │                       └── UserVO.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   ├── 《芋道 Spring Boot API 接口文档 JApiDocs 入门》.md
│   ├── 《芋道 Spring Boot API 接口文档 ShowDoc 入门》.md
│   ├── 《芋道 Spring Boot API 接口文档 Swagger Starter 入门》.md
│   └── 《芋道 Spring Boot API 接口文档 Swagger 入门》.md
├── lab-25/
│   ├── lab-websocket-25-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab25/
│   │                               └── springwebsocket/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── WebSocketConfiguration.java
│   │                                   ├── handler/
│   │                                   │   ├── AuthMessageHandler.java
│   │                                   │   ├── MessageHandler.java
│   │                                   │   ├── SendToAllHandler.java
│   │                                   │   └── SendToOneHandler.java
│   │                                   ├── message/
│   │                                   │   ├── AuthRequest.java
│   │                                   │   ├── AuthResponse.java
│   │                                   │   ├── Message.java
│   │                                   │   ├── SendResponse.java
│   │                                   │   ├── SendToAllRequest.java
│   │                                   │   ├── SendToOneRequest.java
│   │                                   │   ├── SendToUserRequest.java
│   │                                   │   └── UserJoinNoticeRequest.java
│   │                                   ├── util/
│   │                                   │   └── WebSocketUtil.java
│   │                                   └── websocket/
│   │                                       └── WebsocketServerEndpoint.java
│   ├── lab-websocket-25-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab25/
│   │                               └── springwebsocket/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── WebSocketConfiguration.java
│   │                                   ├── handler/
│   │                                   │   ├── AuthMessageHandler.java
│   │                                   │   ├── MessageHandler.java
│   │                                   │   ├── SendToAllHandler.java
│   │                                   │   └── SendToOneHandler.java
│   │                                   ├── message/
│   │                                   │   ├── AuthRequest.java
│   │                                   │   ├── AuthResponse.java
│   │                                   │   ├── Message.java
│   │                                   │   ├── SendResponse.java
│   │                                   │   ├── SendToAllRequest.java
│   │                                   │   ├── SendToOneRequest.java
│   │                                   │   ├── SendToUserRequest.java
│   │                                   │   └── UserJoinNoticeRequest.java
│   │                                   ├── util/
│   │                                   │   └── WebSocketUtil.java
│   │                                   └── websocket/
│   │                                       ├── DemoWebSocketHandler.java
│   │                                       └── DemoWebSocketShakeInterceptor.java
│   ├── lab-websocket-25-03/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab25/
│   │       │                       └── springwebsocket/
│   │       │                           ├── Application.java
│   │       │                           ├── config/
│   │       │                           │   └── WebSocketConfiguration.java
│   │       │                           ├── controller/
│   │       │                           │   └── SendController.java
│   │       │                           └── message/
│   │       │                               ├── AuthRequest.java
│   │       │                               ├── AuthResponse.java
│   │       │                               ├── Message.java
│   │       │                               ├── SendResponse.java
│   │       │                               ├── SendToAllRequest.java
│   │       │                               ├── SendToOneRequest.java
│   │       │                               ├── SendToUserRequest.java
│   │       │                               └── UserJoinNoticeRequest.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab25/
│   │                               └── springwebsocket/
│   │                                   ├── Main.java
│   │                                   └── client/
│   │                                       ├── DemoWebSocketStompClient.java
│   │                                       └── handler/
│   │                                           ├── ConnectHandler.java
│   │                                           └── SendToUserRequestHandler.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot WebSocket 入门》.md
├── lab-26/
│   ├── lab-26-distributed-session-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab26/
│   │           │                   └── distributedsession/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── SessionConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── SessionController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-26-distributed-session-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab26/
│   │           │                   └── distributedsession/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── SessionConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── SessionController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-26-distributed-session-springsecurity/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab26/
│   │           │                   └── distributedsession/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── SessionConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── SessionController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 分布式 Session 入门》.md
├── lab-27/
│   ├── lab-27-webflux-01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── cn/
│   │       │           └── iocoder/
│   │       │               └── springboot/
│   │       │                   └── lab27/
│   │       │                       └── springwebflux/
│   │       │                           ├── Application.java
│   │       │                           ├── controller/
│   │       │                           │   ├── UserController.java
│   │       │                           │   └── UserRouter.java
│   │       │                           ├── dto/
│   │       │                           │   ├── UserAddDTO.java
│   │       │                           │   └── UserUpdateDTO.java
│   │       │                           ├── service/
│   │       │                           │   └── UserService.java
│   │       │                           └── vo/
│   │       │                               └── UserVO.java
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab27/
│   │                               └── springwebflux/
│   │                                   ├── controller/
│   │                                   │   ├── UserControllerTest.java
│   │                                   │   └── UserControllerTest2.java
│   │                                   └── package-info.java
│   ├── lab-27-webflux-02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab27/
│   │                               └── springwebflux/
│   │                                   ├── Application.java
│   │                                   ├── config/
│   │                                   │   └── WebFluxConfiguration.java
│   │                                   ├── constants/
│   │                                   │   └── ServiceExceptionEnum.java
│   │                                   ├── controller/
│   │                                   │   ├── UserController.java
│   │                                   │   └── UserRouter.java
│   │                                   ├── controller2/
│   │                                   │   └── TestController.java
│   │                                   ├── core/
│   │                                   │   ├── exception/
│   │                                   │   │   └── ServiceException.java
│   │                                   │   ├── filter/
│   │                                   │   │   └── DemoWebFilter.java
│   │                                   │   ├── package-info.java
│   │                                   │   ├── vo/
│   │                                   │   │   └── CommonResult.java
│   │                                   │   └── web/
│   │                                   │       ├── GlobalExceptionHandler.java
│   │                                   │       └── GlobalResponseBodyHandler.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-27-webflux-03/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab27/
│   │                               └── springwebflux/
│   │                                   ├── Application.java
│   │                                   ├── controller/
│   │                                   │   └── UserController.java
│   │                                   ├── core/
│   │                                   │   ├── package-info.java
│   │                                   │   └── servlet/
│   │                                   │       ├── TestFilter02.java
│   │                                   │       ├── TestServlet02.java
│   │                                   │       └── TestServletContextListener02.java
│   │                                   └── vo/
│   │                                       └── UserVO.java
│   ├── lab-27-webflux-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ElasticsearchConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── UserController.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserRepository.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── UserDO.java
│   │           │                       ├── dto/
│   │           │                       │   ├── UserAddDTO.java
│   │           │                       │   └── UserUpdateDTO.java
│   │           │                       └── vo/
│   │           │                           └── UserVO.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-27-webflux-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── controller/
│   │           │                       │   └── UserController.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserRepository.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── UserDO.java
│   │           │                       ├── dto/
│   │           │                       │   ├── UserAddDTO.java
│   │           │                       │   └── UserUpdateDTO.java
│   │           │                       └── vo/
│   │           │                           └── UserVO.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-27-webflux-r2dbc/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── DatabaseConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── UserController.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserRepository.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── UserDO.java
│   │           │                       ├── dto/
│   │           │                       │   ├── UserAddDTO.java
│   │           │                       │   └── UserUpdateDTO.java
│   │           │                       └── vo/
│   │           │                           └── UserVO.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── sql/
│   │                   └── users.sql
│   ├── lab-27-webflux-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab27/
│   │           │                   └── springwebflux/
│   │           │                       ├── Application.java
│   │           │                       ├── cacheobject/
│   │           │                       │   └── UserCacheObject.java
│   │           │                       ├── config/
│   │           │                       │   └── RedisConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── UserController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 响应式 WebFlux 入门》.md
├── lab-28/
│   ├── lab-28-task-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab28/
│   │           │                   └── task/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ScheduleConfiguration.java
│   │           │                       └── job/
│   │           │                           └── DemoJob.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-28-task-quartz-jdbc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab28/
│   │       │   │                   └── task/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── Application02.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── DataSourceConfiguration.java
│   │       │   │                       │   └── ScheduleConfiguration.java
│   │       │   │                       ├── job/
│   │       │   │                       │   ├── DemoJob01.java
│   │       │   │                       │   └── DemoJob02.java
│   │       │   │                       └── service/
│   │       │   │                           └── DemoService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab28/
│   │                               └── task/
│   │                                   └── QuartzSchedulerTest.java
│   ├── lab-28-task-quartz-memory/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab28/
│   │           │                   └── task/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ScheduleConfiguration.java
│   │           │                       ├── job/
│   │           │                       │   ├── DemoJob01.java
│   │           │                       │   └── DemoJob02.java
│   │           │                       └── service/
│   │           │                           └── DemoService.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-28-task-xxl-job/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab28/
│   │           │                   └── task/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── XxlJobConfiguration.java
│   │           │                       └── job/
│   │           │                           └── DemoJob.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 定时任务入门》.md
├── lab-29/
│   ├── lab-29-async-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab29/
│   │       │   │                   └── asynctask/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── Demo.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── AsyncConfig.java
│   │       │   │                       ├── core/
│   │       │   │                       │   ├── async/
│   │       │   │                       │   │   └── GlobalAsyncExceptionHandler.java
│   │       │   │                       │   └── package-info.java
│   │       │   │                       └── service/
│   │       │   │                           └── DemoService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab29/
│   │                               └── asynctask/
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── DemoServiceTest.java
│   ├── lab-29-async-two/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab29/
│   │       │   │                   └── asynctask/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── AsyncConfig.java
│   │       │   │                       └── service/
│   │       │   │                           └── DemoService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab29/
│   │                               └── asynctask/
│   │                                   ├── package-info.java
│   │                                   └── service/
│   │                                       └── DemoServiceTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 异步任务入门》.md
├── lab-30/
│   ├── lab-30-dubbo-annotations-demo/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api-02/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   └── dto/
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer-02/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       └── ConsumerApplication.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── user-rpc-service-provider-02/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   └── application.yaml
│   ├── lab-30-dubbo-annotations-nacos/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api-03/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   └── dto/
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer-03/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       └── ConsumerApplication.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── user-rpc-service-provider-03/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   └── application.yaml
│   ├── lab-30-dubbo-annotations-sentinel/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api-04/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   └── dto/
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer-04/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       ├── ConsumerApplication.java
│   │   │           │                       └── controller/
│   │   │           │                           └── UserController.java
│   │   │           └── resources/
│   │   │               ├── application.yaml
│   │   │               └── sentinel.properties
│   │   └── user-rpc-service-provider-04/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   ├── application.yaml
│   │                   └── sentinel.properties
│   ├── lab-30-dubbo-xml-demo/
│   │   ├── pom.xml
│   │   ├── user-rpc-service-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab30/
│   │   │                               └── rpc/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserRpcService.java
│   │   │                                   ├── core/
│   │   │                                   │   ├── ServiceException.java
│   │   │                                   │   └── ServiceExceptionEnum.java
│   │   │                                   └── dto/
│   │   │                                       ├── UserAddDTO.java
│   │   │                                       └── UserDTO.java
│   │   ├── user-rpc-service-consumer/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab30/
│   │   │           │                   └── rpc/
│   │   │           │                       └── ConsumerApplication.java
│   │   │           └── resources/
│   │   │               ├── application.yaml
│   │   │               └── dubbo.xml
│   │   └── user-rpc-service-provider/
│   │       ├── pom.xml
│   │       └── src/
│   │           └── main/
│   │               ├── java/
│   │               │   └── cn/
│   │               │       └── iocoder/
│   │               │           └── springboot/
│   │               │               └── lab30/
│   │               │                   └── rpc/
│   │               │                       ├── ProviderApplication.java
│   │               │                       ├── filter/
│   │               │                       │   └── DubboExceptionFilter.java
│   │               │                       └── service/
│   │               │                           └── UserRpcServiceImpl.java
│   │               └── resources/
│   │                   ├── META-INF/
│   │                   │   └── dubbo/
│   │                   │       └── org.apache.dubbo.rpc.Filter
│   │                   ├── application.yaml
│   │                   └── dubbo.xml
│   ├── pom.xml
│   ├── 《芋道 Dubbo Admin 快速入门》.md
│   ├── 《芋道 Dubbo Swagger 快速入门》.md
│   └── 《芋道 Spring Boot Dubbo 入门》.md
├── lab-31/
│   ├── lab-31-rocketmq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab31/
│   │       │   │                   └── rocketmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── Demo01AConsumer.java
│   │       │   │                       │   ├── Demo01Consumer.java
│   │       │   │                       │   ├── Demo02Consumer.java
│   │       │   │                       │   ├── Demo03Consumer.java
│   │       │   │                       │   ├── Demo04Consumer.java
│   │       │   │                       │   ├── Demo05Consumer.java
│   │       │   │                       │   ├── Demo06Consumer.java
│   │       │   │                       │   └── Demo07Consumer.java
│   │       │   │                       ├── core/
│   │       │   │                       │   └── ExtRocketMQTemplate.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── Demo01Message.java
│   │       │   │                       │   ├── Demo02Message.java
│   │       │   │                       │   ├── Demo03Message.java
│   │       │   │                       │   ├── Demo04Message.java
│   │       │   │                       │   ├── Demo05Message.java
│   │       │   │                       │   ├── Demo06Message.java
│   │       │   │                       │   └── Demo07Message.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── Demo01Producer.java
│   │       │   │                           ├── Demo02Producer.java
│   │       │   │                           ├── Demo03Producer.java
│   │       │   │                           ├── Demo04Producer.java
│   │       │   │                           ├── Demo05Producer.java
│   │       │   │                           ├── Demo06Producer.java
│   │       │   │                           └── Demo07Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab31/
│   │                               └── rocketmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── Demo01ProducerTest.java
│   │                                       ├── Demo02ProducerTest.java
│   │                                       ├── Demo03ProducerTest.java
│   │                                       ├── Demo04ProducerTest.java
│   │                                       ├── Demo05ProducerTest.java
│   │                                       ├── Demo06ProducerTest.java
│   │                                       └── Demo07ProducerTest.java
│   ├── lab-31-rocketmq-ons/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab31/
│   │       │   │                   └── rocketmqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo01Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo01Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo01Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab31/
│   │                               └── rocketmqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo01ProducerTest.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 RocketMQ 入门》.md
├── lab-32/
│   ├── lab-32-activemq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo01Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo01Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo01Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo01ProducerTest.java
│   ├── lab-32-activemq-demo-concurrency/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo03Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo03Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo03Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo03ProducerTest.java
│   ├── lab-32-activemq-demo-consume-retry/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── ActiveMQConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo05Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo05Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo05Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo05ProducerTest.java
│   ├── lab-32-activemq-demo-delay/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo02Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo02Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo02Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo02ProducerTest.java
│   ├── lab-32-activemq-demo-message-model/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── config/
│   │       │   │                       │   └── ActiveMQConfig.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   ├── BroadcastConsumer.java
│   │       │   │                       │   └── ClusteringConsumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   ├── BroadcastMessage.java
│   │       │   │                       │   └── ClusteringMessage.java
│   │       │   │                       └── producer/
│   │       │   │                           ├── BroadcastProducer.java
│   │       │   │                           └── ClusteringProducer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       ├── BroadcastProducerTest.java
│   │                                       └── ClusteringProducerTest.java
│   ├── lab-32-activemq-demo-orderly/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab32/
│   │       │   │                   └── activemqdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── consumer/
│   │       │   │                       │   └── Demo04Consumer.java
│   │       │   │                       ├── message/
│   │       │   │                       │   └── Demo04Message.java
│   │       │   │                       └── producer/
│   │       │   │                           └── Demo04Producer.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── package-info.java
│   │                                   └── producer/
│   │                                       └── Demo04ProducerTest.java
│   ├── lab-32-activemq-native/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab32/
│   │                               └── activemqdemo/
│   │                                   ├── ActiveMQConsumer.java
│   │                                   └── ActiveMQProducer.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 消息队列 ActiveMQ 入门》.md
├── lab-33/
│   ├── lab-33-shiro-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab01/
│   │           │                   └── shirodemo/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ShiroConfig.java
│   │           │                       └── controller/
│   │           │                           ├── DemoController.java
│   │           │                           ├── SecurityController.java
│   │           │                           └── TestController.java
│   │           └── resources/
│   │               └── static/
│   │                   └── login.html
│   ├── pom.xml
│   └── 《芋道 Spring Boot 安全框架 Shiro 入门》.md
├── lab-34/
│   ├── lab-34-actuator-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-auditevents/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── ActuateConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-custom-endpoint/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── endpoint/
│   │           │                           └── DemoEndPoint.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-health/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── actuate/
│   │           │                           └── DemoHealthIndicator.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-httptrace/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── ActuateConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-info/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       ├── config/
│   │           │                       │   └── ActuateConfig.java
│   │           │                       └── demo/
│   │           │                           └── DemoInfoContributor.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-metrics/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           ├── DemoController.java
│   │           │                           └── ExampleController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-demo-security/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── config/
│   │           │                           └── SecurityConfig.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-34-actuator-test/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab34/
│   │           │                   └── actuatordemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── TestController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 监控端点 Actuator 入门》.md
├── lab-35/
│   ├── lab-35-admin-01-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab35/
│   │                               └── adminserver/
│   │                                   └── AdminServerApplication.java
│   ├── lab-35-admin-01-demo-application/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── demo/
│   │           │                       └── DemoApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-02-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── adminserver/
│   │           │                       └── AdminServerApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-02-demo-application/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── demo/
│   │           │                       ├── Demo01Application.java
│   │           │                       └── Demo02Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-02-eurekaserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── eurekaserver/
│   │           │                       └── EurekaServerApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-03-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab35/
│   │                               └── adminserver/
│   │                                   ├── AdminServerApplication.java
│   │                                   └── config/
│   │                                       └── SecurityConfig.java
│   ├── lab-35-admin-03-demo-application/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── demo/
│   │           │                       └── DemoApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-04-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab35/
│   │           │                   └── adminserver/
│   │           │                       └── AdminServerApplication.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-35-admin-05-adminserver/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab35/
│   │                               └── adminserver/
│   │                                   ├── AdminServerApplication.java
│   │                                   └── notify/
│   │                                       └── LoggerNotifier.java
│   ├── pom.xml
│   └── 《芋道 Spring Boot 监控工具 Admin 入门》.md
├── lab-36/
│   ├── lab-36-prometheus-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab36/
│   │           │                   └── prometheusdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》.md
├── lab-37/
│   ├── lab-37-logging-actuator/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-aop/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       ├── aspect/
│   │           │                       │   └── HttpAccessAspect.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-debug/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-37-logging-log4j2/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── log4j2-spring.xml
│   ├── lab-37-logging-logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── logback-spring.xml
│   ├── lab-37-logging-multi-env/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab37/
│   │           │                   └── loggingdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               └── application-prod.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 日志集成 Logging 入门》.md
├── lab-38/
│   ├── lab-38-elk-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab38/
│   │           │                   └── elkdemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 日志平台 ELK + Filebeat 入门》.md
├── lab-39/
│   ├── lab-39-activemq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── ActiveMQApplication.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-async/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── AsyncApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       └── service/
│   │           │                           └── DemoService.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── ElasticsearchApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── ESUserDO.java
│   │           │                       └── repository/
│   │           │                           └── ESUserRepository.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-elasticsearch-jest/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── ElasticsearchJestApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── ESUserDO.java
│   │           │                       └── repository/
│   │           │                           └── ESUserRepository.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-kafka/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── KafkaApplication.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── LogbackApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               ├── application.yml
│   │               └── logback-spring.xml
│   ├── lab-39-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── MongoDBApplication.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       └── dataobject/
│   │           │                           └── UserDO.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-mysql/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── MySQLApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-opentracing/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── OpentracingApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-rabbitmq-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── RabbitMQApplication.java
│   │           │                       ├── config/
│   │           │                       │   └── RabbitConfig.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── RedisApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-rocketmq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       └── rocketmqdemo/
│   │           │                           ├── RocketMQApplication.java
│   │           │                           ├── consumer/
│   │           │                           │   └── DemoConsumer.java
│   │           │                           ├── controller/
│   │           │                           │   └── DemoController.java
│   │           │                           ├── message/
│   │           │                           │   └── DemoMessage.java
│   │           │                           └── producer/
│   │           │                               └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-39-skywalking-dubbo/
│   │   ├── lab-39-skywalking-dubbo-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab39/
│   │   │                               └── skywalkingdemo/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserService.java
│   │   │                                   └── package-info.java
│   │   ├── lab-39-skywalking-dubbo-consumer/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab39/
│   │   │           │                   └── skywalkingdemo/
│   │   │           │                       └── consumerdemo/
│   │   │           │                           ├── ConsumerApplication.java
│   │   │           │                           └── controller/
│   │   │           │                               └── UserController.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   ├── lab-39-skywalking-dubbo-provider/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab39/
│   │   │           │                   └── skywalkingdemo/
│   │   │           │                       └── providerdemo/
│   │   │           │                           ├── ProviderApplication.java
│   │   │           │                           └── service/
│   │   │           │                               └── UserServiceImpl.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── pom.xml
│   ├── lab-39-springmvc/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-39-trace-annotations/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab39/
│   │           │                   └── skywalkingdemo/
│   │           │                       ├── TraceAnnotationsApplication.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md
├── lab-40/
│   ├── lab-40-activemq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── ActiveMQApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── Application.java
│   │           │                       ├── Application2.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── ElasticsearchApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── dataobject/
│   │           │                       │   └── ESUserDO.java
│   │           │                       ├── repository/
│   │           │                       │   └── ESUserRepository.java
│   │           │                       └── spring/
│   │           │                           ├── ClusterNodes.java
│   │           │                           └── TracingTransportClientFactoryBean.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-40-kafka/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── KafkaApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── LogbackApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkin/
│   │           │                       ├── MongoDBApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       └── dataobject/
│   │           │                           └── UserDO.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-40-mysql/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── MySQLApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-opentracing/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── OpentracingApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yml
│   ├── lab-40-rabbitmq/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── RabbitMQApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── RabbitConfig.java
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       ├── consumer/
│   │           │                       │   └── DemoConsumer.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── message/
│   │           │                       │   └── DemoMessage.java
│   │           │                       └── producer/
│   │           │                           └── DemoProducer.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── RedisApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-springmvc/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── zipkindemo/
│   │           │                       ├── SpringMVCApplication.java
│   │           │                       ├── config/
│   │           │                       │   ├── SpringMvcConfiguration.java
│   │           │                       │   └── ZipkinConfiguration.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-40-zipkin-dubbo/
│   │   ├── lab-40-zipkin-dubbo-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── cn/
│   │   │                   └── iocoder/
│   │   │                       └── springboot/
│   │   │                           └── lab40/
│   │   │                               └── zipkindemo/
│   │   │                                   ├── api/
│   │   │                                   │   └── UserService.java
│   │   │                                   └── package-info.java
│   │   ├── lab-40-zipkin-dubbo-consumer/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab40/
│   │   │           │                   └── zpkindemo/
│   │   │           │                       └── consumerdemo/
│   │   │           │                           ├── ConsumerApplication.java
│   │   │           │                           ├── config/
│   │   │           │                           │   ├── SpringMvcConfiguration.java
│   │   │           │                           │   └── ZipkinConfiguration.java
│   │   │           │                           └── controller/
│   │   │           │                               └── UserController.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   ├── lab-40-zipkin-dubbo-provider/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── cn/
│   │   │           │       └── iocoder/
│   │   │           │           └── springboot/
│   │   │           │               └── lab40/
│   │   │           │                   └── zipkindemo/
│   │   │           │                       └── providerdemo/
│   │   │           │                           ├── ProviderApplication.java
│   │   │           │                           ├── config/
│   │   │           │                           │   └── ZipkinConfiguration.java
│   │   │           │                           └── service/
│   │   │           │                               └── UserServiceImpl.java
│   │   │           └── resources/
│   │   │               └── application.yaml
│   │   └── pom.xml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 链路追踪 Zipkin 入门》.md
├── lab-41/
│   ├── deploy.sh
│   ├── lab-41-demo01/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── jenkinsdemo/
│   │           │                       ├── Application.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               ├── application-local.yaml
│   │               ├── application-pre.yaml
│   │               ├── application-prod.yaml
│   │               └── application-uat.yaml
│   ├── lab-41-demo02/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab40/
│   │           │                   └── jenkinsdemo/
│   │           │                       ├── Demo02Application.java
│   │           │                       ├── actuate/
│   │           │                       │   └── ServerHealthIndicator.java
│   │           │                       └── controller/
│   │           │                           └── DemoController.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               ├── application-local.yaml
│   │               ├── application-pre.yaml
│   │               ├── application-prod.yaml
│   │               └── application-uat.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 持续交付 Jenkins 入门》.md
├── lab-42/
│   ├── lab-42-demo01/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab23/
│   │       │   │                   └── testdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── controller/
│   │       │   │                       │   └── UserController.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab23/
│   │           │                   └── testdemo/
│   │           │                       ├── controller/
│   │           │                       │   └── UserControllerTest.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserDaoTest.java
│   │           │                       ├── package-info.java
│   │           │                       └── service/
│   │           │                           └── UserServiceTest.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── sql/
│   │                   ├── clean.sql
│   │                   └── create_tables.sql
│   ├── lab-42-demo02/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab23/
│   │       │   │                   └── testdemo/
│   │       │   │                       ├── Application.java
│   │       │   │                       ├── controller/
│   │       │   │                       │   └── UserController.java
│   │       │   │                       ├── dao/
│   │       │   │                       │   └── UserDao.java
│   │       │   │                       ├── dataobject/
│   │       │   │                       │   └── UserDO.java
│   │       │   │                       └── service/
│   │       │   │                           └── UserService.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab23/
│   │           │                   └── testdemo/
│   │           │                       ├── controller/
│   │           │                       │   └── UserControllerTest.java
│   │           │                       ├── dao/
│   │           │                       │   └── UserDaoTest.java
│   │           │                       ├── package-info.java
│   │           │                       └── service/
│   │           │                           ├── UserServiceTest.java
│   │           │                           └── UserServiceTest2.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── sql/
│   │                   ├── clean.sql
│   │                   └── create_tables.sql
│   ├── pom.xml
│   └── 《芋道 Spring Boot 单元测试 Test 入门》.md
├── lab-43/
│   ├── lab-43-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab43/
│   │           │                   └── propertydemo/
│   │           │                       ├── Application.java
│   │           │                       └── OrderProperties.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-43-demo-configname/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab43/
│   │           │                   └── propertydemo/
│   │           │                       └── Application.java
│   │           └── resources/
│   │               ├── application.yaml
│   │               └── rpc.yaml
│   ├── lab-43-demo-jasypt/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── cn/
│   │       │   │       └── iocoder/
│   │       │   │           └── springboot/
│   │       │   │               └── lab43/
│   │       │   │                   └── propertydemo/
│   │       │   │                       └── Application.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           └── java/
│   │               └── cn/
│   │                   └── iocoder/
│   │                       └── springboot/
│   │                           └── lab43/
│   │                               └── propertydemo/
│   │                                   └── JasyptTest.java
│   ├── lab-43-demo-profiles/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab43/
│   │           │                   └── propertydemo/
│   │           │                       └── ProfilesApplication.java
│   │           └── resources/
│   │               ├── application-dev.yaml
│   │               ├── application-local.yaml
│   │               ├── application-pre.yaml
│   │               ├── application-prod.yaml
│   │               ├── application-uat.yaml
│   │               └── application.yaml
│   ├── pom.xml
│   └── 《芋道 Spring Boot 配置文件入门》.md
├── lab-44/
│   ├── lab-44-nacos-config-demo/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab44/
│   │           │                   └── nacosdemo/
│   │           │                       ├── Application.java
│   │           │                       └── OrderProperties.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-44-nacos-config-demo-actuator/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab44/
│   │           │                   └── nacosdemo/
│   │           │                       ├── Application.java
│   │           │                       ├── controller/
│   │           │                       │   └── DemoController.java
│   │           │                       ├── listener/
│   │           │                       │   └── LoggingSystemConfigListener.java
│   │           │                       └── properties/
│   │           │                           └── TestProperties.java
│   │           └── resources/
│   │               └── application.yaml
│   ├── lab-44-nacos-config-demo-auto-refresh/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── cn/
│   │           │       └── iocoder/
│   │           │           └── springboot/
│   │           │               └── lab44/
│   │           │                   └── nacosdemo/
│   │           │                       ├── App
Download .txt
Showing preview only (707K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6618 symbols across 2052 files)

FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java
  class SecurityConfig (line 10) | @Configuration
    method configure (line 14) | @Override
    method configure (line 36) | @Override

FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java
  class DemoController (line 10) | @RestController
    method demo (line 14) | @PermitAll
    method home (line 20) | @GetMapping("/home")
    method admin (line 25) | @PreAuthorize("hasRole('ROLE_ADMIN')")
    method normal (line 31) | @PreAuthorize("hasRole('ROLE_NORMAL')")

FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java
  class TestController (line 7) | @RestController
    method demo (line 11) | @GetMapping("/demo")
    method home (line 16) | @GetMapping("/home")
    method admin (line 21) | @GetMapping("/admin")
    method normal (line 26) | @GetMapping("/normal")

FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java
  class AdminController (line 7) | @RestController
    method demo (line 11) | @GetMapping("/demo")

FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java
  class OAuth2AuthorizationServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java
  class OAuth2ResourceServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java
  class ExampleController (line 9) | @RestController
    method hello (line 13) | @RequestMapping("/hello")

FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
  class OAuth2AuthorizationServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
  class OAuth2ResourceServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
  class ExampleController (line 9) | @RestController
    method hello (line 13) | @RequestMapping("/hello")

FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
  class OAuth2AuthorizationServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
  class OAuth2ResourceServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/api/ExampleController.java
  class ExampleController (line 9) | @RestController
    method hello (line 14) | @RequestMapping("/hello")

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java
  class OAuth2AuthorizationServer (line 19) | @Configuration
    method configure (line 30) | @Override
    method configure (line 36) | @Override
    method dataSource (line 49) | @Bean
    method tokenStore (line 59) | @Bean

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java
  class OAuth2ResourceServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java
  class ExampleController (line 9) | @RestController
    method hello (line 13) | @RequestMapping("/hello")

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql
  type oauth_client_details (line 3) | create table oauth_client_details (
  type oauth_client_token (line 17) | create table if not exists oauth_client_token (
  type oauth_access_token (line 25) | create table if not exists oauth_access_token (
  type oauth_refresh_token (line 35) | create table if not exists oauth_refresh_token (
  type oauth_code (line 41) | create table if not exists oauth_code (
  type oauth_approvals (line 45) | create table if not exists oauth_approvals (
  type ClientDetails (line 54) | create table if not exists ClientDetails (

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
  class OAuth2AuthorizationServer (line 12) | @Configuration
    method configure (line 20) | @Override
    method configure (line 25) | @Override

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java
  class OAuth2ResourceServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java
  class ExampleController (line 9) | @RestController
    method hello (line 13) | @RequestMapping("/hello")

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java
  class OAuth2AuthorizationServer (line 12) | @Configuration
    method configure (line 20) | @Override
    method configure (line 25) | @Override

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java
  class TokenController (line 12) | @RestController
    method revokeToken (line 20) | @RequestMapping(method = RequestMethod.POST, value = "api/access_token...
    method revokeRefreshToken (line 26) | @RequestMapping(method = RequestMethod.POST, value = "api/refresh_toke...

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java
  class OAuth2ResourceServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java
  class ExampleController (line 9) | @RestController
    method hello (line 13) | @RequestMapping("/hello")

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
  class OAuth2AuthorizationServer (line 12) | @Configuration
    method configure (line 20) | @Override
    method configure (line 25) | @Override

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
  class OAuth2ResourceServer (line 9) | @Configuration
    method configure (line 13) | @Override

FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
  class ExampleController (line 9) | @RestController
    method hello (line 13) | @RequestMapping("/hello")

FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo08Consumer.java
  class Demo08Consumer (line 10) | @Component
    method onMessage (line 15) | @KafkaListener(topics = Demo08Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo08Message.java
  class Demo08Message (line 6) | public class Demo08Message {
    method setId (line 15) | public Demo08Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08Producer.java
  class Demo08Producer (line 12) | @Component
    method syncSend (line 18) | public SendResult syncSend(Integer id) throws ExecutionException, Inte...

FILE: lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08ProducerTest.java
  class Demo08ProducerTest (line 17) | @RunWith(SpringRunner.class)
    method testSyncSend (line 26) | @Test

FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
  class Demo02Consumer (line 11) | @Component
    method onMessage (line 16) | @KafkaListener(topics = Demo02Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
  class Demo02Message (line 6) | public class Demo02Message {
    method setId (line 15) | public Demo02Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
  class Demo02Producer (line 11) | @Component
    method asyncSend (line 17) | public ListenableFuture<SendResult<Object, Object>> asyncSend(Integer ...

FILE: lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
  class Demo02ProducerTest (line 16) | @RunWith(SpringRunner.class)
    method testASyncSend (line 25) | @Test

FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java
  class Demo02Consumer (line 9) | @Component
    method onMessage (line 14) | @KafkaListener(topics = Demo02Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java
  class Demo02Message (line 6) | public class Demo02Message {
    method setId (line 15) | public Demo02Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java
  class Demo02Producer (line 11) | @Component
    method asyncSend (line 17) | public ListenableFuture<SendResult<Object, Object>> asyncSend(Integer ...

FILE: lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java
  class Demo02ProducerTest (line 16) | @RunWith(SpringRunner.class)
    method testASyncSend (line 25) | @Test

FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo05Consumer.java
  class Demo05Consumer (line 9) | @Component
    method onMessage (line 14) | @KafkaListener(topics = Demo05Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo05Message.java
  class Demo05Message (line 6) | public class Demo05Message {
    method setId (line 15) | public Demo05Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05Producer.java
  class Demo05Producer (line 11) | @Component
    method syncSend (line 17) | public SendResult syncSend(Integer id) throws ExecutionException, Inte...

FILE: lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05ProducerTest.java
  class Demo05ProducerTest (line 16) | @RunWith(SpringRunner.class)
    method test (line 25) | @Test
    method testSyncSend (line 31) | @Test

FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo06Consumer.java
  class Demo06Consumer (line 9) | @Component
    method onMessage (line 14) | @KafkaListener(topics = Demo06Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo06Message.java
  class Demo06Message (line 6) | public class Demo06Message {
    method setId (line 15) | public Demo06Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06Producer.java
  class Demo06Producer (line 11) | @Component
    method syncSend (line 17) | public SendResult syncSend(Integer id) throws ExecutionException, Inte...
    method syncSendOrderly (line 25) | public SendResult syncSendOrderly(Integer id) throws ExecutionExceptio...

FILE: lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06ProducerTest.java
  class Demo06ProducerTest (line 16) | @RunWith(SpringRunner.class)
    method testSyncSend (line 25) | @Test
    method testSyncSendOrderly (line 37) | @Test

FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo07Consumer.java
  class Demo07Consumer (line 9) | @Component
    method onMessage (line 14) | @KafkaListener(topics = Demo07Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo07Message.java
  class Demo07Message (line 6) | public class Demo07Message {
    method setId (line 15) | public Demo07Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07Producer.java
  class Demo07Producer (line 15) | @Component
    method syncSend (line 23) | public SendResult syncSend(Integer id) throws ExecutionException, Inte...
    method syncSendInTransaction (line 31) | public String syncSendInTransaction(Integer id, Runnable runner) throw...

FILE: lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07ProducerTest.java
  class Demo07ProducerTest (line 17) | @RunWith(SpringRunner.class)
    method testSyncSend (line 26) | @Test
    method testSyncSendInTransaction (line 36) | @Test

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java
  class KafkaConfiguration (line 11) | @Configuration
    method kafkaErrorHandler (line 14) | @Bean

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java
  class Demo01AConsumer (line 10) | @Component
    method onMessage (line 15) | @KafkaListener(topics = Demo01Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java
  class Demo01Consumer (line 9) | @Component
    method onMessage (line 14) | @KafkaListener(topics = Demo01Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java
  class Demo04Consumer (line 11) | @Component
    method onMessage (line 18) | @KafkaListener(topics = Demo04Message.TOPIC,

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java
  class Demo01Message (line 6) | public class Demo01Message {
    method setId (line 15) | public Demo01Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java
  class Demo04Message (line 6) | public class Demo04Message {
    method setId (line 15) | public Demo04Message setId(Integer id) {
    method getId (line 20) | public Integer getId() {
    method toString (line 24) | @Override

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java
  class Demo01Producer (line 12) | @Component
    method syncSend (line 18) | public SendResult syncSend(Integer id) throws ExecutionException, Inte...
    method asyncSend (line 26) | public ListenableFuture<SendResult<Object, Object>> asyncSend(Integer ...

FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04Producer.java
  class Demo04Producer (line 11) | @Component
    method syncSend (line 17) | public SendResult syncSend(Integer id) throws ExecutionException, Inte...

FILE: lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01ProducerTest.java
  class Demo01ProducerTest (line 17) | @RunWith(SpringRunner.class)
    method testSyncSend (line 26) | @Test
    method testASyncSend (line 36) | @Test

FILE: lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04ProducerTest.java
  class Demo04ProducerTest (line 16) | @RunWith(SpringRunner.class)
    method testSyncSend (line 25) | @Test
    method testSyncSendX (line 35) | @Test

FILE: lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ConsumerMain.java
  class ConsumerMain (line 13) | public class ConsumerMain {
    method createConsumer (line 15) | private static Consumer<String, String> createConsumer() {
    method main (line 31) | public static void main(String[] args) {

FILE: lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ProducerMain.java
  class ProducerMain (line 13) | public class ProducerMain {
    method createProducer (line 15) | private static Producer<String, String> createProducer() {
    method main (line 33) | public static void main(String[] args) throws ExecutionException, Inte...

FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 8) | @Configuration
    class DirectExchangeDemoConfiguration (line 14) | public static class DirectExchangeDemoConfiguration {
      method demo07Queue (line 17) | @Bean
      method demo07DeadQueue (line 28) | @Bean
      method demo07Exchange (line 37) | @Bean
      method demo07Binding (line 48) | @Bean
      method demo07DeadBinding (line 57) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07Consumer.java
  class Demo07Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07DeadConsumer.java
  class Demo07DeadConsumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo07Message.java
  class Demo07Message (line 5) | public class Demo07Message implements Serializable {
    method setId (line 21) | public Demo07Message setId(Integer id) {
    method getId (line 26) | public Integer getId() {
    method toString (line 30) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07Producer.java
  class Demo07Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07ProducerTest.java
  class Demo07ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo12Queue (line 20) | @Bean
      method demo12Exchange (line 29) | @Bean
      method demo12Binding (line 40) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo12Consumer.java
  class Demo12Consumer (line 15) | @Component
    method onMessage (line 21) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo12Message.java
  class Demo12Message (line 5) | public class Demo12Message implements Serializable {
    method setId (line 18) | public Demo12Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12Producer.java
  class Demo12Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-ack/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo12ProducerTest.java
  class Demo12ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 14) | @Configuration
    class DirectExchangeDemoConfiguration (line 20) | public static class DirectExchangeDemoConfiguration {
      method demo06Queue (line 23) | @Bean
      method demo06Exchange (line 32) | @Bean
      method demo06Binding (line 43) | @Bean
    method consumerBatchContainerFactory (line 50) | @Bean(name = "consumerBatchContainerFactory")

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo06Consumer.java
  class Demo06Consumer (line 12) | @Component
    method onMessage (line 19) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo06Message.java
  class Demo06Message (line 5) | public class Demo06Message implements Serializable {
    method setId (line 18) | public Demo06Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
  class Demo06Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume-02/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06ProducerTest.java
  class Demo06ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend01 (line 23) | @Test
    method testSyncSen02 (line 29) | @Test
    method testSyncSend (line 35) | private void testSyncSend(int n) throws InterruptedException {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 19) | @Configuration
    class DirectExchangeDemoConfiguration (line 25) | public static class DirectExchangeDemoConfiguration {
      method demo05Queue (line 28) | @Bean
      method demo05Exchange (line 37) | @Bean
      method demo05Binding (line 48) | @Bean
    method batchRabbitTemplate (line 55) | @Bean
    method consumerBatchContainerFactory (line 72) | @Bean(name = "consumerBatchContainerFactory")

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
  class Demo05Consumer (line 12) | @Component
    method onMessage (line 19) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
  class Demo05Message (line 5) | public class Demo05Message implements Serializable {
    method setId (line 18) | public Demo05Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo06Producer.java
  class Demo06Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
  class Demo05ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 17) | @Configuration
    class DirectExchangeDemoConfiguration (line 23) | public static class DirectExchangeDemoConfiguration {
      method demo05Queue (line 26) | @Bean
      method demo05Exchange (line 35) | @Bean
      method demo05Binding (line 46) | @Bean
    method batchRabbitTemplate (line 53) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo05Consumer.java
  class Demo05Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo05Message.java
  class Demo05Message (line 5) | public class Demo05Message implements Serializable {
    method setId (line 18) | public Demo05Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05Producer.java
  class Demo05Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-batch/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo05ProducerTest.java
  class Demo05ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo09Queue (line 20) | @Bean
      method demo09Exchange (line 29) | @Bean
      method demo09Binding (line 40) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo09Consumer.java
  class Demo09Consumer (line 10) | @Component
    method onMessage (line 19) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo09Message.java
  class Demo09Message (line 5) | public class Demo09Message implements Serializable {
    method setId (line 18) | public Demo09Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09Producer.java
  class Demo09Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-concurrency/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo09ProducerTest.java
  class Demo09ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo13Queue (line 20) | @Bean
      method demo13Exchange (line 29) | @Bean
      method demo13Binding (line 40) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
  class Demo13Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerConfirmCallback.java
  class RabbitProducerConfirmCallback (line 9) | @Component
    method RabbitProducerConfirmCallback (line 14) | public RabbitProducerConfirmCallback(RabbitTemplate rabbitTemplate) {
    method confirm (line 18) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitProducerReturnCallback.java
  class RabbitProducerReturnCallback (line 9) | @Component
    method RabbitProducerReturnCallback (line 14) | public RabbitProducerReturnCallback(RabbitTemplate rabbitTemplate) {
    method returnedMessage (line 18) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
  class Demo13Message (line 5) | public class Demo13Message implements Serializable {
    method setId (line 18) | public Demo13Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
  class Demo13Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {
    method syncSendReturn (line 22) | public void syncSendReturn(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm-async/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
  class Demo13ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test
    method testSyncSendReturn (line 33) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo13Queue (line 20) | @Bean
      method demo13Exchange (line 29) | @Bean
      method demo13Binding (line 40) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo13Consumer.java
  class Demo13Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo13Message.java
  class Demo13Message (line 5) | public class Demo13Message implements Serializable {
    method setId (line 18) | public Demo13Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13Producer.java
  class Demo13Producer (line 14) | @Component
    method syncSend (line 22) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-confirm/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo13ProducerTest.java
  class Demo13ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 8) | @Configuration
    class DirectExchangeDemoConfiguration (line 14) | public static class DirectExchangeDemoConfiguration {
      method demo08Queue (line 17) | @Bean
      method demo08DelayQueue (line 29) | @Bean
      method demo08Exchange (line 38) | @Bean
      method demo08Binding (line 49) | @Bean
      method demo08DelayBinding (line 58) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo08Consumer.java
  class Demo08Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo08Message.java
  class Demo08Message (line 5) | public class Demo08Message implements Serializable {
    method setId (line 20) | public Demo08Message setId(Integer id) {
    method getId (line 25) | public Integer getId() {
    method toString (line 29) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08Producer.java
  class Demo08Producer (line 11) | @Component
    method syncSend (line 17) | public void syncSend(Integer id, Integer delay) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-delay/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo08ProducerTest.java
  class Demo08ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend01 (line 23) | @Test
    method testSyncSend02 (line 29) | @Test
    method testSyncSendDelay (line 35) | private void testSyncSendDelay(Integer delay) throws InterruptedExcept...

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo16Queue (line 20) | @Bean
      method demo16Exchange (line 29) | @Bean
      method demo16Binding (line 40) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo16Consumer.java
  class Demo16Consumer (line 10) | @Component
    method onMessage (line 18) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitListenerErrorHandlerImpl.java
  class RabbitListenerErrorHandlerImpl (line 10) | @Component("rabbitListenerErrorHandler")
    method handleError (line 15) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/core/RabbitLoggingErrorHandler.java
  class RabbitLoggingErrorHandler (line 9) | @Component
    method RabbitLoggingErrorHandler (line 14) | public RabbitLoggingErrorHandler(SimpleRabbitListenerContainerFactory ...
    method handleError (line 18) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo16Message.java
  class Demo16Message (line 5) | public class Demo16Message implements Serializable {
    method setId (line 18) | public Demo16Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16Producer.java
  class Demo16Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-error-handler/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo16ProducerTest.java
  class Demo16ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 13) | @Configuration
    class DirectExchangeDemoConfiguration (line 19) | public static class DirectExchangeDemoConfiguration {
      method demo15Queue (line 22) | @Bean
      method demo15Exchange (line 31) | @Bean
      method demo15Binding (line 42) | @Bean
    method messageConverter (line 49) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo15Consumer.java
  class Demo15Consumer (line 11) | @Component
    method onMessage (line 17) | @RabbitHandler(isDefault = true)

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo15Message.java
  class Demo15Message (line 5) | public class Demo15Message implements Serializable {
    method setId (line 18) | public Demo15Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15Producer.java
  class Demo15Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-json/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo15ProducerTest.java
  class Demo15ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 9) | @Configuration
    class BroadcastingConfiguration (line 15) | public static class BroadcastingConfiguration {
      method broadcastingExchange (line 18) | @Bean
    class ClusteringConfiguration (line 30) | public static class ClusteringConfiguration {
      method clusteringExchange (line 33) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/BroadcastConsumer.java
  class BroadcastConsumer (line 10) | @Component
    method onMessage (line 28) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/ClusteringConsumer.java
  class ClusteringConsumer (line 10) | @Component
    method onMessage (line 28) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/BroadcastMessage.java
  class BroadcastMessage (line 8) | public class BroadcastMessage implements Serializable {
    method setId (line 19) | public BroadcastMessage setId(Integer id) {
    method getId (line 24) | public Integer getId() {
    method toString (line 28) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/ClusteringMessage.java
  class ClusteringMessage (line 8) | public class ClusteringMessage implements Serializable {
    method setId (line 19) | public ClusteringMessage setId(Integer id) {
    method getId (line 24) | public Integer getId() {
    method toString (line 28) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducer.java
  class BroadcastProducer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducer.java
  class ClusteringProducer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/BroadcastProducerTest.java
  class BroadcastProducerTest (line 14) | @RunWith(SpringRunner.class)
    method mock (line 23) | @Test
    method testSyncSend (line 29) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-message-model/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/ClusteringProducerTest.java
  class ClusteringProducerTest (line 14) | @RunWith(SpringRunner.class)
    method mock (line 23) | @Test
    method testSyncSend (line 29) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 10) | @SpringBootApplication
    method main (line 14) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo10Queue0 (line 20) | @Bean
      method demo10Queue1 (line 24) | @Bean
      method demo10Queue2 (line 28) | @Bean
      method demo10Queue3 (line 32) | @Bean
      method demo10Exchange (line 38) | @Bean
      method demo10Binding0 (line 46) | @Bean
      method demo10Binding1 (line 50) | @Bean
      method demo10Binding2 (line 54) | @Bean
      method demo10Binding3 (line 58) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo10Consumer.java
  class Demo10Consumer (line 11) | @Component
    method onMessage (line 20) | @RabbitHandler(isDefault = true)
    method getQueue (line 26) | private static String getQueue(Message<Demo10Message> message) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo10Message.java
  class Demo10Message (line 5) | public class Demo10Message implements Serializable {
    method setId (line 22) | public Demo10Message setId(Integer id) {
    method getId (line 27) | public Integer getId() {
    method toString (line 31) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10Producer.java
  class Demo10Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {
    method getRoutingKey (line 22) | private String getRoutingKey(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-orderly/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo10ProducerTest.java
  class Demo10ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo01Queue (line 20) | @Bean
      method demo01Exchange (line 29) | @Bean
      method demo01Binding (line 40) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo14Consumer.java
  class Demo14Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo14Message.java
  class Demo14Message (line 5) | public class Demo14Message implements Serializable {
    method setId (line 18) | public Demo14Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14Producer.java
  class Demo14Producer (line 11) | @Component
    method syncSend (line 17) | public String syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-rpc/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo14ProducerTest.java
  class Demo14ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 15) | @Configuration
    class DirectExchangeDemoConfiguration (line 22) | public static class DirectExchangeDemoConfiguration {
      method demo11Queue (line 25) | @Bean
      method demo11Exchange (line 34) | @Bean
      method demo11Binding (line 45) | @Bean
    method rabbitTransactionManager (line 52) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo11Consumer.java
  class Demo11Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo11Message.java
  class Demo11Message (line 5) | public class Demo11Message implements Serializable {
    method setId (line 18) | public Demo11Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11Producer.java
  class Demo11Producer (line 11) | @Component
    method syncSend (line 19) | @Transactional

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo-transaction/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo11ProducerTest.java
  class Demo11ProducerTest (line 12) | @RunWith(SpringRunner.class)
    method testSyncSend (line 19) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java
  class RabbitConfig (line 11) | @Configuration
    class DirectExchangeDemoConfiguration (line 17) | public static class DirectExchangeDemoConfiguration {
      method demo01Queue (line 20) | @Bean
      method demo01Exchange (line 29) | @Bean
      method demo01Binding (line 40) | @Bean
    class TopicExchangeDemoConfiguration (line 50) | public static class TopicExchangeDemoConfiguration {
      method demo02Queue (line 53) | @Bean
      method demo02Exchange (line 62) | @Bean
      method demo02Binding (line 73) | @Bean
    class FanoutExchangeDemoConfiguration (line 83) | public static class FanoutExchangeDemoConfiguration {
      method demo03QueueA (line 86) | @Bean
      method demo03QueueB (line 95) | @Bean
      method demo03Exchange (line 104) | @Bean
      method demo03BindingA (line 114) | @Bean
      method demo03BindingB (line 122) | @Bean
    class HeadersExchangeDemoConfiguration (line 132) | public static class HeadersExchangeDemoConfiguration {
      method demo04Queue (line 135) | @Bean
      method demo04Exchange (line 144) | @Bean
      method demo4Binding (line 155) | @Bean

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo01Consumer.java
  class Demo01Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo02Consumer.java
  class Demo02Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerA.java
  class Demo03ConsumerA (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerB.java
  class Demo03ConsumerB (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo04Consumer.java
  class Demo04Consumer (line 10) | @Component
    method onMessage (line 16) | @RabbitHandler

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo01Message.java
  class Demo01Message (line 5) | public class Demo01Message implements Serializable {
    method setId (line 18) | public Demo01Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo02Message.java
  class Demo02Message (line 5) | public class Demo02Message implements Serializable {
    method setId (line 18) | public Demo02Message setId(Integer id) {
    method getId (line 23) | public Integer getId() {
    method toString (line 27) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo03Message.java
  class Demo03Message (line 5) | public class Demo03Message implements Serializable {
    method setId (line 17) | public Demo03Message setId(Integer id) {
    method getId (line 22) | public Integer getId() {
    method toString (line 26) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo04Message.java
  class Demo04Message (line 5) | public class Demo04Message implements Serializable {
    method setId (line 19) | public Demo04Message setId(Integer id) {
    method getId (line 24) | public Integer getId() {
    method toString (line 28) | @Override

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01Producer.java
  class Demo01Producer (line 11) | @Component
    method syncSend (line 17) | public void syncSend(Integer id) {
    method syncSendDefault (line 25) | public void syncSendDefault(Integer id) {
    method asyncSend (line 33) | @Async

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02Producer.java
  class Demo02Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id, String routingKey) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03Producer.java
  class Demo03Producer (line 8) | @Component
    method syncSend (line 14) | public void syncSend(Integer id) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04Producer.java
  class Demo04Producer (line 10) | @Component
    method syncSend (line 16) | public void syncSend(Integer id, String headerValue) {

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo01ProducerTest.java
  class Demo01ProducerTest (line 15) | @RunWith(SpringRunner.class)
    method testSyncSend (line 24) | @Test
    method tesSyncSendDefault (line 34) | @Test
    method testAsyncSend (line 44) | @Test
    method nothing (line 66) | @Test
    method nothing02 (line 72) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo02ProducerTest.java
  class Demo02ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSendSuccess (line 23) | @Test
    method testSyncSendFailure (line 33) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo03ProducerTest.java
  class Demo03ProducerTest (line 14) | @RunWith(SpringRunner.class)
    method testSyncSend (line 23) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-demo/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo04ProducerTest.java
  class Demo04ProducerTest (line 15) | @RunWith(SpringRunner.class)
    method testSyncSendSuccess (line 24) | @Test
    method testSyncSendFailure (line 34) | @Test

FILE: lab-04-rabbitmq/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQConsumer.java
  class RabbitMQConsumer (line 9) | public class RabbitMQConsumer {
    method main (line 11) | public static void main(String[] args) throws IOException, TimeoutExce...

FILE: lab-04-rabbitmq/lab-04-rabbitmq-native/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/RabbitMQProducer.java
  class RabbitMQProducer (line 11) | public class RabbitMQProducer {
    method main (line 22) | public static void main(String[] args) throws IOException, TimeoutExce...
    method getConnection (line 43) | public static Connection getConnection() throws IOException, TimeoutEx...
    method initExchangeAndQueue (line 54) | private static void initExchangeAndQueue(Channel channel) throws IOExc...

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
  class Controller (line 6) | @RestController
    method hello (line 9) | @GetMapping("/hello")

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/JettyApplication.java
  class JettyApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
  class Controller (line 6) | @RestController
    method hello (line 9) | @GetMapping("/hello")

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatAprApplication.java
  class TomcatAprApplication (line 10) | @SpringBootApplication
    method servletWebServerFactory (line 13) | @Bean
    method main (line 23) | public static void main(String[] args) {

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java
  class Controller (line 6) | @RestController
    method hello (line 9) | @GetMapping("/hello")
    method sleep (line 14) | @GetMapping("/sleep")

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatApplication.java
  class TomcatApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/Controller.java
  class Controller (line 6) | @RestController
    method hello (line 9) | @GetMapping("/hello")

FILE: lab-05-benchmark-tomcat-jetty-undertow/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/UndertowApplication.java
  class UndertowApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-06/lab-06-springmvc-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/springmvc/Controller.java
  class Controller (line 6) | @RestController
    method hello (line 9) | @GetMapping("/hello")
    method sleep (line 15) | @GetMapping("/sleep")

FILE: lab-06/lab-06-springmvc-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/springmvc/SpringMVCApplication.java
  class SpringMVCApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-06/lab-06-webflux-netty/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/Controller.java
  class Controller (line 8) | @RestController
    method hello (line 11) | @GetMapping("/hello")
    method sleepDirect (line 16) | @GetMapping("/sleep_direct")
    method sleep (line 22) | @GetMapping("/sleep")

FILE: lab-06/lab-06-webflux-netty/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/WebfluxNettyApplication.java
  class WebfluxNettyApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-06/lab-06-webflux-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/Controller.java
  class Controller (line 11) | @RestController
    method hello (line 14) | @GetMapping("/hello")
    method sleepDirect (line 19) | @GetMapping("/sleep_direct")
    method sleep (line 25) | @GetMapping("/sleep")
    method sleep2 (line 41) | @GetMapping("/sleep2")

FILE: lab-06/lab-06-webflux-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/WebfluxTomcatApplication.java
  class WebfluxTomcatApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-07/lab-07-spring-cloud-gateway/src/main/java/cn/iocoder/springboot/labs/lab07/springcloudgateway/SpringCloudGatewayApplication.java
  class SpringCloudGatewayApplication (line 9) | @SpringBootApplication
    method myRouteLocator (line 12) | @Bean
    method main (line 22) | public static void main(String[] args) {

FILE: lab-07/lab-07-zuul/src/main/java/cn/iocoder/springboot/labs/lab07/zuul/ZuulApplication.java
  class ZuulApplication (line 7) | @EnableZuulProxy
    method main (line 11) | public static void main(String[] args) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
  class Application (line 5) | @SpringBootApplication

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
  class RedisConfiguration (line 9) | @Configuration
    method redisTemplate (line 12) | @Bean

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
  class JSONUtil (line 8) | public class JSONUtil {
    method parseObject (line 10) | public static  <T> T parseObject(String text, Class<T> clazz) {
    method toJSONString (line 14) | public static String toJSONString(Object javaObject) {
    method toJSONBytes (line 18) | public static byte[] toJSONBytes(Object javaObject) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
  class Test01 (line 16) | @RunWith(SpringRunner.class)
    method test01 (line 29) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-unit-test/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/TestRedisConfiguration.java
  class TestRedisConfiguration (line 10) | @TestConfiguration
    method TestRedisConfiguration (line 15) | public TestRedisConfiguration(RedisProperties redisProperties) {
    method postConstruct (line 24) | @PostConstruct
    method preDestroy (line 29) | @PreDestroy

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
  class Application (line 5) | @SpringBootApplication

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
  class ProductCacheObject (line 6) | public class ProductCacheObject {
    method getId (line 21) | public Integer getId() {
    method setId (line 25) | public ProductCacheObject setId(Integer id) {
    method getName (line 30) | public String getName() {
    method setName (line 34) | public ProductCacheObject setName(String name) {
    method getCid (line 39) | public Integer getCid() {
    method setCid (line 43) | public ProductCacheObject setCid(Integer cid) {
    method toString (line 48) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
  class UserCacheObject (line 6) | public class UserCacheObject {
    method getId (line 21) | public Integer getId() {
    method setId (line 25) | public UserCacheObject setId(Integer id) {
    method getName (line 30) | public String getName() {
    method setName (line 34) | public UserCacheObject setName(String name) {
    method getGender (line 39) | public Integer getGender() {
    method setGender (line 43) | public UserCacheObject setGender(Integer gender) {
    method toString (line 48) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
  class RedisConfiguration (line 12) | @Configuration
    method redisTemplate (line 15) | @Bean
    method listenerContainer (line 43) | public RedisMessageListenerContainer listenerContainer(RedisConnection...

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
  class UserCacheDao (line 10) | @Repository
    method buildKey (line 19) | private static String buildKey(Integer id) {
    method get (line 23) | public UserCacheObject get(Integer id) {
    method set (line 29) | public void set(Integer id, UserCacheObject object) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
  class TestChannelTopicMessageListener (line 6) | public class TestChannelTopicMessageListener implements MessageListener {
    method onMessage (line 8) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
  class TestPatternTopicMessageListener (line 6) | public class TestPatternTopicMessageListener implements MessageListener {
    method onMessage (line 8) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
  class UserService01 (line 5) | @Service

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
  class UserService02 (line 8) | @Service
    method get (line 14) | public UserCacheObject get(Integer id) {
    method set (line 18) | public void set(Integer id, UserCacheObject object) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
  class JSONUtil (line 8) | public class JSONUtil {
    method parseObject (line 10) | public static  <T> T parseObject(String text, Class<T> clazz) {
    method toJSONString (line 14) | public static String toJSONString(Object javaObject) {
    method toJSONBytes (line 18) | public static byte[] toJSONBytes(Object javaObject) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
  class PipelineTest (line 15) | @RunWith(SpringRunner.class)
    method test01 (line 22) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
  class PubSubTest (line 10) | @RunWith(SpringRunner.class)
    method test01 (line 19) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
  class ScriptTest (line 18) | @RunWith(SpringRunner.class)
    method test01 (line 25) | @Test
    method test02 (line 36) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
  class SessionTest (line 13) | @RunWith(SpringRunner.class)
    method test01 (line 20) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
  class Test01 (line 12) | @RunWith(SpringRunner.class)
    method testStringSetKey (line 22) | @Test
    method testStringSetKey02 (line 27) | @Test
    method testSetAdd (line 32) | @Test
    method testStringSetKeyUserCache (line 37) | @Test
    method testStringGetKeyUserCache (line 47) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
  class TransactionTest (line 11) | @RunWith(SpringRunner.class)
    method test01 (line 19) | @Test
    method test02 (line 47) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-jedis/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
  class UserService02Test (line 11) | @RunWith(SpringRunner.class)
    method testSet (line 18) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
  class Application (line 5) | @SpringBootApplication

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
  class ProductCacheObject (line 6) | public class ProductCacheObject {
    method getId (line 21) | public Integer getId() {
    method setId (line 25) | public ProductCacheObject setId(Integer id) {
    method getName (line 30) | public String getName() {
    method setName (line 34) | public ProductCacheObject setName(String name) {
    method getCid (line 39) | public Integer getCid() {
    method setCid (line 43) | public ProductCacheObject setCid(Integer cid) {
    method toString (line 48) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
  class UserCacheObject (line 6) | public class UserCacheObject {
    method getId (line 21) | public Integer getId() {
    method setId (line 25) | public UserCacheObject setId(Integer id) {
    method getName (line 30) | public String getName() {
    method setName (line 34) | public UserCacheObject setName(String name) {
    method getGender (line 39) | public Integer getGender() {
    method setGender (line 43) | public UserCacheObject setGender(Integer gender) {
    method toString (line 48) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
  class RedisConfiguration (line 12) | @Configuration
    method redisTemplate (line 15) | @Bean
    method listenerContainer (line 43) | public RedisMessageListenerContainer listenerContainer(RedisConnection...

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
  class UserCacheDao (line 10) | @Repository
    method buildKey (line 19) | private static String buildKey(Integer id) {
    method get (line 23) | public UserCacheObject get(Integer id) {
    method set (line 29) | public void set(Integer id, UserCacheObject object) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
  class TestChannelTopicMessageListener (line 6) | public class TestChannelTopicMessageListener implements MessageListener {
    method onMessage (line 8) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
  class TestPatternTopicMessageListener (line 6) | public class TestPatternTopicMessageListener implements MessageListener {
    method onMessage (line 8) | @Override

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
  class UserService01 (line 5) | @Service

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
  class UserService02 (line 8) | @Service
    method get (line 14) | public UserCacheObject get(Integer id) {
    method set (line 18) | public void set(Integer id, UserCacheObject object) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
  class JSONUtil (line 8) | public class JSONUtil {
    method parseObject (line 10) | public static  <T> T parseObject(String text, Class<T> clazz) {
    method toJSONString (line 14) | public static String toJSONString(Object javaObject) {
    method toJSONBytes (line 18) | public static byte[] toJSONBytes(Object javaObject) {

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/LockTest.java
  class LockTest (line 15) | @RunWith(SpringRunner.class)
    method test (line 24) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
  class PipelineTest (line 15) | @RunWith(SpringRunner.class)
    method test01 (line 22) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java
  class PubSubTest (line 10) | @RunWith(SpringRunner.class)
    method test01 (line 19) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/RateLimiterTest.java
  class RateLimiterTest (line 16) | @RunWith(SpringRunner.class)
    method test (line 23) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java
  class ScriptTest (line 18) | @RunWith(SpringRunner.class)
    method test01 (line 25) | @Test
    method test02 (line 36) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java
  class SessionTest (line 13) | @RunWith(SpringRunner.class)
    method test01 (line 20) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java
  class Test01 (line 12) | @RunWith(SpringRunner.class)
    method testStringSetKey (line 22) | @Test
    method testStringSetKey02 (line 27) | @Test
    method testSetAdd (line 32) | @Test
    method testStringSetKeyUserCache (line 37) | @Test
    method testStringGetKeyUserCache (line 47) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java
  class TransactionTest (line 11) | @RunWith(SpringRunner.class)
    method test01 (line 19) | @Test
    method test02 (line 47) | @Test

FILE: lab-11-spring-data-redis/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java
  class UserService02Test (line 11) | @RunWith(SpringRunner.class)
    method testSet (line 18) | @Test

FILE: lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
  class UserDO (line 8) | public class UserDO {
    method getId (line 29) | public Integer getId() {
    method setId (line 33) | public UserDO setId(Integer id) {
    method getUsername (line 38) | public String getUsername() {
    method setUsername (line 42) | public UserDO setUsername(String username) {
    method getPassword (line 47) | public String getPassword() {
    method setPassword (line 51) | public UserDO setPassword(String password) {
    method getCreateTime (line 56) | public Date getCreateTime() {
    method setCreateTime (line 60) | public UserDO setCreateTime(Date createTime) {

FILE: lab-12-mybatis/lab-12-mybatis-annotation/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
  type UserMapper (line 10) | @Repository
    method insert (line 13) | @Insert("INSERT INTO users(username, password, create_time) VALUES(#{u...
    method updateById (line 17) | @Update(value = {
    method deleteById (line 28) | @Insert("DELETE FROM users WHERE id = #{id}")
    method selectById (line 31) | @Select("SELECT username, password, create_time FROM users WHERE id = ...
    method selectByUsername (line 34) | @Select("SELECT username, password, create_time FROM users WHERE usern...
    method selectByIds (line 37) | @Select(value = {

FILE: lab-12-mybatis/lab-12-mybatis-annotation/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users` (

FILE: lab-12-mybatis/lab-12-mybatis-annotation/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
  class UserMapperTest (line 16) | @RunWith(SpringRunner.class)
    method testInsert (line 23) | @Test
    method testUpdateById (line 31) | @Test
    method testDeleteById (line 38) | @Test
    method testSelectById (line 43) | @Test
    method testSelectByUsername (line 48) | @Test
    method testSelectByIds (line 53) | @Test

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/config/AsyncConfig.java
  class AsyncConfig (line 11) | @Configuration
    method executorBeanPostProcessor (line 15) | @Bean

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/config/MybatisPlusConfig.java
  class MybatisPlusConfig (line 12) | @Configuration
    method mybatisPlusInterceptor (line 18) | @Bean

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/context/TenantHolder.java
  class TenantHolder (line 5) | public class TenantHolder {
    method setTenantId (line 11) | public static void setTenantId(Integer tenantId) {
    method getTenantId (line 15) | public static Integer getTenantId() {

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/core/TtlThreadPoolTaskExecutor.java
  class TtlThreadPoolTaskExecutor (line 12) | @Deprecated
    method execute (line 15) | @Override
    method execute (line 20) | @Override
    method submit (line 25) | @Override
    method submit (line 30) | @Override
    method submitListenable (line 35) | @Override
    method submitListenable (line 40) | @Override

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
  class UserDO (line 11) | @TableName(value = "users")
    method getId (line 42) | public Integer getId() {
    method setId (line 46) | public UserDO setId(Integer id) {
    method getUsername (line 51) | public String getUsername() {
    method setUsername (line 55) | public UserDO setUsername(String username) {
    method getPassword (line 60) | public String getPassword() {
    method setPassword (line 64) | public UserDO setPassword(String password) {
    method getCreateTime (line 69) | public Date getCreateTime() {
    method setCreateTime (line 73) | public UserDO setCreateTime(Date createTime) {
    method getDeleted (line 78) | public Integer getDeleted() {
    method setDeleted (line 82) | public UserDO setDeleted(Integer deleted) {
    method getTenantId (line 87) | public Integer getTenantId() {
    method setTenantId (line 91) | public UserDO setTenantId(Integer tenantId) {

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserProfileDO.java
  class UserProfileDO (line 9) | @TableName(value = "user_profile")
    method getId (line 34) | public Integer getId() {
    method setId (line 38) | public UserProfileDO setId(Integer id) {
    method getGender (line 43) | public Integer getGender() {
    method setGender (line 47) | public UserProfileDO setGender(Integer gender) {
    method getDeleted (line 52) | public Integer getDeleted() {
    method setDeleted (line 56) | public UserProfileDO setDeleted(Integer deleted) {
    method getTenantId (line 61) | public Integer getTenantId() {
    method setTenantId (line 65) | public UserProfileDO setTenantId(Integer tenantId) {
    method getUserId (line 70) | public Integer getUserId() {
    method setUserId (line 74) | public UserProfileDO setUserId(Integer userId) {

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
  type UserMapper (line 15) | @Repository
    method selectByUsername (line 18) | default UserDO selectByUsername(@Param("username") String username) {
    method selectByIds (line 22) | List<UserDO> selectByIds(@Param("ids") Collection<Integer> ids);
    method selectPageByCreateTime (line 24) | default IPage<UserDO> selectPageByCreateTime(IPage<UserDO> page, @Para...
    method selectListA (line 31) | List<UserDetailVO> selectListA();
    method selectListB (line 33) | List<UserDetailVO> selectListB();

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserProfileMapper.java
  type UserProfileMapper (line 7) | @Repository

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/service/UserService.java
  class UserService (line 14) | @Service
    method getUserAsync (line 22) | @Async

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/util/TtlExecutorsUtil.java
  class TtlExecutorsUtil (line 12) | @Deprecated
    method getTtlThreadPoolTaskExecutor (line 15) | public static Executor getTtlThreadPoolTaskExecutor(@Nullable Executor...

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/java/cn/iocoder/springboot/lab12/mybatis/vo/UserDetailVO.java
  class UserDetailVO (line 7) | public class UserDetailVO {
    method getId (line 41) | public Integer getId() {
    method setId (line 45) | public UserDetailVO setId(Integer id) {
    method getUsername (line 50) | public String getUsername() {
    method setUsername (line 54) | public UserDetailVO setUsername(String username) {
    method getPassword (line 59) | public String getPassword() {
    method setPassword (line 63) | public UserDetailVO setPassword(String password) {
    method getGender (line 68) | public Integer getGender() {
    method setGender (line 72) | public UserDetailVO setGender(Integer gender) {
    method getCreateTime (line 77) | public Date getCreateTime() {
    method setCreateTime (line 81) | public UserDetailVO setCreateTime(Date createTime) {
    method getDeleted (line 86) | public Integer getDeleted() {
    method setDeleted (line 90) | public UserDetailVO setDeleted(Integer deleted) {
    method getTenantId (line 95) | public Integer getTenantId() {
    method setTenantId (line 99) | public UserDetailVO setTenantId(Integer tenantId) {
    method toString (line 104) | @Override

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users`
  type `user_profile` (line 12) | CREATE TABLE `user_profile`

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
  class UserMapperTest (line 18) | @RunWith(SpringRunner.class)
    method initTestData (line 27) | @Test
    method testInsert (line 46) | @Test
    method testUpdateById (line 54) | @Test
    method testDeleteById (line 61) | @Test
    method testSelectById (line 66) | @Test
    method testSelectByUsername (line 71) | @Test
    method testSelectByIds (line 77) | @Test
    method testSelectPageByCreateTime (line 83) | @Test
    method testSelectListA (line 91) | @Test
    method testSelectListB (line 97) | @Test

FILE: lab-12-mybatis/lab-12-mybatis-plus-tenant/src/test/java/cn/iocoder/springboot/lab12/mybatis/service/UserServiceTest.java
  class UserServiceTest (line 17) | @RunWith(SpringRunner.class)
    method testGetUserAsync (line 24) | @Test

FILE: lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
  class UserDO (line 11) | @TableName(value = "users")
    method getId (line 38) | public Integer getId() {
    method setId (line 42) | public UserDO setId(Integer id) {
    method getUsername (line 47) | public String getUsername() {
    method setUsername (line 51) | public UserDO setUsername(String username) {
    method getPassword (line 56) | public String getPassword() {
    method setPassword (line 60) | public UserDO setPassword(String password) {
    method getCreateTime (line 65) | public Date getCreateTime() {
    method setCreateTime (line 69) | public UserDO setCreateTime(Date createTime) {
    method getDeleted (line 74) | public Integer getDeleted() {
    method setDeleted (line 78) | public UserDO setDeleted(Integer deleted) {

FILE: lab-12-mybatis/lab-12-mybatis-plus/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
  type UserMapper (line 14) | @Repository
    method selectByUsername (line 17) | default UserDO selectByUsername(@Param("username") String username) {
    method selectByIds (line 21) | List<UserDO> selectByIds(@Param("ids") Collection<Integer> ids);
    method selectPageByCreateTime (line 23) | default IPage<UserDO> selectPageByCreateTime(IPage<UserDO> page, @Para...

FILE: lab-12-mybatis/lab-12-mybatis-plus/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users` (

FILE: lab-12-mybatis/lab-12-mybatis-plus/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
  class UserMapperTest (line 15) | @RunWith(SpringRunner.class)
    method testInsert (line 22) | @Test
    method testUpdateById (line 30) | @Test
    method testDeleteById (line 37) | @Test
    method testSelectById (line 42) | @Test
    method testSelectByUsername (line 47) | @Test
    method testSelectByIds (line 52) | @Test
    method testSelectPageByCreateTime (line 58) | @Test

FILE: lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
  class UserDO (line 12) | @Table(name = "users")
    method getId (line 36) | public Integer getId() {
    method setId (line 40) | public UserDO setId(Integer id) {
    method getUsername (line 45) | public String getUsername() {
    method setUsername (line 49) | public UserDO setUsername(String username) {
    method getPassword (line 54) | public String getPassword() {
    method setPassword (line 58) | public UserDO setPassword(String password) {
    method getCreateTime (line 63) | public Date getCreateTime() {
    method setCreateTime (line 67) | public UserDO setCreateTime(Date createTime) {

FILE: lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
  type UserMapper (line 13) | @Repository
    method selectByUsername (line 16) | default UserDO selectByUsername(@Param("username") String username) {
    method selectByIds (line 24) | List<UserDO> selectByIds(@Param("ids") Collection<Integer> ids);
    method selectListByCreateTime (line 26) | default List<UserDO> selectListByCreateTime(@Param("createTime") Date ...

FILE: lab-12-mybatis/lab-12-mybatis-tk/src/main/java/cn/iocoder/springboot/lab12/mybatis/util/BaseMapper.java
  type BaseMapper (line 6) | public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T> {

FILE: lab-12-mybatis/lab-12-mybatis-tk/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users` (

FILE: lab-12-mybatis/lab-12-mybatis-tk/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
  class UserMapperTest (line 15) | @RunWith(SpringRunner.class)
    method testInsert (line 22) | @Test
    method testUpdateById (line 30) | @Test
    method testDeleteById (line 37) | @Test
    method testSelectById (line 42) | @Test
    method testSelectByUsername (line 47) | @Test
    method testSelectByIds (line 52) | @Test
    method testSelectPageByCreateTime (line 58) | @Test // 更多使用,可以参考 https://github.com/pagehelper/Mybatis-PageHelper/bl...

FILE: lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/dataobject/UserDO.java
  class UserDO (line 8) | public class UserDO {
    method getId (line 29) | public Integer getId() {
    method setId (line 33) | public UserDO setId(Integer id) {
    method getUsername (line 38) | public String getUsername() {
    method setUsername (line 42) | public UserDO setUsername(String username) {
    method getPassword (line 47) | public String getPassword() {
    method setPassword (line 51) | public UserDO setPassword(String password) {
    method getCreateTime (line 56) | public Date getCreateTime() {
    method setCreateTime (line 60) | public UserDO setCreateTime(Date createTime) {

FILE: lab-12-mybatis/lab-12-mybatis-xml/src/main/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapper.java
  type UserMapper (line 10) | @Repository
    method insert (line 13) | int insert(UserDO user);
    method updateById (line 15) | int updateById(UserDO user);
    method deleteById (line 17) | int deleteById(@Param("id") Integer id);
    method selectById (line 19) | UserDO selectById(@Param("id") Integer id);
    method selectByUsername (line 21) | UserDO selectByUsername(@Param("username") String username);
    method selectByIds (line 23) | List<UserDO> selectByIds(@Param("ids")Collection<Integer> ids);

FILE: lab-12-mybatis/lab-12-mybatis-xml/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users` (

FILE: lab-12-mybatis/lab-12-mybatis-xml/src/test/java/cn/iocoder/springboot/lab12/mybatis/mapper/UserMapperTest.java
  class UserMapperTest (line 16) | @RunWith(SpringRunner.class)
    method testInsert (line 23) | @Test
    method testUpdateById (line 30) | @Test
    method testDeleteById (line 37) | @Test
    method testSelectById (line 42) | @Test
    method testSelectByUsername (line 47) | @Test
    method testSelectByIds (line 52) | @Test

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/Application.java
  class Application (line 5) | @SpringBootApplication

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/dataobject/UserDO.java
  class UserDO (line 9) | @Entity
    method getId (line 38) | public Integer getId() {
    method setId (line 42) | public UserDO setId(Integer id) {
    method getUsername (line 47) | public String getUsername() {
    method setUsername (line 51) | public UserDO setUsername(String username) {
    method getPassword (line 56) | public String getPassword() {
    method setPassword (line 60) | public UserDO setPassword(String password) {
    method getCreateTime (line 65) | public Date getCreateTime() {
    method setCreateTime (line 69) | public UserDO setCreateTime(Date createTime) {

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01.java
  type UserRepository01 (line 6) | public interface UserRepository01 extends CrudRepository<UserDO, Integer> {

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02.java
  type UserRepository02 (line 6) | public interface UserRepository02 extends PagingAndSortingRepository<Use...

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03.java
  type UserRepository03 (line 10) | public interface UserRepository03 extends PagingAndSortingRepository<Use...
    method findByUsername (line 12) | UserDO findByUsername(String username);
    method findByCreateTimeAfter (line 14) | Page<UserDO> findByCreateTimeAfter(Date createTime, Pageable pageable);

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/main/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04.java
  type UserRepository04 (line 9) | public interface UserRepository04 extends PagingAndSortingRepository<Use...
    method findByUsername01 (line 11) | @Query("SELECT u FROM UserDO u WHERE u.username = ?1")
    method findByUsername02 (line 14) | @Query("SELECT u FROM UserDO u WHERE u.username = :username")
    method findByUsername03 (line 17) | @Query(value = "SELECT * FROM users u WHERE u.username = :username", n...
    method updateUsernameById (line 20) | @Query("UPDATE UserDO  u SET u.username = :username WHERE u.id = :id")

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository01Test.java
  class UserRepository01Test (line 16) | @RunWith(SpringRunner.class)
    method testSave (line 23) | @Test // 插入一条记录
    method testUpdate (line 30) | @Test // 更新一条记录
    method testDelete (line 41) | @Test // 根据 ID 编号,删除一条记录
    method testSelectById (line 46) | @Test // 根据 ID 编号,查询一条记录
    method testSelectByIds (line 52) | @Test // 根据 ID 编号数组,查询多条记录

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository02Test.java
  class UserRepository02Test (line 14) | @RunWith(SpringRunner.class)
    method testFindAll (line 21) | @Test // 排序
    method testFindPage (line 31) | @Test // 分页

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository03Test.java
  class UserRepository03Test (line 16) | @RunWith(SpringRunner.class)
    method testFindByUsername (line 23) | @Test
    method testFindByCreateTimeAfter (line 29) | @Test

FILE: lab-13-spring-data-jpa/lab-13-jpa/src/test/java/cn/iocoder/springboot/lab13/jpa/repository/UserRepository04Test.java
  class UserRepository04Test (line 12) | @RunWith(SpringRunner.class)
    method testFindIdByUsername01 (line 19) | @Test
    method testFindIdByUsername02 (line 25) | @Test
    method testFindIdByUsername03 (line 31) | @Test
    method testUpdateUsernameById (line 37) | @Test

FILE: lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/Application.java
  class Application (line 5) | @SpringBootApplication

FILE: lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDao.java
  class UserDao (line 21) | @Repository
    method insert (line 49) | public int insert(UserDO entity) {
    method insert0 (line 70) | public int insert0(UserDO entity) {
    method updateById (line 89) | public int updateById(UserDO entity) {
    method deleteById (line 95) | public int deleteById(Integer id) {
    method selectById (line 99) | public UserDO selectById(Integer id) {
    method selectByUsername (line 105) | public UserDO selectByUsername(String username) {
    method selectByIds (line 111) | public List<UserDO> selectByIds(List<Integer> ids) {

FILE: lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/main/java/cn/iocoder/springboot/lab14/jdbctemplate/dataobject/UserDO.java
  class UserDO (line 8) | public class UserDO {
    method getId (line 29) | public Integer getId() {
    method setId (line 33) | public UserDO setId(Integer id) {
    method getUsername (line 38) | public String getUsername() {
    method setUsername (line 42) | public UserDO setUsername(String username) {
    method getPassword (line 47) | public String getPassword() {
    method setPassword (line 51) | public UserDO setPassword(String password) {
    method getCreateTime (line 56) | public Date getCreateTime() {
    method setCreateTime (line 60) | public UserDO setCreateTime(Date createTime) {
    method toString (line 65) | @Override

FILE: lab-14-spring-jdbc-template/lab-14-jdbctemplate/src/test/java/cn/iocoder/springboot/lab14/jdbctemplate/dao/UserDaoTest.java
  class UserDaoTest (line 16) | @RunWith(SpringRunner.class)
    method testInsert (line 23) | @Test
    method testInsert0 (line 31) | @Test
    method testUpdateById (line 39) | @Test
    method testDeleteById (line 46) | @Test
    method testSelectById (line 51) | @Test
    method testSelectByUsername (line 57) | @Test
    method testSelectByIds (line 63) | @Test

FILE: lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/Application.java
  class Application (line 5) | @SpringBootApplication

FILE: lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/bo/ProductConditionBO.java
  class ProductConditionBO (line 8) | public class ProductConditionBO {
    class Category (line 15) | public static class Category {
      method getId (line 26) | public Integer getId() {
      method setId (line 30) | public Category setId(Integer id) {
      method getName (line 35) | public String getName() {
      method setName (line 39) | public Category setName(String name) {
    method getCategories (line 46) | public List<Category> getCategories() {
    method setCategories (line 50) | public ProductConditionBO setCategories(List<Category> categories) {

FILE: lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/constant/FieldAnalyzer.java
  class FieldAnalyzer (line 10) | public class FieldAnalyzer {

FILE: lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/dataobject/ESProductDO.java
  class ESProductDO (line 9) | @Document(indexName = "product", // 索引名
    method getId (line 48) | public Integer getId() {
    method setId (line 52) | public ESProductDO setId(Integer id) {
    method getName (line 57) | public String getName() {
    method setName (line 61) | public ESProductDO setName(String name) {
    method getSellPoint (line 66) | public String getSellPoint() {
    method setSellPoint (line 70) | public ESProductDO setSellPoint(String sellPoint) {
    method getDescription (line 75) | public String getDescription() {
    method setDescription (line 79) | public ESProductDO setDescription(String description) {
    method getCid (line 84) | public Integer getCid() {
    method setCid (line 88) | public ESProductDO setCid(Integer cid) {
    method getCategoryName (line 93) | public String getCategoryName() {
    method setCategoryName (line 97) | public ESProductDO setCategoryName(String categoryName) {
    method toString (line 102) | @Override

FILE: lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/main/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository.java
  type ProductRepository (line 6) | public interface ProductRepository extends ElasticsearchRepository<ESPro...

FILE: lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepository04Test.java
  class ProductRepository04Test (line 19) | @RunWith(SpringRunner.class)
    method test (line 26) | @Test

FILE: lab-15-spring-data-es/lab-15-spring-data-elasticsearch/src/test/java/cn/iocoder/springboot/lab15/springdataelasticsearch/repository/ProductRepositoryTest.java
  class ProductRepositoryTest (line 14) | @RunWith(SpringRunner.class)
    method testInsert (line 21) | @Test // 插入一条记录
    method testUpdate (line 35) | @Test // 更新一条记录
    method testDelete (line 44) | @Test // 根据 ID 编号,删除一条记录
    method testSelectById (line 49) | @Test // 根据 ID 编号,查询一条记录
    method testSelectByIds (line 55) | @Test // 根据 ID 编号数组,查询多条记录

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/Application.java
  class Application (line 7) | @SpringBootApplication(exclude = {ElasticsearchAutoConfiguration.class, ...

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/constant/FieldAnalyzer.java
  class FieldAnalyzer (line 10) | public class FieldAnalyzer {

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/dataobject/ESProductDO.java
  class ESProductDO (line 9) | @Document(indexName = "product", // 索引名
    method getId (line 48) | public Integer getId() {
    method setId (line 52) | public ESProductDO setId(Integer id) {
    method getName (line 57) | public String getName() {
    method setName (line 61) | public ESProductDO setName(String name) {
    method getSellPoint (line 66) | public String getSellPoint() {
    method setSellPoint (line 70) | public ESProductDO setSellPoint(String sellPoint) {
    method getDescription (line 75) | public String getDescription() {
    method setDescription (line 79) | public ESProductDO setDescription(String description) {
    method getCid (line 84) | public Integer getCid() {
    method setCid (line 88) | public ESProductDO setCid(Integer cid) {
    method getCategoryName (line 93) | public String getCategoryName() {
    method setCategoryName (line 97) | public ESProductDO setCategoryName(String categoryName) {
    method toString (line 102) | @Override

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository.java
  type ProductRepository (line 6) | public interface ProductRepository extends ElasticsearchRepository<ESPro...

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02.java
  type ProductRepository02 (line 8) | public interface ProductRepository02 extends ElasticsearchRepository<ESP...
    method findByName (line 10) | ESProductDO findByName(String name);
    method findByNameLike (line 12) | Page<ESProductDO> findByNameLike(String name, Pageable pageable);

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/main/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03.java
  type ProductRepository03 (line 19) | public interface ProductRepository03 extends ElasticsearchRepository<ESP...
    method search (line 21) | default Page<ESProductDO> search(Integer cid, String keyword, Pageable...

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository02Test.java
  class ProductRepository02Test (line 15) | @RunWith(SpringRunner.class)
    method testFindByName (line 22) | @Test // 根据名字获得一条记录
    method testFindByNameLike (line 28) | @Test // 使用 name 模糊查询,分页返回结果
    method testInsert (line 49) | private void testInsert() {

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepository03Test.java
  class ProductRepository03Test (line 14) | @RunWith(SpringRunner.class)
    method testSearch (line 21) | @Test

FILE: lab-15-spring-data-es/lab-15-spring-data-jest/src/test/java/cn/iocoder/springboot/lab15/springdatajest/repository/ProductRepositoryTest.java
  class ProductRepositoryTest (line 14) | @RunWith(SpringRunner.class)
    method testInsert (line 21) | @Test // 插入一条记录
    method testUpdate (line 35) | @Test // 更新一条记录
    method testDelete (line 44) | @Test // 根据 ID 编号,删除一条记录
    method testSelectById (line 49) | @Test // 根据 ID 编号,查询一条记录
    method testSelectByIds (line 55) | @Test // 根据 ID 编号数组,查询多条记录

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/Application.java
  class Application (line 5) | @SpringBootApplication

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/config/MongoDBConfig.java
  class MongoDBConfig (line 15) | @Configuration
    method mappingMongoConverter (line 18) | @Bean // 目的,就是为了移除 _class field 。参考博客 https://blog.csdn.net/bigtree_37...

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDao.java
  class UserDao (line 17) | @Repository
    method insert (line 23) | public void insert(UserDO entity) {
    method updateById (line 27) | public void updateById(UserDO entity) {
    method deleteById (line 62) | public void deleteById(Integer id) {
    method findById (line 66) | public UserDO findById(Integer id) {
    method findByUsername (line 70) | public UserDO findByUsername(String username) {
    method findAllById (line 74) | public List<UserDO> findAllById(List<Integer> ids) {

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/ProductDO.java
  class ProductDO (line 9) | @Document(collection = "Product")
    method getName (line 17) | public String getName() {
    method setName (line 21) | public ProductDO setName(String name) {

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/dataobject/UserDO.java
  class UserDO (line 11) | @Document(collection = "User")
    class Profile (line 17) | public static class Profile {
      method getNickname (line 28) | public String getNickname() {
      method setNickname (line 32) | public Profile setNickname(String nickname) {
      method getGender (line 37) | public Integer getGender() {
      method setGender (line 41) | public Profile setGender(Integer gender) {
      method toString (line 46) | @Override
    method getId (line 74) | public Integer getId() {
    method setId (line 78) | public UserDO setId(Integer id) {
    method getUsername (line 83) | public String getUsername() {
    method setUsername (line 87) | public UserDO setUsername(String username) {
    method getPassword (line 92) | public String getPassword() {
    method setPassword (line 96) | public UserDO setPassword(String password) {
    method getCreateTime (line 101) | public Date getCreateTime() {
    method setCreateTime (line 105) | public UserDO setCreateTime(Date createTime) {
    method getProfile (line 110) | public Profile getProfile() {
    method setProfile (line 114) | public UserDO setProfile(Profile profile) {
    method toString (line 119) | @Override

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/IncIdEntity.java
  class IncIdEntity (line 10) | public abstract class IncIdEntity<T extends Number> {
    method getId (line 15) | public T getId() {
    method setId (line 19) | public void setId(T id) {

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/mongo/MongoInsertEventListener.java
  class MongoInsertEventListener (line 15) | @Component
    method onBeforeConvert (line 30) | @Override
    method getNextId (line 49) | private Number getNextId(IncIdEntity entity) {

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepository.java
  type ProductRepository (line 6) | public interface ProductRepository extends MongoRepository<ProductDO, In...

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository.java
  type UserRepository (line 6) | public interface UserRepository extends MongoRepository<UserDO, Integer> {

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02.java
  type UserRepository02 (line 8) | public interface UserRepository02 extends MongoRepository<UserDO, Intege...
    method findByUsername (line 10) | UserDO findByUsername(String username);
    method findByUsernameLike (line 12) | Page<UserDO> findByUsernameLike(String username, Pageable pageable);

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/main/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03.java
  type UserRepository03 (line 8) | public interface UserRepository03 extends MongoRepository<UserDO, Intege...
    method findByUsername01 (line 11) | default UserDO findByUsername01(String username) {
    method findByUsernameLike01 (line 22) | default UserDO findByUsernameLike01(String username) {

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/dao/UserDaoTest.java
  class UserDaoTest (line 15) | @RunWith(SpringRunner.class)
    method testInsert (line 22) | @Test // 插入一条记录
    method testUpdate (line 41) | @Test // 更新一条记录
    method testDelete (line 52) | @Test // 根据 ID 编号,删除一条记录
    method testSelectById (line 57) | @Test // 根据 ID 编号,查询一条记录
    method testSelectByIds (line 63) | @Test // 根据 ID 编号数组,查询多条记录

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/ProductRepositoryTest.java
  class ProductRepositoryTest (line 11) | @RunWith(SpringRunner.class)
    method testInsert (line 18) | @Test

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository02Test.java
  class UserRepository02Test (line 15) | @RunWith(SpringRunner.class)
    method testFindByName (line 22) | @Test // 根据名字获得一条记录
    method testFindByNameLike (line 28) | @Test // 使用 username 模糊查询,分页返回结果

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepository03Test.java
  class UserRepository03Test (line 11) | @RunWith(SpringRunner.class)
    method testFindByUsername01 (line 18) | @Test
    method testFindByUsernameLike01 (line 24) | @Test

FILE: lab-16-spring-data-mongo/lab-16-spring-data-mongodb/src/test/java/cn/iocoder/springboot/lab16/springdatamongodb/repository/UserRepositoryTest.java
  class UserRepositoryTest (line 16) | @RunWith(SpringRunner.class)
    method testInsert (line 23) | @Test // 插入一条记录
    method testUpdate (line 42) | @Test // 更新一条记录
    method testDelete (line 53) | @Test // 根据 ID 编号,删除一条记录
    method testSelectById (line 58) | @Test // 根据 ID 编号,查询一条记录
    method testSelectByIds (line 64) | @Test // 根据 ID 编号数组,查询多条记录

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
  class Application (line 7) | @SpringBootApplication

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
  class DBConstants (line 6) | public class DBConstants {

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
  class OrderDO (line 6) | public class OrderDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public OrderDO setId(Integer id) {
    method getUserId (line 26) | public Integer getUserId() {
    method setUserId (line 30) | public OrderDO setUserId(Integer userId) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
  class UserDO (line 6) | public class UserDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public UserDO setId(Integer id) {
    method getUsername (line 26) | public String getUsername() {
    method setUsername (line 30) | public UserDO setUsername(String username) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java
  type OrderMapper (line 9) | @Repository
    method selectById (line 13) | OrderDO selectById(@Param("id") Integer id);

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapper.java
  type UserMapper (line 9) | @Repository
    method selectById (line 13) | UserDO selectById(@Param("id") Integer id);

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
  class OrderService (line 15) | @Service
    method self (line 23) | private OrderService self() {
    method method01 (line 27) | public void method01() {
    method method02 (line 36) | @Transactional
    method method03 (line 46) | public void method03() {
    method method031 (line 53) | @Transactional // 报错,因为此时获取的是 primary 对应的 DataSource ,即 users 。
    method method032 (line 59) | @Transactional
    method method04 (line 65) | public void method04() {
    method method041 (line 72) | @Transactional
    method method042 (line 79) | @Transactional
    method method05 (line 86) | @Transactional
    method method052 (line 96) | @Transactional(propagation = Propagation.REQUIRES_NEW)

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/sql/db.sql
  type `users` (line 1) | CREATE TABLE `users` (
  type `orders` (line 10) | CREATE TABLE `orders` (

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapperTest.java
  class OrderMapperTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapperTest.java
  class UserMapperTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 10) | @RunWith(SpringRunner.class)
    method testMethod01 (line 17) | @Test
    method testMethod02 (line 22) | @Test
    method testMethod03 (line 27) | @Test
    method testMethod04 (line 32) | @Test
    method testMethod05 (line 37) | @Test

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
  class Application (line 7) | @SpringBootApplication

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
  class DBConstants (line 6) | public class DBConstants {

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
  class OrderDO (line 6) | public class OrderDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public OrderDO setId(Integer id) {
    method getUserId (line 26) | public Integer getUserId() {
    method setUserId (line 30) | public OrderDO setUserId(Integer userId) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java
  type OrderMapper (line 9) | @Repository
    method selectById (line 12) | @DS(DBConstants.DATASOURCE_SLAVE)
    method insert (line 15) | @DS(DBConstants.DATASOURCE_MASTER)

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
  class OrderService (line 11) | @Service
    method add (line 17) | @Transactional
    method findById (line 28) | public OrderDO findById(Integer id) {

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/main/resources/sql/db.sql
  type `users` (line 1) | CREATE TABLE `users` (
  type `orders` (line 10) | CREATE TABLE `orders` (

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/test/java/dynamicdatasource/mapper/OrderMapperTest.java
  class OrderMapperTest (line 12) | @RunWith(SpringRunner.class)
    method testSelectById (line 19) | @Test
    method testInsert (line 27) | @Test

FILE: lab-17/lab-17-dynamic-datasource-baomidou-02/src/test/java/dynamicdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 12) | @RunWith(SpringRunner.class)
    method testAdd (line 19) | @Test
    method testFindById (line 26) | @Test

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/JdbcTemplateOrdersConfig.java
  class JdbcTemplateOrdersConfig (line 14) | @Configuration
    method dataSource (line 20) | @Bean(name = "ordersDataSource")
    method jdbcTemplate (line 29) | @Bean(name = DBConstants.JDBC_TEMPLATE_ORDERS)
    method transactionManager (line 37) | @Bean(name = DBConstants.TX_MANAGER_ORDERS)

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/JdbcTemplateUsersConfig.java
  class JdbcTemplateUsersConfig (line 14) | @Configuration
    method dataSource (line 20) | @Bean(name = "usersDataSource")
    method jdbcTemplate (line 29) | @Bean(name = DBConstants.JDBC_TEMPLATE_USERS)
    method transactionManager (line 37) | @Bean(name = DBConstants.TX_MANAGER_USERS)

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
  class DBConstants (line 6) | public class DBConstants {

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dao/OrderDao.java
  class OrderDao (line 11) | @Repository
    method selectById (line 17) | public OrderDO selectById(Integer id) {

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dao/UserDao.java
  class UserDao (line 11) | @Repository
    method selectById (line 17) | public UserDO selectById(Integer id) {

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
  class OrderDO (line 6) | public class OrderDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public OrderDO setId(Integer id) {
    method getUserId (line 26) | public Integer getUserId() {
    method setUserId (line 30) | public OrderDO setUserId(Integer userId) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
  class UserDO (line 6) | public class UserDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public UserDO setId(Integer id) {
    method getUsername (line 26) | public String getUsername() {
    method setUsername (line 30) | public UserDO setUsername(String username) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
  class OrderService (line 14) | @Service
    method self (line 22) | private OrderService self() {
    method method01 (line 26) | public void method01() {
    method method02 (line 35) | @Transactional // 报错,找不到事务管理器
    method method03 (line 45) | public void method03() {
    method method031 (line 52) | @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
    method method032 (line 58) | @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS)
    method method05 (line 64) | @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
    method method052 (line 73) | @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS,

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/dao/OrderDaoTest.java
  class OrderDaoTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/dao/UserDaoTest.java
  class UserDaoTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-17/lab-17-dynamic-datasource-jdbctemplate/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 10) | @RunWith(SpringRunner.class)
    method testMethod01 (line 17) | @Test
    method testMethod02 (line 22) | @Test
    method testMethod03 (line 27) | @Test
    method testMethod05 (line 32) | @Test

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisOrdersConfig.java
  class MyBatisOrdersConfig (line 18) | @Configuration
    method dataSource (line 25) | @Bean(name = "ordersDataSource")
    method sqlSessionFactory (line 34) | @Bean(name = "ordersSqlSessionFactory")
    method sqlSessionTemplate (line 51) | @Bean(name = "ordersSqlSessionTemplate")
    method transactionManager (line 59) | @Bean(name = DBConstants.TX_MANAGER_ORDERS)

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisUsersConfig.java
  class MyBatisUsersConfig (line 18) | @Configuration
    method dataSource (line 25) | @Bean(name = "usersDataSource")
    method sqlSessionFactory (line 34) | @Bean(name = "sqlSessionFactory")
    method sqlSessionTemplate (line 51) | @Bean(name = "usersSqlSessionTemplate")
    method transactionManager (line 59) | @Bean(name = DBConstants.TX_MANAGER_USERS)

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
  class DBConstants (line 6) | public class DBConstants {

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
  class OrderDO (line 6) | public class OrderDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public OrderDO setId(Integer id) {
    method getUserId (line 26) | public Integer getUserId() {
    method setUserId (line 30) | public OrderDO setUserId(Integer userId) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
  class UserDO (line 6) | public class UserDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public UserDO setId(Integer id) {
    method getUsername (line 26) | public String getUsername() {
    method setUsername (line 30) | public UserDO setUsername(String username) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapper.java
  type OrderMapper (line 7) | @Repository
    method selectById (line 10) | OrderDO selectById(@Param("id") Integer id);

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapper.java
  type UserMapper (line 7) | @Repository
    method selectById (line 10) | UserDO selectById(@Param("id") Integer id);

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
  class OrderService (line 14) | @Service
    method self (line 22) | private OrderService self() {
    method method01 (line 26) | public void method01() {
    method method02 (line 35) | @Transactional // 报错,找不到事务管理器
    method method03 (line 45) | public void method03() {
    method method031 (line 52) | @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
    method method032 (line 58) | @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS)
    method method05 (line 64) | @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
    method method052 (line 73) | @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS,

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/sql/db.sql
  type `users` (line 1) | CREATE TABLE `users` (
  type `orders` (line 10) | CREATE TABLE `orders` (

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapperTest.java
  class OrderMapperTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapperTest.java
  class UserMapperTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 10) | @RunWith(SpringRunner.class)
    method testMethod01 (line 17) | @Test
    method testMethod02 (line 22) | @Test
    method testMethod03 (line 27) | @Test
    method testMethod05 (line 32) | @Test

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
  class Application (line 7) | @SpringBootApplication

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
  class OrderDO (line 6) | public class OrderDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public OrderDO setId(Integer id) {
    method getUserId (line 26) | public Integer getUserId() {
    method setUserId (line 30) | public OrderDO setUserId(Integer userId) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
  class UserDO (line 6) | public class UserDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public UserDO setId(Integer id) {
    method getUsername (line 26) | public String getUsername() {
    method setUsername (line 30) | public UserDO setUsername(String username) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java
  type OrderMapper (line 7) | @Repository
    method selectById (line 10) | OrderDO selectById(@Param("id") Integer id);

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapper.java
  type UserMapper (line 7) | @Repository
    method selectById (line 10) | UserDO selectById(@Param("id") Integer id);

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
  class OrderService (line 13) | @Service
    method self (line 21) | private OrderService self() {
    method method01 (line 25) | public void method01() {
    method method02 (line 34) | @Transactional
    method method03 (line 44) | public void method03() {
    method method031 (line 51) | @Transactional // 报错,因为此时获取的是 primary 对应的 DataSource ,即 users 。
    method method032 (line 57) | @Transactional
    method method04 (line 63) | public void method04() {
    method method041 (line 70) | @Transactional
    method method042 (line 76) | @Transactional
    method method05 (line 82) | @Transactional
    method method052 (line 91) | @Transactional(propagation = Propagation.REQUIRES_NEW)

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/main/resources/sql/db.sql
  type `users` (line 1) | CREATE TABLE `users` (
  type `orders` (line 10) | CREATE TABLE `orders` (

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/test/java/dynamicdatasource/mapper/OrderMapperTest.java
  class OrderMapperTest (line 12) | @RunWith(SpringRunner.class)
    method testSelectById (line 19) | @Test

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/test/java/dynamicdatasource/mapper/UserMapperTest.java
  class UserMapperTest (line 12) | @RunWith(SpringRunner.class)
    method testSelectById (line 19) | @Test

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/src/test/java/dynamicdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 11) | @RunWith(SpringRunner.class)
    method testMethod01 (line 18) | @Test
    method testMethod02 (line 23) | @Test
    method testMethod03 (line 28) | @Test
    method testMethod04 (line 33) | @Test
    method testMethod05 (line 38) | @Test

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
  class Application (line 7) | @SpringBootApplication

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
  class OrderDO (line 6) | public class OrderDO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public OrderDO setId(Integer id) {
    method getUserId (line 26) | public Integer getUserId() {
    method setUserId (line 30) | public OrderDO setUserId(Integer userId) {
    method toString (line 35) | @Override

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java
  type OrderMapper (line 7) | @Repository
    method selectById (line 10) | OrderDO selectById(@Param("id") Integer id);
    method insert (line 12) | int insert(OrderDO entity);

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
  class OrderService (line 9) | @Service
    method add (line 15) | @Transactional
    method findById (line 29) | public OrderDO findById(Integer id) {

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/src/main/resources/sql/db.sql
  type `users` (line 1) | CREATE TABLE `users` (
  type `orders` (line 10) | CREATE TABLE `orders` (

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapperTest.java
  class OrderMapperTest (line 12) | @RunWith(SpringRunner.class)
    method testSelectById (line 19) | @Test
    method testSelectById02 (line 27) | @Test
    method testInsert (line 38) | @Test

FILE: lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 11) | @RunWith(SpringRunner.class)
    method testAdd (line 18) | @Test
    method testFindById (line 25) | @Test

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/HibernateConfig.java
  class HibernateConfig (line 12) | @Configuration
    method hibernateVendorProperties (line 23) | @Bean(name = "hibernateVendorProperties")

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/JpaOrdersConfig.java
  class JpaOrdersConfig (line 19) | @Configuration
    method dataSource (line 32) | @Bean(name = "ordersDataSource")
    method entityManagerFactory (line 42) | @Bean(name = DBConstants.ENTITY_MANAGER_FACTORY_ORDERS)
    method transactionManager (line 55) | @Bean(name = DBConstants.TX_MANAGER_ORDERS)

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/JpaUsersConfig.java
  class JpaUsersConfig (line 18) | @Configuration
    method dataSource (line 31) | @Bean(name = "usersDataSource")
    method entityManagerFactory (line 40) | @Bean(name = DBConstants.ENTITY_MANAGER_FACTORY_USERS)
    method transactionManager (line 53) | @Bean(name = DBConstants.TX_MANAGER_USERS)

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
  class DBConstants (line 6) | public class DBConstants {

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
  class OrderDO (line 8) | @Entity
    method getId (line 25) | public Integer getId() {
    method setId (line 29) | public OrderDO setId(Integer id) {
    method getUserId (line 34) | public Integer getUserId() {
    method setUserId (line 38) | public OrderDO setUserId(Integer userId) {
    method toString (line 43) | @Override

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
  class UserDO (line 8) | @Entity
    method getId (line 24) | public Integer getId() {
    method setId (line 28) | public UserDO setId(Integer id) {
    method getUsername (line 33) | public String getUsername() {
    method setUsername (line 37) | public UserDO setUsername(String username) {
    method toString (line 42) | @Override

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/repository/orders/OrderRepository.java
  type OrderRepository (line 6) | public interface OrderRepository extends CrudRepository<OrderDO, Integer> {

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/repository/users/UserRepository.java
  type UserRepository (line 6) | public interface UserRepository extends CrudRepository<UserDO, Integer> {

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
  class OrderService (line 14) | @Service
    method self (line 22) | private OrderService self() {
    method method01 (line 26) | public void method01() {
    method method02 (line 35) | @Transactional // 报错,找不到事务管理器
    method method03 (line 45) | public void method03() {
    method method031 (line 52) | @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
    method method032 (line 58) | @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS)
    method method05 (line 64) | @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
    method method052 (line 73) | @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS,

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/main/resources/sql/db.sql
  type `users` (line 1) | CREATE TABLE `users` (
  type `orders` (line 10) | CREATE TABLE `orders` (

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/repository/orders/OrderRepositoryTest.java
  class OrderRepositoryTest (line 10) | @RunWith(SpringRunner.class)
    method testSelectById (line 17) | @Test

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/repository/users/UserRepositoryTest.java
  class UserRepositoryTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-17/lab-17-dynamic-datasource-springdatajpa/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 10) | @RunWith(SpringRunner.class)
    method testMethod01 (line 17) | @Test
    method testMethod02 (line 22) | @Test
    method testMethod03 (line 27) | @Test
    method testMethod05 (line 32) | @Test

FILE: lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderConfigDO.java
  class OrderConfigDO (line 6) | public class OrderConfigDO {
    method getId (line 19) | public Integer getId() {
    method setId (line 23) | public OrderConfigDO setId(Integer id) {
    method getPayTimeout (line 28) | public Integer getPayTimeout() {
    method setPayTimeout (line 32) | public OrderConfigDO setPayTimeout(Integer payTimeout) {

FILE: lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java
  class OrderDO (line 6) | public class OrderDO {
    method getId (line 17) | public Long getId() {
    method setId (line 21) | public OrderDO setId(Long id) {
    method getUserId (line 26) | public Integer getUserId() {
    method setUserId (line 30) | public OrderDO setUserId(Integer userId) {
    method toString (line 35) | @Override

FILE: lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapper.java
  type OrderConfigMapper (line 7) | @Repository
    method selectById (line 10) | OrderConfigDO selectById(@Param("id") Integer id);

FILE: lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java
  type OrderMapper (line 9) | @Repository
    method selectById (line 12) | OrderDO selectById(@Param("id") Integer id);
    method selectListByUserId (line 14) | List<OrderDO> selectListByUserId(@Param("userId") Integer userId);
    method insert (line 16) | void insert(OrderDO order);

FILE: lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_0.sql
  type `orders_0` (line 8) | CREATE TABLE `orders_0` (
  type `orders_2` (line 18) | CREATE TABLE `orders_2` (
  type `orders_4` (line 28) | CREATE TABLE `orders_4` (
  type `orders_6` (line 38) | CREATE TABLE `orders_6` (
  type `order_config` (line 49) | CREATE TABLE `order_config` (

FILE: lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_1.sql
  type `orders_1` (line 8) | CREATE TABLE `orders_1` (
  type `orders_3` (line 18) | CREATE TABLE `orders_3` (
  type `orders_5` (line 28) | CREATE TABLE `orders_5` (
  type `orders_7` (line 38) | CREATE TABLE `orders_7` (

FILE: lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapperTest.java
  class OrderConfigMapperTest (line 11) | @RunWith(SpringRunner.class)
    method testSelectById (line 18) | @Test

FILE: lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java
  class OrderMapperTest (line 13) | @RunWith(SpringRunner.class)
    method testSelectById (line 20) | @Test
    method testSelectListByUserId (line 26) | @Test
    method testInsert (line 32) | @Test

FILE: lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java
  class Application (line 6) | @SpringBootApplication

FILE: lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java
  class OrderDO (line 8) | @TableName(value = "orders")
    method getId (line 20) | public Long getId() {
    method setId (line 24) | public OrderDO setId(Long id) {
    method getUserId (line 29) | public Integer getUserId() {
    method setUserId (line 33) | public OrderDO setUserId(Integer userId) {
    method toString (line 38) | @Override

FILE: lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java
  type OrderMapper (line 7) | @Repository

FILE: lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderService.java
  class OrderService (line 9) | @Service
    method add (line 15) | @Transactional
    method findById (line 29) | public OrderDO findById(Integer id) {

FILE: lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java
  class OrderMapperTest (line 12) | @RunWith(SpringRunner.class)
    method testSelectById (line 19) | @Test
    method testSelectById02 (line 27) | @Test
    method testInsert (line 38) | @Test

FILE: lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderServiceTest.java
  class OrderServiceTest (line 11) | @RunWith(SpringRunner.class)
    method testAdd (line 18) | @Test
    method testFindById (line 25) | @Test

FILE: lab-19/lab-19-datasource-pool-druid-multiple/src/main/java/cn/iocoder/springboot/lab19/datasourcepool/Application.java
  class Application (line 12) | @SpringBootApplication
    method main (line 23) | public static void main(String[] args) {
    method run (line 28) | @Override

FILE: lab-19/lab-19-datasource-pool-druid-multiple/src/main/java/cn/iocoder/springboot/lab19/datasourcepool/config/DataSourceConfig.java
  class DataSourceConfig (line 11) | @Configuration
    method ordersDataSource (line 17) | @Primary
    method usersDataSource (line 27) | @Bean(name = "usersDataSource")

FILE: lab-19/lab-19-datasource-pool-druid-single/src/main/java/cn/iocoder/springboot/lab19/datasourcepool/Application.java
  class Application (line 12) | @SpringBootApplication
    method main (line 20) | public static void main(String[] args) {
    method run (line 25) | @Override

FILE: lab-19/lab-19-datasource-pool-druid-single/src/main/java/cn/iocoder/springboot/lab19/datasourcepool/controller/DruidStatController.java
  class DruidStatController (line 7) | @RestController
    method druidStat (line 10) | @GetMapping("/monitor/druid/stat")

FILE: lab-19/lab-19-datasource-pool-hikaricp-multiple/src/main/java/cn/iocoder/springboot/lab19/datasourcepool/Application.java
  class Application (line 14) | @SpringBootApplication
    method main (line 25) | public static void main(String[] args) {
    method run (line 30) | @Override

FILE: lab-19/lab-19-datasource-pool-hikaricp-multiple/src/main/java/cn/iocoder/springboot/lab19/datasourcepool/config/DataSourceConfig.java
  class DataSourceConfig (line 13) | @Configuration
    method ordersDataSourceProperties (line 19) | @Primary
    method ordersDataSource (line 29) | @Bean(name = "ordersDataSource")
    method usersDataSourceProperties (line 41) | @Bean(name = "usersDataSourceProperties")
    method usersDataSource (line 50) | @Bean(name = "usersDataSource")
    method createHikariDataSource (line 59) | private static HikariDataSource createHikariDataSource(DataSourcePrope...

FILE: lab-19/lab-19-datasource-pool-hikaricp-single/src/main/java/cn/iocoder/springboot/lab19/datasourcepool/Application.java
  class Application (line 14) | @SpringBootApplication
    method main (line 22) | public static void main(String[] args) {
    method run (line 27) | @Override

FILE: lab-20/lab-20-database-version-control-flyway/src/main/java/cn/iocoder/springboot/lab20/databaseversioncontrol/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-20/lab-20-database-version-control-flyway/src/main/java/cn/iocoder/springboot/lab20/databaseversioncontrol/migration/ExampleFlywayCallback.java
  class ExampleFlywayCallback (line 10) | @Component
    method supports (line 15) | @Override
    method canHandleInTransaction (line 20) | @Override
    method handle (line 25) | @Override

FILE: lab-20/lab-20-database-version-control-flyway/src/main/java/cn/iocoder/springboot/lab20/databaseversioncontrol/migration/V1_1__FixUsername.java
  class V1_1__FixUsername (line 14) | public class V1_1__FixUsername extends BaseJavaMigration {
    method migrate (line 18) | @Override
    method getChecksum (line 40) | @Override
    method canExecuteInTransaction (line 45) | @Override
    method getVersion (line 50) | @Override

FILE: lab-20/lab-20-database-version-control-flyway/src/main/resources/db/migration/V1.0__INIT_DB.sql
  type `users` (line 2) | CREATE TABLE `users` (

FILE: lab-20/lab-20-database-version-control-liquibase/src/main/java/cn/iocoder/springboot/lab20/databaseversioncontrol/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-20/lab-20-database-version-control-liquibase/src/main/java/cn/iocoder/springboot/lab20/databaseversioncontrol/migration/CHANGE_SET_3_FixUsername.java
  class CHANGE_SET_3_FixUsername (line 16) | public class CHANGE_SET_3_FixUsername implements CustomTaskChange {
    method execute (line 20) | @Override
    method getConfirmationMessage (line 39) | @Override
    method setUp (line 44) | @Override
    method setFileOpener (line 48) | @Override
    method validate (line 52) | @Override

FILE: lab-20/lab-20-database-version-control-liquibase/src/main/resources/db/changelog/sqlfile/CHAGE_SET_2_INIT_DB.sql
  type `users2` (line 2) | CREATE TABLE `users2` (

FILE: lab-21/lab-21-cache-demo/src/main/java/cn/iocoder/springboot/lab21/cache/Application.java
  class Application (line 7) | @SpringBootApplication

FILE: lab-21/lab-21-cache-demo/src/main/java/cn/iocoder/springboot/lab21/cache/dataobject/UserDO.java
  class UserDO (line 11) | @TableName(value = "users")
    method getId (line 38) | public Integer getId() {
    method setId (line 42) | public UserDO setId(Integer id) {
    method getUsername (line 47) | public String getUsername() {
    method setUsername (line 51) | public UserDO setUsername(String username) {
    method getPassword (line 56) | public String getPassword() {
    method setPassword (line 60) | public UserDO setPassword(String password) {
    method getCreateTime (line 65) | public Date getCreateTime() {
    method setCreateTime (line 69) | public UserDO setCreateTime(Date createTime) {
    method getDeleted (line 74) | public Integer getDeleted() {
    method setDeleted (line 78) | public UserDO setDeleted(Integer deleted) {

FILE: lab-21/lab-21-cache-demo/src/main/java/cn/iocoder/springboot/lab21/cache/mapper/UserCacheDao.java
  class UserCacheDao (line 6) | @Repository
    method get (line 9) | public UserDO get(Integer id) {
    method put (line 13) | public void put(UserDO user) {

FILE: lab-21/lab-21-cache-demo/src/main/java/cn/iocoder/springboot/lab21/cache/mapper/UserMapper.java
  type UserMapper (line 9) | @Repository
    method selectById (line 12) | @Cacheable(value = "users", key = "#id")
    method insert0 (line 15) | @CachePut(value = "users", key = "#user.id")

FILE: lab-21/lab-21-cache-demo/src/main/java/cn/iocoder/springboot/lab21/cache/service/UserService.java
  class UserService (line 8) | public class UserService {
    method getUser (line 16) | public UserDO getUser(Integer id) {
    method getUser2 (line 31) | public UserDO getUser2(Integer id) {

FILE: lab-21/lab-21-cache-demo/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users` (

FILE: lab-21/lab-21-cache-demo/src/test/java/cn/iocoder/springboot/lab21/cache/UserMapperTest.java
  class UserMapperTest (line 14) | @RunWith(SpringRunner.class)
    method testSelectById (line 21) | @Test
    method testInsert (line 29) | @Test

FILE: lab-21/lab-21-cache-ehcache/src/main/java/cn/iocoder/springboot/lab21/cache/Application.java
  class Application (line 7) | @SpringBootApplication

FILE: lab-21/lab-21-cache-ehcache/src/main/java/cn/iocoder/springboot/lab21/cache/dataobject/UserDO.java
  class UserDO (line 11) | @TableName(value = "users")
    method getId (line 38) | public Integer getId() {
    method setId (line 42) | public UserDO setId(Integer id) {
    method getUsername (line 47) | public String getUsername() {
    method setUsername (line 51) | public UserDO setUsername(String username) {
    method getPassword (line 56) | public String getPassword() {
    method setPassword (line 60) | public UserDO setPassword(String password) {
    method getCreateTime (line 65) | public Date getCreateTime() {
    method setCreateTime (line 69) | public UserDO setCreateTime(Date createTime) {
    method getDeleted (line 74) | public Integer getDeleted() {
    method setDeleted (line 78) | public UserDO setDeleted(Integer deleted) {
    method toString (line 83) | @Override

FILE: lab-21/lab-21-cache-ehcache/src/main/java/cn/iocoder/springboot/lab21/cache/mapper/UserMapper.java
  type UserMapper (line 11) | @Repository
    method selectById (line 15) | @Cacheable(key = "#id")
    method insert0 (line 18) | @CachePut(key = "#user.id")
    method deleteById (line 26) | @CacheEvict(key = "#id")

FILE: lab-21/lab-21-cache-ehcache/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users` (

FILE: lab-21/lab-21-cache-ehcache/src/test/java/cn/iocoder/springboot/lab21/cache/UserMapperTest.java
  class UserMapperTest (line 16) | @RunWith(SpringRunner.class)
    method testCacheManager (line 28) | @Test
    method testSelectById (line 33) | @Test
    method testInsert (line 49) | @Test
    method testDeleteById (line 63) | @Test

FILE: lab-21/lab-21-cache-redis/src/main/java/cn/iocoder/springboot/lab21/cache/Application.java
  class Application (line 7) | @SpringBootApplication

FILE: lab-21/lab-21-cache-redis/src/main/java/cn/iocoder/springboot/lab21/cache/dataobject/UserDO.java
  class UserDO (line 12) | @TableName(value = "users")
    method getId (line 39) | public Integer getId() {
    method setId (line 43) | public UserDO setId(Integer id) {
    method getUsername (line 48) | public String getUsername() {
    method setUsername (line 52) | public UserDO setUsername(String username) {
    method getPassword (line 57) | public String getPassword() {
    method setPassword (line 61) | public UserDO setPassword(String password) {
    method getCreateTime (line 66) | public Date getCreateTime() {
    method setCreateTime (line 70) | public UserDO setCreateTime(Date createTime) {
    method getDeleted (line 75) | public Integer getDeleted() {
    method setDeleted (line 79) | public UserDO setDeleted(Integer deleted) {
    method toString (line 84) | @Override

FILE: lab-21/lab-21-cache-redis/src/main/java/cn/iocoder/springboot/lab21/cache/mapper/UserMapper.java
  type UserMapper (line 11) | @Repository
    method selectById (line 15) | @Cacheable(key = "#id")
    method insert0 (line 18) | @CachePut(key = "#user.id")
    method deleteById (line 26) | @CacheEvict(key = "#id")

FILE: lab-21/lab-21-cache-redis/src/main/resources/sql/users.sql
  type `users` (line 1) | CREATE TABLE `users` (

FILE: lab-21/lab-21-cache-redis/src/test/java/cn/iocoder/springboot/lab21/cache/UserMapperTest.java
  class UserMapperTest (line 16) | @RunWith(SpringRunner.class)
    method testCacheManager (line 28) | @Test
    method testSelectById (line 33) | @Test
    method testInsert (line 49) | @Test
    method testDeleteById (line 63) | @Test

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/config/ValidationConfiguration.java
  class ValidationConfiguration (line 11) | @Configuration
    method validator (line 19) | @Bean

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/constants/GenderEnum.java
  type GenderEnum (line 7) | public enum GenderEnum implements IntArrayValuable {
    method GenderEnum (line 26) | GenderEnum(Integer value, String name) {
    method getValue (line 31) | public Integer getValue() {
    method getName (line 35) | public String getName() {
    method array (line 39) | @Override

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/constants/ServiceExceptionEnum.java
  type ServiceExceptionEnum (line 6) | public enum ServiceExceptionEnum {
    method ServiceExceptionEnum (line 31) | ServiceExceptionEnum(int code, String message) {
    method getCode (line 36) | public int getCode() {
    method getMessage (line 40) | public String getMessage() {

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/controller/UserController.java
  class UserController (line 15) | @RestController
    method get (line 22) | @GetMapping("/get")
    method add (line 27) | @PostMapping("/add")
    method updateGender (line 32) | @PostMapping("/update_gender")
    method updateStatusTrue (line 37) | @PostMapping("/update_status_true")
    method updateStatusFalse (line 42) | @PostMapping("/update_status_false")
    method update (line 47) | @PostMapping("/update")

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/core/exception/ServiceException.java
  class ServiceException (line 32) | public final class ServiceException extends RuntimeException {
    method ServiceException (line 39) | public ServiceException(ServiceExceptionEnum serviceExceptionEnum) {
    method getCode (line 46) | public Integer getCode() {

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/core/validator/InEnumValidator.java
  class InEnumValidator (line 10) | public class InEnumValidator implements ConstraintValidator<InEnum, Inte...
    method initialize (line 17) | @Override
    method isValid (line 27) | @Override

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/core/validator/IntArrayValuable.java
  type IntArrayValuable (line 6) | public interface IntArrayValuable {
    method array (line 11) | int[] array();

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/core/vo/CommonResult.java
  class CommonResult (line 13) | public class CommonResult<T> implements Serializable {
    method error (line 39) | public static <T> CommonResult<T> error(CommonResult<?> result) {
    method error (line 43) | public static <T> CommonResult<T> error(Integer code, String message) {
    method success (line 51) | public static <T> CommonResult<T> success(T data) {
    method getCode (line 59) | public Integer getCode() {
    method setCode (line 63) | public void setCode(Integer code) {
    method getMessage (line 67) | public String getMessage() {
    method setMessage (line 71) | public void setMessage(String message) {
    method getData (line 75) | public T getData() {
    method setData (line 79) | public void setData(T data) {
    method isSuccess (line 83) | @JsonIgnore
    method isError (line 88) | @JsonIgnore
    method toString (line 93) | @Override

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/core/web/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 19) | @ControllerAdvice(basePackages = "cn.iocoder.springboot.lab22.validation...
    method serviceExceptionHandler (line 27) | @ResponseBody
    method missingServletRequestParameterExceptionHandler (line 40) | @ResponseBody
    method constraintViolationExceptionHandler (line 49) | @ResponseBody
    method bindExceptionHandler (line 68) | @ResponseBody
    method exceptionHandler (line 90) | @ResponseBody

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/core/web/GlobalResponseBodyHandler.java
  class GlobalResponseBodyHandler (line 12) | @ControllerAdvice(basePackages = "cn.iocoder.springboot.lab22.validation...
    method supports (line 15) | @Override
    method beforeBodyWrite (line 20) | @Override

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/dto/UserAddDTO.java
  class UserAddDTO (line 11) | public class UserAddDTO {
    method getUsername (line 27) | public String getUsername() {
    method setUsername (line 31) | public UserAddDTO setUsername(String username) {
    method getPassword (line 36) | public String getPassword() {
    method setPassword (line 40) | public UserAddDTO setPassword(String password) {
    method toString (line 45) | @Override

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/dto/UserUpdateDTO.java
  class UserUpdateDTO (line 8) | public class UserUpdateDTO {
    method getId (line 16) | public Integer getId() {
    method setId (line 20) | public UserUpdateDTO setId(Integer id) {

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/dto/UserUpdateGenderDTO.java
  class UserUpdateGenderDTO (line 11) | public class UserUpdateGenderDTO {
    method getId (line 26) | public Integer getId() {
    method setId (line 30) | public UserUpdateGenderDTO setId(Integer id) {
    method getGender (line 35) | public Integer getGender() {
    method setGender (line 39) | public UserUpdateGenderDTO setGender(Integer gender) {
    method toString (line 44) | @Override

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/dto/UserUpdateStatusDTO.java
  class UserUpdateStatusDTO (line 9) | public class UserUpdateStatusDTO {
    type Group01 (line 14) | public interface Group01 {}
    type Group02 (line 19) | public interface Group02 {}
    method getStatus (line 28) | public Boolean getStatus() {
    method setStatus (line 32) | public UserUpdateStatusDTO setStatus(Boolean status) {

FILE: lab-22/lab-22-validation-01/src/main/java/cn/iocoder/springboot/lab22/validation/service/UserService.java
  class UserService (line 13) | @Service
    method get (line 19) | public void get(@Min(value = 1L, message = "编号必须大于 0") Integer id) {
    method add (line 23) | public void add(@Valid UserAddDTO addDTO) {
    method add01 (line 27) | public void add01(UserAddDTO addDTO) {
    method add02 (line 31) | public void add02(UserAddDTO addDTO) {
    method self (line 35) | private UserService self() {

FILE: lab-22/lab-22-validation-01/src/test/java/cn/iocoder/springboot/lab22/validation/service/UserServiceTest.java
  class UserServiceTest (line 15) | @RunWith(SpringRunner.class)
    method testGet (line 25) | @Test
    method testAdd (line 30) | @Test
    method testAdd01 (line 36) | @Test
    method testAdd02 (line 42) | @Test
    method testValidator (line 48) | @Test

FILE: lab-23/lab-springmvc-23-01/src/main/java/cn/iocoder/springboot/lab23/springmvc/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-23/lab-springmvc-23-01/src/main/java/cn/iocoder/springboot/lab23/springmvc/controller/UserController.java
  class UserController (line 16) | @RestController
    method list (line 28) | @GetMapping("")
    method get (line 45) | @GetMapping("/{id}")
    method get2 (line 57) | @GetMapping("/v2/{id}")
    method add (line 68) | @PostMapping("")
    method update (line 83) | @PutMapping("/{id}")
    method delete (line 99) | @DeleteMapping("/{id}")

FILE: lab-23/lab-springmvc-23-01/src/main/java/cn/iocoder/springboot/lab23/springmvc/controller/UserController2.java
  class UserController2 (line 15) | @RestController
    method list (line 24) | @GetMapping("/list") // URL 修改成 /list
    method get (line 41) | @GetMapping("/get") // URL 修改成 /get
    method add (line 53) | @PostMapping("add") // URL 修改成 /add
    method update (line 67) | @PostMapping("/update") // URL 修改成 /update ,RequestMethod 改成 POST
    method delete (line 81) | @DeleteMapping("/delete") // URL 修改成 /delete ,RequestMethod 改成 DELETE

FILE: lab-23/lab-springmvc-23-01/src/main/java/cn/iocoder/springboot/lab23/springmvc/dto/UserAddDTO.java
  class UserAddDTO (line 6) | public class UserAddDTO {
    method getUsername (line 17) | public String getUsername() {
    method setUsername (line 21) | public UserAddDTO setUsername(String username) {
    method getPassword (line 26) | public String getPassword() {
    method setPassword (line 30) | public UserAddDTO setPassword(String password) {

FILE: lab-23/lab-springmvc-23-01/src/main/java/cn/iocoder/springboot/lab23/springmvc/dto/UserUpdateDTO.java
  class UserUpdateDTO (line 3) | public class UserUpdateDTO {
    method getId (line 18) | public Integer getId() {
    method setId (line 22) | public UserUpdateDTO setId(Integer id) {
    method getUsername (line 27) | public String getUsername() {
    method setUsername (line 31) | public UserUpdateDTO setUsername(String username) {
    method getPassword (line 36) | public String getPassword() {
    method setPassword (line 40) | public UserUpdateDTO setPassword(String password) {

FILE: lab-23/lab-springmvc-23-01/src/main/java/cn/iocoder/springboot/lab23/springmvc/service/UserService.java
  class UserService (line 6) | @Service
    method get (line 9) | public UserVO get(Integer id) {

FILE: lab-23/lab-springmvc-23-01/src/main/java/cn/iocoder/springboot/lab23/springmvc/vo/UserVO.java
  class UserVO (line 6) | public class UserVO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public UserVO setId(Integer id) {
    method getUsername (line 26) | public String getUsername() {
    method setUsername (line 30) | public UserVO setUsername(String username) {

FILE: lab-23/lab-springmvc-23-01/src/test/java/cn/iocoder/springboot/lab23/springmvc/controller/UserControllerTest.java
  class UserControllerTest (line 20) | @RunWith(SpringRunner.class)
    method testList (line 28) | @Test
    method testGet (line 50) | @Test
    method testGet2 (line 62) | @Test
    method testAdd (line 81) | @Test
    method testUpdate (line 92) | @Test
    method testDelete (line 103) | @Test

FILE: lab-23/lab-springmvc-23-01/src/test/java/cn/iocoder/springboot/lab23/springmvc/controller/UserControllerTest2.java
  class UserControllerTest2 (line 22) | @RunWith(SpringRunner.class)
    method testGet2 (line 32) | @Test

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/Application.java
  class Application (line 7) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/config/SpringMVCConfiguration.java
  class SpringMVCConfiguration (line 34) | @Configuration
    method firstInterceptor (line 39) | @Bean
    method secondInterceptor (line 44) | @Bean
    method thirdInterceptor (line 49) | @Bean
    method addInterceptors (line 54) | @Override
    method testServlet01 (line 64) | @Bean
    method testFilter01 (line 78) | @Bean
    method testListener01 (line 93) | @Bean
    method corsFilter (line 122) | @Bean
    method configureMessageConverters (line 158) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/constants/ServiceExceptionEnum.java
  type ServiceExceptionEnum (line 6) | public enum ServiceExceptionEnum {
    method ServiceExceptionEnum (line 30) | ServiceExceptionEnum(int code, String message) {
    method getCode (line 35) | public int getCode() {
    method getMessage (line 39) | public String getMessage() {

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/controller/ProductController.java
  class ProductController (line 10) | @Deprecated
    method add (line 15) | @PostMapping(value = "/add",

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/controller/UserController.java
  class UserController (line 17) | @RestController
    method get (line 32) | @GetMapping("/get")
    method get2 (line 46) | @GetMapping("/get2")
    method get3 (line 62) | @PostMapping("/get")
    method exception01 (line 71) | @GetMapping("/exception-01")
    method exception02 (line 79) | @GetMapping("/exception-02")
    method doSomething (line 84) | @GetMapping("/do_something")
    method currentUser (line 89) | @GetMapping("/current_user")
    method exception03 (line 95) | @GetMapping("/exception-03")
    method add (line 101) | @PostMapping(value = "/add",

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/controller2/TestController.java
  class TestController (line 16) | @RestController
    method get (line 26) | @GetMapping("/get")

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/exception/ServiceException.java
  class ServiceException (line 32) | public final class ServiceException extends RuntimeException {
    method ServiceException (line 39) | public ServiceException(ServiceExceptionEnum serviceExceptionEnum) {
    method getCode (line 46) | public Integer getCode() {

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/interceptor/FirstInterceptor.java
  class FirstInterceptor (line 11) | public class FirstInterceptor implements HandlerInterceptor {
    method preHandle (line 15) | @Override
    method postHandle (line 21) | @Override
    method afterCompletion (line 26) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/interceptor/SecondInterceptor.java
  class SecondInterceptor (line 11) | public class SecondInterceptor implements HandlerInterceptor {
    method preHandle (line 15) | @Override
    method postHandle (line 21) | @Override
    method afterCompletion (line 26) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/interceptor/ThirdInterceptor.java
  class ThirdInterceptor (line 11) | public class ThirdInterceptor implements HandlerInterceptor {
    method preHandle (line 15) | @Override
    method postHandle (line 21) | @Override
    method afterCompletion (line 26) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/servlet/TestFilter02.java
  class TestFilter02 (line 10) | @WebFilter("/test/*")
    method doFilter (line 15) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/servlet/TestServlet02.java
  class TestServlet02 (line 13) | @WebServlet(urlPatterns = "/test/02")
    method doGet (line 18) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/servlet/TestServletContextListener02.java
  class TestServletContextListener02 (line 10) | @WebListener
    method contextInitialized (line 15) | @Override
    method contextDestroyed (line 20) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/vo/CommonResult.java
  class CommonResult (line 13) | public class CommonResult<T> implements Serializable {
    method error (line 39) | public static <T> CommonResult<T> error(CommonResult<?> result) {
    method error (line 43) | public static <T> CommonResult<T> error(Integer code, String message) {
    method success (line 51) | public static <T> CommonResult<T> success(T data) {
    method getCode (line 59) | public Integer getCode() {
    method setCode (line 63) | public void setCode(Integer code) {
    method getMessage (line 67) | public String getMessage() {
    method setMessage (line 71) | public void setMessage(String message) {
    method getData (line 75) | public T getData() {
    method setData (line 79) | public void setData(T data) {
    method isSuccess (line 83) | @JsonIgnore
    method isError (line 88) | @JsonIgnore
    method toString (line 93) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/web/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 15) | @ControllerAdvice(basePackages = "cn.iocoder.springboot.lab23.springmvc....
    method serviceExceptionHandler (line 23) | @ResponseBody
    method missingServletRequestParameterExceptionHandler (line 36) | @ResponseBody
    method exceptionHandler (line 48) | @ResponseBody

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/core/web/GlobalResponseBodyHandler.java
  class GlobalResponseBodyHandler (line 12) | @ControllerAdvice(basePackages = "cn.iocoder.springboot.lab23.springmvc....
    method supports (line 15) | @Override
    method beforeBodyWrite (line 20) | @Override

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/vo/ProductVO.java
  class ProductVO (line 8) | public class ProductVO {
    method getId (line 21) | public Integer getId() {
    method setId (line 25) | public ProductVO setId(Integer id) {
    method getTitle (line 30) | public String getTitle() {
    method setTitle (line 34) | public ProductVO setTitle(String title) {

FILE: lab-23/lab-springmvc-23-02/src/main/java/cn/iocoder/springboot/lab23/springmvc/vo/UserVO.java
  class UserVO (line 6) | public class UserVO {
    method getId (line 17) | public Integer getId() {
    method setId (line 21) | public UserVO setId(Integer id) {
    method getUsername (line 26) | public String getUsername() {
    method setUsername (line 30) | public UserVO setUsername(String username) {

FILE: lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/TestJApiDocs.java
  class TestJApiDocs (line 7) | public class TestJApiDocs {
    method main (line 9) | public static void main(String[] args) {

FILE: lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java
  class UserController (line 13) | @RestController
    method list (line 24) | @GetMapping("list")
    method saveUser (line 35) | @PostMapping("save")
    method deleteUser (line 46) | @DeleteMapping("delete")

FILE: lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserCreateReqVO.java
  class UserCreateReqVO (line 6) | public class UserCreateReqVO {

FILE: lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserListReqVO.java
  class UserListReqVO (line 6) | public class UserListReqVO {

FILE: lab-24/lab-24-apidoc-japidocs/src/main/java/cn/iocoder/springboot/lab24/vo/UserRespVO.java
  class UserRespVO (line 6) | public class UserRespVO {

FILE: lab-24/lab-24-apidoc-showdoc/src/main/java/cn/iocoder/springboot/lab24/apidoc/ShowDocApplication.java
  class ShowDocApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-24/lab-24-apidoc-showdoc/src/main/java/cn/iocoder/springboot/lab24/apidoc/controller/UserController.java
  class UserController (line 7) | @RestController
    method login (line 11) | @PostMapping("/login")
    method login2 (line 35) | @PostMapping("/login2")

FILE: lab-24/lab-24-apidoc-showdoc/src/main/java/cn/iocoder/springboot/lab24/apidoc/controller/vo/UserLoginReqVO.java
  class UserLoginReqVO (line 3) | public class UserLoginReqVO {
    method getUsername (line 12) | public String getUsername() {
    method setUsername (line 16) | public UserLoginReqVO setUsername(String username) {
    method getPassword (line 21) | public String getPassword() {
    method setPassword (line 25) | public UserLoginReqVO setPassword(String password) {

FILE: lab-24/lab-24-apidoc-showdoc/src/main/java/cn/iocoder/springboot/lab24/apidoc/controller/vo/UserLoginRespVO.java
  class UserLoginRespVO (line 3) | public class UserLoginRespVO {
    method getUserId (line 11) | public Integer getUserId() {
    method setUserId (line 15) | public UserLoginRespVO setUserId(Integer userId) {
    method getName (line 20) | public String getName() {
    method setName (line 24) | public UserLoginRespVO setName(String name) {
    method getUsername (line 29) | public String getUsername() {
    method setUsername (line 33) | public UserLoginRespVO setUsername(String username) {

FILE: lab-24/lab-24-apidoc-swagger-knife4j/src/main/java/cn/iocoder/springboot/lab24/apidoc/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-24/lab-24-apidoc-swagger-knife4j/src/main/java/cn/iocoder/springboot/lab24/apidoc/config/SwaggerConfiguration.java
  class SwaggerConfiguration (line 14) | @Configuration
    method createRestApi (line 18) | @Bean
    method apiInfo (line 34) | private ApiInfo apiInfo() {

FILE: lab-24/lab-24-apidoc-swagger-knife4j/src/main/java/cn/iocoder/springboot/lab24/apidoc/controller/TestController.java
  class TestController (line 15) | @RequestMapping("/tests")
    method list (line 19) | @GetMapping("/list")
    method get (line 31) | @GetMapping("/get")
    method add (line 39) | @PostMapping("add")
    method update (line 48) | @PostMapping("/update")
    method delete (line 57) | @PostMapping("/delete")

FILE: lab-24/lab-24-apidoc-swagger-knife4j/src/main/java/cn/iocoder/springboot/lab24/apidoc/controller/UserController.java
  class UserController (line 15) | @RestController
    method list (line 20) | @GetMapping("/list")
    method get (line 32) | @GetMapping("/get")
    method add (line 40) | @PostMapping("add")
    method update (line 49) | @PostMapping("/update")
    method delete (line 58) | @PostMapping("/delete")

FILE: lab-24/lab-24-apidoc-swagger-knife4j/src/main/java/cn/iocoder/springboot/lab24/apidoc/dto/UserAddDTO.java
  class UserAddDTO (line 6) | @ApiModel("用户添加 DTO")
    method getUsername (line 14) | public String getUsername() {
    method setUsername (line 18) | public UserAddDTO setUsername(String username) {
    method getPassword (line 23) | public String getPassword() {
    method setPassword (line 27) | public UserAddDTO setPassword(String password) {

FILE: lab-24/lab-24-apidoc-swagger-knife4j/src/main/java/cn/iocoder/springboot/lab24/apidoc/dto/UserUpdateDTO.java
  class UserUpdateDTO (line 6) | @ApiModel("用户更新 DTO")
    method getId (line 16) | public Integer getId() {
    method setId (line 20) | public UserUpdateDTO setId(Integer id) {
    method getUsername (line 25) | public String getUsername() {
    method setUsername (line 29) | public UserUpdateDTO setUsername(String username) {
    method getPassword (line 34) | public String getPassword() {
    method setPassword (line 38) | public UserUpdateDTO setPassword(String password) {

FILE: lab-24/lab-24-apidoc-swagger-knife4j/src/main/java/cn/iocoder/springboot/lab24/apidoc/vo/UserVO.java
  class UserVO (line 6) | @ApiModel("用户 VO")
    method getId (line 14) | public Integer getId() {
    method setId (line 18) | public UserVO setId(Integer id) {
    method getUsername (line 23) | public String getUsername() {
    method setUsername (line 27) | public UserVO setUsername(String username) {

FILE: lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/config/SwaggerConfiguration.java
  class SwaggerConfiguration (line 13) | @Configuration
    method createRestApi (line 17) | @Bean
    method apiInfo (line 33) | private ApiInfo apiInfo() {

FILE: lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/controller/UserController.java
  class UserController (line 15) | @RestController
    method list (line 20) | @GetMapping("/list")
    method get (line 32) | @GetMapping("/get")
    method add (line 40) | @PostMapping("add")
    method update (line 49) | @PostMapping("/update")
    method delete (line 58) | @PostMapping("/delete")

FILE: lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserAddDTO.java
  class UserAddDTO (line 6) | @ApiModel("用户添加 DTO")
    method getUsername (line 14) | public String getUsername() {
    method setUsername (line 18) | public UserAddDTO setUsername(String username) {
    method getPassword (line 23) | public String getPassword() {
    method setPassword (line 27) | public UserAddDTO setPassword(String password) {

FILE: lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/dto/UserUpdateDTO.java
  class UserUpdateDTO (line 6) | @ApiModel("用户更新 DTO")
    method getId (line 16) | public Integer getId() {
    method setId (line 20) | public UserUpdateDTO setId(Integer id) {
    method getUsername (line 25) | public String getUsername() {
    method setUsername (line 29) | public UserUpdateDTO setUsername(String username) {
    method getPassword (line 34) | public String getPassword() {
    method setPassword (line 38) | public UserUpdateDTO setPassword(String password) {

FILE: lab-24/lab-24-apidoc-swagger-starter/src/main/java/cn/iocoder/springboot/lab24/vo/UserVO.java
  class UserVO (line 6) | @ApiModel("用户 VO")
    method getId (line 14) | public Integer getId() {
    method setId (line 18) | public UserVO setId(Integer id) {
    method getUsername (line 23) | public String getUsername() {
    method setUsername (line 27) | public UserVO setUsername(String username) {

FILE: lab-24/lab-24-apidoc-swagger/src/main/java/cn/iocoder/springboot/lab24/apidoc/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-24/lab-24-apidoc-swagger/src/main/java/cn/iocoder/springboot/lab24/apidoc/config/SwaggerConfiguration.java
  class SwaggerConfiguration (line 14) | @Configuration
    method createRestApi (line 18) | @Bean
    method apiInfo (line 34) | private ApiInfo apiInfo() {

FILE: lab-24/lab-24-apidoc-swagger/src/main/java/cn/iocoder/springboot/lab24/apidoc/controller/TestController.java
  class TestController (line 15) | @RequestMapping("/tests")
    method list (line 19) | @GetMapping("/list")
    method get (line 31) | @GetMapping("/get")
    method add (line 39) | @PostMapping("add")
    method update (line 48) | @PostMapping("/update")
    method delete (line 57) | @PostMapping("/delete")

FILE: lab-24/lab-24-apidoc-swagger/src/main/java/cn/iocoder/springboot/lab24/apidoc/controller/UserController.java
  class UserController (line 15) | @RestController
    method list (line 20) | @GetMapping("/list")
    method get (line 32) | @GetMapping("/get")
    method add (line 40) | @PostMapping("add")
    method update (line 49) | @PostMapping("/update")
    method delete (line 58) | @PostMapping("/delete")

FILE: lab-24/lab-24-apidoc-swagger/src/main/java/cn/iocoder/springboot/lab24/apidoc/dto/UserAddDTO.java
  class UserAddDTO (line 6) | @ApiModel("用户添加 DTO")
    method getUsername (line 14) | public String getUsername() {
    method setUsername (line 18) | public UserAddDTO setUsername(String username) {
    method getPassword (line 23) | public String getPassword() {
    method setPassword (line 27) | public UserAddDTO setPassword(String password) {

FILE: lab-24/lab-24-apidoc-swagger/src/main/java/cn/iocoder/springboot/lab24/apidoc/dto/UserUpdateDTO.java
  class UserUpdateDTO (line 6) | @ApiModel("用户更新 DTO")
    method getId (line 16) | public Integer getId() {
    method setId (line 20) | public UserUpdateDTO setId(Integer id) {
    method getUsername (line 25) | public String getUsername() {
    method setUsername (line 29) | public UserUpdateDTO setUsername(String username) {
    method getPassword (line 34) | public String getPassword() {
    method setPassword (line 38) | public UserUpdateDTO setPassword(String password) {

FILE: lab-24/lab-24-apidoc-swagger/src/main/java/cn/iocoder/springboot/lab24/apidoc/vo/UserVO.java
  class UserVO (line 6) | @ApiModel("用户 VO")
    method getId (line 14) | public Integer getId() {
    method setId (line 18) | public UserVO setId(Integer id) {
    method getUsername (line 23) | public String getUsername() {
    method setUsername (line 27) | public UserVO setUsername(String username) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/config/WebSocketConfiguration.java
  class WebSocketConfiguration (line 7) | @Configuration
    method serverEndpointExporter (line 11) | @Bean

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/AuthMessageHandler.java
  class AuthMessageHandler (line 12) | @Component
    method execute (line 15) | @Override
    method getType (line 35) | @Override

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/MessageHandler.java
  type MessageHandler (line 10) | public interface MessageHandler<T extends Message> {
    method execute (line 18) | void execute(Session session, T message);
    method getType (line 23) | String getType();

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/SendToAllHandler.java
  class SendToAllHandler (line 11) | @Component
    method execute (line 14) | @Override
    method getType (line 27) | @Override

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/SendToOneHandler.java
  class SendToOneHandler (line 11) | @Component
    method execute (line 14) | @Override
    method getType (line 27) | @Override

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/AuthRequest.java
  class AuthRequest (line 6) | public class AuthRequest implements Message {
    method getAccessToken (line 15) | public String getAccessToken() {
    method setAccessToken (line 19) | public AuthRequest setAccessToken(String accessToken) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/AuthResponse.java
  class AuthResponse (line 6) | public class AuthResponse implements Message {
    method getCode (line 19) | public Integer getCode() {
    method setCode (line 23) | public AuthResponse setCode(Integer code) {
    method getMessage (line 28) | public String getMessage() {
    method setMessage (line 32) | public AuthResponse setMessage(String message) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/Message.java
  type Message (line 6) | public interface Message {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendResponse.java
  class SendResponse (line 6) | public class SendResponse implements Message {
    method getMsgId (line 23) | public String getMsgId() {
    method setMsgId (line 27) | public SendResponse setMsgId(String msgId) {
    method getCode (line 32) | public Integer getCode() {
    method setCode (line 36) | public SendResponse setCode(Integer code) {
    method getMessage (line 41) | public String getMessage() {
    method setMessage (line 45) | public SendResponse setMessage(String message) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendToAllRequest.java
  class SendToAllRequest (line 6) | public class SendToAllRequest implements Message {
    method getContent (line 19) | public String getContent() {
    method setContent (line 23) | public SendToAllRequest setContent(String content) {
    method getMsgId (line 28) | public String getMsgId() {
    method setMsgId (line 32) | public SendToAllRequest setMsgId(String msgId) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendToOneRequest.java
  class SendToOneRequest (line 6) | public class SendToOneRequest implements Message {
    method getToUser (line 23) | public String getToUser() {
    method setToUser (line 27) | public SendToOneRequest setToUser(String toUser) {
    method getMsgId (line 32) | public String getMsgId() {
    method setMsgId (line 36) | public SendToOneRequest setMsgId(String msgId) {
    method getContent (line 41) | public String getContent() {
    method setContent (line 45) | public SendToOneRequest setContent(String content) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendToUserRequest.java
  class SendToUserRequest (line 6) | public class SendToUserRequest implements Message {
    method getMsgId (line 19) | public String getMsgId() {
    method setMsgId (line 23) | public SendToUserRequest setMsgId(String msgId) {
    method getContent (line 28) | public String getContent() {
    method setContent (line 32) | public SendToUserRequest setContent(String content) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/UserJoinNoticeRequest.java
  class UserJoinNoticeRequest (line 6) | public class UserJoinNoticeRequest implements Message {
    method getNickname (line 15) | public String getNickname() {
    method setNickname (line 19) | public UserJoinNoticeRequest setNickname(String nickname) {

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/util/WebSocketUtil.java
  class WebSocketUtil (line 17) | public class WebSocketUtil {
    method addSession (line 38) | public static void addSession(Session session, String user) {
    method removeSession (line 50) | public static void removeSession(Session session) {
    method broadcast (line 68) | public static <T extends Message> void broadcast(String type, T messag...
    method send (line 85) | public static <T extends Message> void send(Session session, String ty...
    method send (line 101) | public static <T extends Message> boolean send(String user, String typ...
    method buildTextMessage (line 121) | private static <T extends Message> String buildTextMessage(String type...
    method sendTextMessage (line 134) | private static void sendTextMessage(Session session, String messageTex...

FILE: lab-25/lab-websocket-25-01/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/websocket/WebsocketServerEndpoint.java
  class WebsocketServerEndpoint (line 27) | @Controller
    method onOpen (line 43) | @OnOpen
    method onMessage (line 60) | @OnMessage
    method onClose (line 83) | @OnClose
    method onError (line 89) | @OnError
    method afterPropertiesSet (line 94) | @Override
    method getMessageClass (line 102) | private Class<? extends Message> getMessageClass(MessageHandler handle...

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/config/WebSocketConfiguration.java
  class WebSocketConfiguration (line 11) | @Configuration
    method registerWebSocketHandlers (line 15) | @Override
    method webSocketHandler (line 22) | @Bean
    method webSocketShakeInterceptor (line 27) | @Bean

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/AuthMessageHandler.java
  class AuthMessageHandler (line 11) | @Component
    method execute (line 14) | @Override
    method getType (line 34) | @Override

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/MessageHandler.java
  type MessageHandler (line 9) | public interface MessageHandler<T extends Message> {
    method execute (line 17) | void execute(WebSocketSession session, T message);
    method getType (line 22) | String getType();

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/SendToAllHandler.java
  class SendToAllHandler (line 10) | @Component
    method execute (line 13) | @Override
    method getType (line 26) | @Override

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/handler/SendToOneHandler.java
  class SendToOneHandler (line 10) | @Component
    method execute (line 13) | @Override
    method getType (line 26) | @Override

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/AuthRequest.java
  class AuthRequest (line 6) | public class AuthRequest implements Message {
    method getAccessToken (line 15) | public String getAccessToken() {
    method setAccessToken (line 19) | public AuthRequest setAccessToken(String accessToken) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/AuthResponse.java
  class AuthResponse (line 6) | public class AuthResponse implements Message {
    method getCode (line 19) | public Integer getCode() {
    method setCode (line 23) | public AuthResponse setCode(Integer code) {
    method getMessage (line 28) | public String getMessage() {
    method setMessage (line 32) | public AuthResponse setMessage(String message) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/Message.java
  type Message (line 6) | public interface Message {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendResponse.java
  class SendResponse (line 6) | public class SendResponse implements Message {
    method getMsgId (line 23) | public String getMsgId() {
    method setMsgId (line 27) | public SendResponse setMsgId(String msgId) {
    method getCode (line 32) | public Integer getCode() {
    method setCode (line 36) | public SendResponse setCode(Integer code) {
    method getMessage (line 41) | public String getMessage() {
    method setMessage (line 45) | public SendResponse setMessage(String message) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendToAllRequest.java
  class SendToAllRequest (line 6) | public class SendToAllRequest implements Message {
    method getContent (line 19) | public String getContent() {
    method setContent (line 23) | public SendToAllRequest setContent(String content) {
    method getMsgId (line 28) | public String getMsgId() {
    method setMsgId (line 32) | public SendToAllRequest setMsgId(String msgId) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendToOneRequest.java
  class SendToOneRequest (line 6) | public class SendToOneRequest implements Message {
    method getToUser (line 23) | public String getToUser() {
    method setToUser (line 27) | public SendToOneRequest setToUser(String toUser) {
    method getMsgId (line 32) | public String getMsgId() {
    method setMsgId (line 36) | public SendToOneRequest setMsgId(String msgId) {
    method getContent (line 41) | public String getContent() {
    method setContent (line 45) | public SendToOneRequest setContent(String content) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/SendToUserRequest.java
  class SendToUserRequest (line 6) | public class SendToUserRequest implements Message {
    method getMsgId (line 19) | public String getMsgId() {
    method setMsgId (line 23) | public SendToUserRequest setMsgId(String msgId) {
    method getContent (line 28) | public String getContent() {
    method setContent (line 32) | public SendToUserRequest setContent(String content) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/message/UserJoinNoticeRequest.java
  class UserJoinNoticeRequest (line 6) | public class UserJoinNoticeRequest implements Message {
    method getNickname (line 15) | public String getNickname() {
    method setNickname (line 19) | public UserJoinNoticeRequest setNickname(String nickname) {

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/util/WebSocketUtil.java
  class WebSocketUtil (line 17) | public class WebSocketUtil {
    method addSession (line 38) | public static void addSession(WebSocketSession session, String user) {
    method removeSession (line 50) | public static void removeSession(WebSocketSession session) {
    method broadcast (line 68) | public static <T extends Message> void broadcast(String type, T messag...
    method send (line 85) | public static <T extends Message> void send(WebSocketSession session, ...
    method send (line 101) | public static <T extends Message> boolean send(String user, String typ...
    method buildTextMessage (line 121) | private static <T extends Message> TextMessage buildTextMessage(String...
    method sendTextMessage (line 134) | private static void sendTextMessage(WebSocketSession session, TextMess...

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/websocket/DemoWebSocketHandler.java
  class DemoWebSocketHandler (line 26) | public class DemoWebSocketHandler extends TextWebSocketHandler implement...
    method afterConnectionEstablished (line 40) | @Override // 对应 open 事件
    method handleTextMessage (line 56) | @Override // 对应 message 事件
    method afterConnectionClosed (line 79) | @Override // 对应 close 事件
    method handleTransportError (line 85) | @Override // 对应 error 事件
    method afterPropertiesSet (line 90) | @Override
    method getMessageClass (line 98) | private Class<? extends Message> getMessageClass(MessageHandler handle...

FILE: lab-25/lab-websocket-25-02/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/websocket/DemoWebSocketShakeInterceptor.java
  class DemoWebSocketShakeInterceptor (line 16) | public class DemoWebSocketShakeInterceptor extends HttpSessionHandshakeI...
    method beforeHandshake (line 18) | @Override // 拦截 Handshake 事件

FILE: lab-25/lab-websocket-25-03/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/Application.java
  class Application (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: lab-25/lab-websocket-25-03/src/main/java/cn/iocoder/springboot/lab25/springwebsocket/config/WebSocketConfiguration.java
  class WebSocketConfiguration (line 9) |
Condensed preview — 3513 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,125K chars).
[
  {
    "path": ".gitignore",
    "chars": 448,
    "preview": "# Created by .ignore support plugin (hsz.mobi)\n### Java template\n# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# Blue"
  },
  {
    "path": "README.md",
    "chars": 32129,
    "preview": "> 友情提示:因为提供了 50000+ 行示例代码,所以艿艿默认注释了所有 Maven Module。\n>\n> 胖友可以根据自己的需要,修改 [`pom.xml`](https://github.com/YunaiV/SpringBoot-"
  },
  {
    "path": "httpRequests/2020-12-20T004250.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T004328.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:43:28.332+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T004337.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T004347.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T004347.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:43:47.777+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T004358.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T004358.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:43:58.210+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T004401.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T004401.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:44:01.275+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T004538.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T004547.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:45:47.364+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T004638.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:46:38.505+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T004645.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:46:45.875+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T004809.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T004813.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T16:48:13.674+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T010724.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T010738.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T010809.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T010823.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:08:23.036+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T010840.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011020.500.json",
    "chars": 160,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:10:20.615+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T011347.500.json",
    "chars": 162,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:13:47.777+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T011526.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011530.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011541.400.json",
    "chars": 215,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:15:40.992+0000\",\n  \"status\": 400,\n  \"error\": \"Bad Request\",\n  \"message\": \"Missing reques"
  },
  {
    "path": "httpRequests/2020-12-20T011551.500.json",
    "chars": 162,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:15:51.919+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T011556.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011628-1.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011628.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011646.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011650.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011653.500.json",
    "chars": 162,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:16:53.489+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T011818.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011843.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T011847.500.json",
    "chars": 162,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:18:47.862+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T012507.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T012510.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T012527.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T012540.400.json",
    "chars": 215,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:25:40.604+0000\",\n  \"status\": 400,\n  \"error\": \"Bad Request\",\n  \"message\": \"Missing reques"
  },
  {
    "path": "httpRequests/2020-12-20T012544.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T012703.500.json",
    "chars": 162,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:27:03.272+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T012708.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T012710.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T013544.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T013552.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T013558.500.json",
    "chars": 162,
    "preview": "{\n  \"timestamp\": \"2020-12-19T17:35:58.033+0000\",\n  \"status\": 500,\n  \"error\": \"Internal Server Error\",\n  \"message\": \"小朋友,"
  },
  {
    "path": "httpRequests/2020-12-20T013845.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T014019.200.json",
    "chars": 51,
    "preview": "{\n  \"gender\": 1,\n  \"nickname\": \"芋道源码\",\n  \"id\": 1\n}\n"
  },
  {
    "path": "httpRequests/2020-12-20T021415.200.json",
    "chars": 41,
    "preview": "{\n  \"userId\": 1,\n  \"token\": \"token001\"\n}\n"
  },
  {
    "path": "httpRequests/http-client.cookies",
    "chars": 30,
    "preview": "# domain\tpath\tname\tvalue\tdate\n"
  },
  {
    "path": "httpRequests/http-requests-log.http",
    "chars": 7166,
    "preview": "POST http://127.0.0.1:8080/user/login\nContent-Type: application/x-www-form-urlencoded\n\nusername=yudaoyuanma&password=123"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo/pom.xml",
    "chars": 1063,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java",
    "chars": 335,
    "preview": "package cn.iocoder.springboot.lab01.springsecurity;\n\nimport org.springframework.boot.SpringApplication;\nimport org.sprin"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java",
    "chars": 408,
    "preview": "package cn.iocoder.springboot.lab01.springsecurity.controller;\n\nimport org.springframework.web.bind.annotation.GetMappin"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo/src/main/resources/application.yaml",
    "chars": 203,
    "preview": "spring:\n  # Spring Security 配置项,对应 SecurityProperties 配置类\n  security:\n    # 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。\n "
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo-role/pom.xml",
    "chars": 1068,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java",
    "chars": 335,
    "preview": "package cn.iocoder.springboot.lab01.springsecurity;\n\nimport org.springframework.boot.SpringApplication;\nimport org.sprin"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java",
    "chars": 2127,
    "preview": "package cn.iocoder.springboot.lab01.springsecurity.config;\n\nimport org.springframework.context.annotation.Configuration;"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java",
    "chars": 873,
    "preview": "package cn.iocoder.springboot.lab01.springsecurity.controller;\n\nimport org.springframework.security.access.prepost.PreAu"
  },
  {
    "path": "lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java",
    "chars": 661,
    "preview": "package cn.iocoder.springboot.lab01.springsecurity.controller;\n\nimport org.springframework.web.bind.annotation.GetMappin"
  },
  {
    "path": "lab-01-spring-security/pom.xml",
    "chars": 702,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-01-spring-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md",
    "chars": 60,
    "preview": "<http://www.iocoder.cn/Spring-Boot/Spring-Security/?github>\n"
  },
  {
    "path": "lab-02-spring-security-oauth/authorization-code-server/pom.xml",
    "chars": 1250,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java",
    "chars": 324,
    "preview": "package cn.iocoder.springboot.labs.lab01;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework"
  },
  {
    "path": "lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java",
    "chars": 1090,
    "preview": "package cn.iocoder.springboot.labs.lab01.authorization;\n\nimport org.springframework.context.annotation.Configuration;\nim"
  },
  {
    "path": "lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java",
    "chars": 936,
    "preview": "package cn.iocoder.springboot.labs.lab01.resource;\n\nimport org.springframework.context.annotation.Configuration;\nimport "
  },
  {
    "path": "lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java",
    "chars": 382,
    "preview": "package cn.iocoder.springboot.labs.lab01.resource.api;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\ni"
  },
  {
    "path": "lab-02-spring-security-oauth/authorization-code-server/src/main/resources/application.properties",
    "chars": 78,
    "preview": "# Spring Security Setting\nsecurity.user.name=yunai\nsecurity.user.password=1024"
  },
  {
    "path": "lab-02-spring-security-oauth/client-credentials-server/pom.xml",
    "chars": 1251,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/Application.java",
    "chars": 297,
    "preview": "package lab01;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringB"
  },
  {
    "path": "lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java",
    "chars": 985,
    "preview": "package lab01.authorization;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.se"
  },
  {
    "path": "lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java",
    "chars": 909,
    "preview": "package lab01.resource;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.securit"
  },
  {
    "path": "lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java",
    "chars": 355,
    "preview": "package lab01.resource.api;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.w"
  },
  {
    "path": "lab-02-spring-security-oauth/implicit-server/pom.xml",
    "chars": 1240,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/Application.java",
    "chars": 297,
    "preview": "package lab01;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringB"
  },
  {
    "path": "lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java",
    "chars": 1053,
    "preview": "package lab01.authorization;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.se"
  },
  {
    "path": "lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java",
    "chars": 969,
    "preview": "package lab01.resource;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.securit"
  },
  {
    "path": "lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/api/ExampleController.java",
    "chars": 374,
    "preview": "package lab01.resource.api;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.w"
  },
  {
    "path": "lab-02-spring-security-oauth/implicit-server/src/main/resources/application.properties",
    "chars": 78,
    "preview": "# Spring Security Setting\nsecurity.user.name=yunai\nsecurity.user.password=1024"
  },
  {
    "path": "lab-02-spring-security-oauth/pom.xml",
    "chars": 1071,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server/pom.xml",
    "chars": 1267,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/Application.java",
    "chars": 297,
    "preview": "package lab01;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringB"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java",
    "chars": 1493,
    "preview": "package lab01.authorization;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework."
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java",
    "chars": 909,
    "preview": "package lab01.resource;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.securit"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java",
    "chars": 355,
    "preview": "package lab01.resource.api;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.w"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/resources/application.properties",
    "chars": 78,
    "preview": "# Spring Security Setting\nsecurity.user.name=yunai\nsecurity.user.password=1024"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/pom.xml",
    "chars": 1639,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java",
    "chars": 297,
    "preview": "package lab02;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringB"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java",
    "chars": 2577,
    "preview": "package lab02.authorization;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework."
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java",
    "chars": 909,
    "preview": "package lab02.resource;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.securit"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java",
    "chars": 355,
    "preview": "package lab02.resource.api;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.w"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/application.properties",
    "chars": 249,
    "preview": "# Spring Security Setting\nsecurity.user.name=yunai\nsecurity.user.password=1024\n\n##################### MySQL ############"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/data.sql",
    "chars": 1049,
    "preview": "INSERT INTO oauth_client_details\n\t(client_id, client_secret, scope, authorized_grant_types,\n\tweb_server_redirect_uri, au"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql",
    "chars": 1783,
    "preview": "--------------- MySQL ---------------\ndrop table if exists oauth_client_details;\ncreate table oauth_client_details (\n  c"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/pom.xml",
    "chars": 1286,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java",
    "chars": 297,
    "preview": "package lab01;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringB"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java",
    "chars": 1573,
    "preview": "package lab01.authorization;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework."
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java",
    "chars": 909,
    "preview": "package lab01.resource;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.securit"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java",
    "chars": 355,
    "preview": "package lab01.resource.api;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.w"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/resources/application.properties",
    "chars": 78,
    "preview": "# Spring Security Setting\nsecurity.user.name=yunai\nsecurity.user.password=1024"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/pom.xml",
    "chars": 1285,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java",
    "chars": 296,
    "preview": "package lab2;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBo"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java",
    "chars": 1572,
    "preview": "package lab2.authorization;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.c"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java",
    "chars": 1249,
    "preview": "package lab2.authorization.token;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframe"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java",
    "chars": 908,
    "preview": "package lab2.resource;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java",
    "chars": 354,
    "preview": "package lab2.resource.api;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.we"
  },
  {
    "path": "lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/resources/application.properties",
    "chars": 78,
    "preview": "# Spring Security Setting\nsecurity.user.name=yunai\nsecurity.user.password=1024"
  },
  {
    "path": "lab-02-spring-security-oauth/《芋道 Spring Security OAuth2 入门(新)》.md",
    "chars": 143,
    "preview": "<http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github>\n\n对应 [lab-68](https://github.com/YunaiV/SpringBoot-Labs/t"
  },
  {
    "path": "lab-02-spring-security-oauth/《芋道 Spring Security OAuth2 入门(老)》.md",
    "chars": 68,
    "preview": "<http://www.iocoder.cn/Spring-Security/OAuth2-learning-old/?github>\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/pom.xml",
    "chars": 1605,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java",
    "chars": 330,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java",
    "chars": 1354,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.sp"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java",
    "chars": 1258,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo01Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java",
    "chars": 672,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo01Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java",
    "chars": 879,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo04Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 01 的 Message 消息\n */\npublic class Demo01Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 04 的 Message 消息\n */\npublic class Demo04Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java",
    "chars": 1122,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo01Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04Producer.java",
    "chars": 780,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo04Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/resources/application.yaml",
    "chars": 1255,
    "preview": "spring:\n  # Kafka 配置项,对应 KafkaProperties 配置类\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/main/resources/application_bak.yaml",
    "chars": 1665,
    "preview": "spring:\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔\n    # Kafka Producer 配置项\n    pr"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java",
    "chars": 47,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01ProducerTest.java",
    "chars": 2790,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo04ProducerTest.java",
    "chars": 1575,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/pom.xml",
    "chars": 1609,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java",
    "chars": 330,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo08Consumer.java",
    "chars": 870,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo08Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo08Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 08 的 Message 消息\n */\npublic class Demo08Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08Producer.java",
    "chars": 845,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo08Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/src/main/resources/application.yaml",
    "chars": 1339,
    "preview": "spring:\n  # Kafka 配置项,对应 KafkaProperties 配置类\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java",
    "chars": 47,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-ack/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo08ProducerTest.java",
    "chars": 1201,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/pom.xml",
    "chars": 1611,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java",
    "chars": 330,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java",
    "chars": 672,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo02Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 01 的 Message 消息\n */\npublic class Demo02Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java",
    "chars": 774,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo02Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/src/main/resources/application.yaml",
    "chars": 1489,
    "preview": "spring:\n  # Kafka 配置项,对应 KafkaProperties 配置类\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java",
    "chars": 47,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java",
    "chars": 1689,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/pom.xml",
    "chars": 1619,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java",
    "chars": 330,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo02Consumer.java",
    "chars": 711,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo02Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo02Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 01 的 Message 消息\n */\npublic class Demo02Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02Producer.java",
    "chars": 774,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo02Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/src/main/resources/application.yaml",
    "chars": 1741,
    "preview": "spring:\n  # Kafka 配置项,对应 KafkaProperties 配置类\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java",
    "chars": 47,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-batch-consume/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo02ProducerTest.java",
    "chars": 1689,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/pom.xml",
    "chars": 1615,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java",
    "chars": 330,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo05Consumer.java",
    "chars": 716,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo05Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo05Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 05 的 Message 消息\n */\npublic class Demo05Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05Producer.java",
    "chars": 780,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo05Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/src/main/resources/application.yaml",
    "chars": 1251,
    "preview": "spring:\n  # Kafka 配置项,对应 KafkaProperties 配置类\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java",
    "chars": 47,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-broadcast/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo05ProducerTest.java",
    "chars": 1262,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/pom.xml",
    "chars": 1617,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java",
    "chars": 330,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo06Consumer.java",
    "chars": 703,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo06Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo06Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 06 的 Message 消息\n */\npublic class Demo06Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06Producer.java",
    "chars": 1164,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo06Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/src/main/resources/application.yaml",
    "chars": 1255,
    "preview": "spring:\n  # Kafka 配置项,对应 KafkaProperties 配置类\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java",
    "chars": 47,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-concurrency/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo06ProducerTest.java",
    "chars": 1600,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/pom.xml",
    "chars": 1617,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java",
    "chars": 330,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo07Consumer.java",
    "chars": 672,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.consumer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo07Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo07Message.java",
    "chars": 506,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.message;\n\n/**\n * 示例 07 的 Message 消息\n */\npublic class Demo07Message {\n\n    "
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07Producer.java",
    "chars": 2007,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.message.Demo07Mess"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application.yaml",
    "chars": 1363,
    "preview": "spring:\n  # Kafka 配置项,对应 KafkaProperties 配置类\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/main/resources/application_bak.yaml",
    "chars": 1683,
    "preview": "spring:\n  kafka:\n    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔\n    # Kafka Producer 配置项\n    pr"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/package-info.java",
    "chars": 47,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-demo-transaction/src/test/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo07ProducerTest.java",
    "chars": 1854,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo.producer;\n\nimport cn.iocoder.springboot.lab03.kafkademo.Application;\nimpor"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-native/pom.xml",
    "chars": 857,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ConsumerMain.java",
    "chars": 2119,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.apache.kafka.clients.consumer.Consumer;\nimport org.apache.kaf"
  },
  {
    "path": "lab-03-kafka/lab-03-kafka-native/src/main/java/cn/iocoder/springboot/lab03/kafkademo/ProducerMain.java",
    "chars": 2042,
    "preview": "package cn.iocoder.springboot.lab03.kafkademo;\n\nimport org.apache.kafka.clients.producer.KafkaProducer;\nimport org.apach"
  },
  {
    "path": "lab-03-kafka/pom.xml",
    "chars": 1063,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-03-kafka/《芋道 Spring Boot 消息队列 Kafka 入门》.md",
    "chars": 50,
    "preview": "<http://www.iocoder.cn/Spring-Boot/Kafka/?github>\n"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/pom.xml",
    "chars": 1075,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java",
    "chars": 333,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springf"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java",
    "chars": 2113,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.config;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo07"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07Consumer.java",
    "chars": 799,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo07DeadConsumer.java",
    "chars": 711,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo07Message.java",
    "chars": 840,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.message;\n\nimport java.io.Serializable;\n\npublic class Demo07Message impl"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07Producer.java",
    "chars": 681,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.producer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/main/resources/application.yaml",
    "chars": 618,
    "preview": "spring:\n  # RabbitMQ 配置项,对应 RabbitProperties 配置类\n  rabbitmq:\n    host: 127.0.0.1 # RabbitMQ 服务的地址\n    port: 5672 # Rabbi"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/package-info.java",
    "chars": 50,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo;\n"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-consume-retry/src/test/java/cn/iocoder/springboot/lab04/rabbitmqdemo/producer/Demo07ProducerTest.java",
    "chars": 984,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.producer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.Application;"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/pom.xml",
    "chars": 1066,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/Application.java",
    "chars": 416,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springf"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/config/RabbitConfig.java",
    "chars": 5029,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.config;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo01"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo01Consumer.java",
    "chars": 917,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo02Consumer.java",
    "chars": 696,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerA.java",
    "chars": 699,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo03ConsumerB.java",
    "chars": 699,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/consumer/Demo04Consumer.java",
    "chars": 917,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.consumer;\n\nimport cn.iocoder.springboot.lab04.rabbitmqdemo.message.Demo"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo01Message.java",
    "chars": 666,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.message;\n\nimport java.io.Serializable;\n\npublic class Demo01Message impl"
  },
  {
    "path": "lab-04-rabbitmq/lab-04-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab04/rabbitmqdemo/message/Demo02Message.java",
    "chars": 660,
    "preview": "package cn.iocoder.springboot.lab04.rabbitmqdemo.message;\n\nimport java.io.Serializable;\n\npublic class Demo02Message impl"
  }
]

// ... and 3313 more files (download for full content)

About this extraction

This page contains the full source code of the yudaocode/SpringBoot-Labs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3513 files (3.4 MB), approximately 1.2M tokens, and a symbol index with 6618 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!