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 岁头发茂密的可爱小男孩,希望大佬能够**一键三连**。

> **亲,一键三连啊**
# 交流群
扫码如下**二维码**,回复「艿艿」关键字。
可以添加 18 岁的我为好友,并拉你进一个~~交流~~**装逼群**。

😈 等后面,艿艿**头发**重新长一点出来,给旁友们录制点视频哈!
# 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
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
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.