From 48039923fefd971b2a35418e3d0393b48e7582ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Tue, 8 Jan 2019 17:02:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A1=B9=E7=9B=AE=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- pictures/boot-dubbo-common.png | Bin 0 -> 7228 bytes pictures/boot-dubbo-consumer1.png | Bin 0 -> 12683 bytes pictures/boot-dubbo-provider.png | Bin 0 -> 11977 bytes pictures/druid-status.png | Bin 0 -> 27704 bytes pictures/rabbitmq-common.png | Bin 0 -> 8409 bytes pictures/rabbitmq-consumer.png | Bin 0 -> 12127 bytes pictures/rabbitmq-producer.png | Bin 0 -> 10344 bytes pictures/spring-boot-base.png | Bin 0 -> 14800 bytes pictures/spring-boot-data-jpa.png | Bin 0 -> 18203 bytes pictures/spring-boot-dependencies.png | Bin 0 -> 86230 bytes pictures/spring-boot-druid 控制台.png | Bin 0 -> 50052 bytes pictures/spring-boot-druid-mybatis.png | Bin 0 -> 20498 bytes pictures/spring-boot-dubbo.png | Bin 0 -> 11282 bytes pictures/spring-boot-jsp.png | Bin 0 -> 16065 bytes pictures/spring-boot-memcached.png | Bin 0 -> 15965 bytes pictures/spring-boot-mongodb.png | Bin 0 -> 18865 bytes pictures/spring-boot-mybatis.png | Bin 0 -> 21534 bytes pictures/spring-boot-rabbitmq.png | Bin 0 -> 11562 bytes pictures/spring-boot-redis.png | Bin 0 -> 17299 bytes pictures/spring-boot-servlet.png | Bin 0 -> 17179 bytes pictures/spring-boot-tomcat.png | Bin 0 -> 15593 bytes pictures/spring-boot-websocket.png | Bin 0 -> 17749 bytes spring-boot/spring-boot-base/README.md | 247 ++++++++++ spring-boot/spring-boot-base/pom.xml | 1 + .../SpringBootBaseApplication.java | 3 +- spring-boot/spring-boot-data-jpa/README.md | 193 ++++++++ .../src/main/resources/application.yml | 2 +- .../spring-boot-druid-mybatis/README.md | 196 ++++++++ .../src/main/resources/application.yml | 63 ++- spring-boot/spring-boot-dubbo/README.md | 348 ++++++++++++++ .../src/main/resources/application.yml | 7 +- .../src/main/resources/application.yml | 4 +- spring-boot/spring-boot-jsp/README.md | 84 ++++ spring-boot/spring-boot-jsp/pom.xml | 1 + spring-boot/spring-boot-memcached/README.md | 148 ++++++ spring-boot/spring-boot-memcached/pom.xml | 2 +- spring-boot/spring-boot-mongodb/README.md | 182 +++++++ spring-boot/spring-boot-mybatis/README.md | 249 ++++++++++ .../springboot/dao/ProgrammerDao.java | 2 - .../springboot/dao/ProgrammerMapper.java | 2 - .../src/main/resources/application.yml | 48 +- spring-boot/spring-boot-rabbitmq/README.md | 390 +++++++++++++++ spring-boot/spring-boot-redis/README.md | 444 ++++++++++++++++++ .../src/main/resources/application.yml | 4 +- .../springbootredis/RedisObjectTests.java | 2 - spring-boot/spring-boot-servlet/README.md | 230 +++++++++ spring-boot/spring-boot-servlet/pom.xml | 11 +- ...tion.java => CustomServletAnnotation.java} | 2 +- spring-boot/spring-boot-tomcat/README.md | 101 ++++ spring-boot/spring-boot-websocket/README.md | 183 ++++++++ .../springboot/constant/Constant.java | 6 +- .../controller/LoginController.java | 2 - .../springboot/websocket/ChatSocket.java | 16 +- .../springboot/websocket/WebSocketConfig.java | 7 + spring-boot/spring-boot-yml-profile/README.md | 247 ++++++++++ .../src/main/resources/application.yml | 6 +- spring/spring-dubbo-annotation/README.md | 2 +- spring/spring-dubbo/README.md | 2 +- spring/spring-websocket-annotation/README.md | 2 +- spring/spring-websocket/README.md | 2 +- 61 files changed, 3345 insertions(+), 100 deletions(-) create mode 100644 pictures/boot-dubbo-common.png create mode 100644 pictures/boot-dubbo-consumer1.png create mode 100644 pictures/boot-dubbo-provider.png create mode 100644 pictures/druid-status.png create mode 100644 pictures/rabbitmq-common.png create mode 100644 pictures/rabbitmq-consumer.png create mode 100644 pictures/rabbitmq-producer.png create mode 100644 pictures/spring-boot-base.png create mode 100644 pictures/spring-boot-data-jpa.png create mode 100644 pictures/spring-boot-dependencies.png create mode 100644 pictures/spring-boot-druid 控制台.png create mode 100644 pictures/spring-boot-druid-mybatis.png create mode 100644 pictures/spring-boot-dubbo.png create mode 100644 pictures/spring-boot-jsp.png create mode 100644 pictures/spring-boot-memcached.png create mode 100644 pictures/spring-boot-mongodb.png create mode 100644 pictures/spring-boot-mybatis.png create mode 100644 pictures/spring-boot-rabbitmq.png create mode 100644 pictures/spring-boot-redis.png create mode 100644 pictures/spring-boot-servlet.png create mode 100644 pictures/spring-boot-tomcat.png create mode 100644 pictures/spring-boot-websocket.png create mode 100644 spring-boot/spring-boot-base/README.md create mode 100644 spring-boot/spring-boot-data-jpa/README.md create mode 100644 spring-boot/spring-boot-druid-mybatis/README.md create mode 100644 spring-boot/spring-boot-dubbo/README.md create mode 100644 spring-boot/spring-boot-jsp/README.md create mode 100644 spring-boot/spring-boot-memcached/README.md create mode 100644 spring-boot/spring-boot-mongodb/README.md create mode 100644 spring-boot/spring-boot-mybatis/README.md create mode 100644 spring-boot/spring-boot-rabbitmq/README.md create mode 100644 spring-boot/spring-boot-redis/README.md create mode 100644 spring-boot/spring-boot-servlet/README.md rename spring-boot/spring-boot-servlet/src/main/java/com/heibaiying/springbootservlet/servlet/{CustomServletAnnation.java => CustomServletAnnotation.java} (92%) create mode 100644 spring-boot/spring-boot-tomcat/README.md create mode 100644 spring-boot/spring-boot-websocket/README.md create mode 100644 spring-boot/spring-boot-yml-profile/README.md diff --git a/README.md b/README.md index 21a0576..7371704 100644 --- a/README.md +++ b/README.md @@ -45,9 +45,9 @@ spring-cloud:Finchley.SR2 | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | [spring-boot-base](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-base) | spring-boot 基础 | [spring boot 官方文档](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/)
[spring boot 中文官方文档](https://www.breakyizhan.com/springboot/3028.html) | | [spring-boot-yml-profile](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-yml-profile) | yml 语法和多配置切换 | [Using YAML Instead of Properties](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-external-config-yaml) | -| [spring-boot-servlet](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-servlet) | 整合servlet 3.0 | [Embedded Servlet Container Support](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-embedded-container) | | [spring-boot-tomcat](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-tomcat) | spring-boot 整合外部容器(tomcat) | [Use Another Web Server](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#howto-use-another-web-server) | -| [spring-boot-jsp](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-jsp) | spring-boot 整合 jsp | [JSP Limitations](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-jsp-limitations) | +| [spring-boot-servlet](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-servlet) | 整合servlet 3.0 | [Embedded Servlet Container Support](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-embedded-container) | +| [spring-boot-jsp](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-jsp) | spring-boot 内置容器整合 jsp | [JSP Limitations](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot-features-jsp-limitations) | | [spring-boot-data-jpa](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-jsp) | spring-boot data jpa 的使用 | [Spring Data JPA](https://docs.spring.io/spring-data/jpa/docs/2.1.3.RELEASE/reference/html/) | | [spring-boot-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-mybatis) | spring-boot 整合 mybatis
boot 2.x 内置HikariDataSources数据源的配置 | [Mybatis-Spring](http://www.mybatis.org/spring/zh/index.html)
[Mybatis-Spring-Boot-Autoconfigure](http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/) | | [spring-boot-druid-mybtais](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-druid-mybatis) | spring-boot 整合druid、mybatis | [Alibaba druid](https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)
[druid-spring-boot-starter](https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter) | diff --git a/pictures/boot-dubbo-common.png b/pictures/boot-dubbo-common.png new file mode 100644 index 0000000000000000000000000000000000000000..690723821b3ac0f04811bf521e82aea689e57a21 GIT binary patch literal 7228 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 literal 0 HcmV?d00001 diff --git a/pictures/boot-dubbo-consumer1.png b/pictures/boot-dubbo-consumer1.png new file mode 100644 index 0000000000000000000000000000000000000000..79513a926053196b8fa0071ed1f5b206bcb3dd80 GIT binary patch literal 12683 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 LkuH61{Neur(AxkC literal 0 HcmV?d00001 diff --git a/pictures/boot-dubbo-provider.png b/pictures/boot-dubbo-provider.png new file mode 100644 index 0000000000000000000000000000000000000000..30d59636c2f46c8ae31695242920ed58e46fbce9 GIT binary patch literal 11977 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 E0QoJNWdHyG literal 0 HcmV?d00001 diff --git a/pictures/druid-status.png b/pictures/druid-status.png new file mode 100644 index 0000000000000000000000000000000000000000..44bd7f9923af79911a85fc665aae17f376ad5661 GIT binary patch literal 27704 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 literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-data-jpa.png b/pictures/spring-boot-data-jpa.png new file mode 100644 index 0000000000000000000000000000000000000000..8d41d0ac3684a8ad218802cdeae8b1e300245e77 GIT binary patch literal 18203 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�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 literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-druid-mybatis.png b/pictures/spring-boot-druid-mybatis.png new file mode 100644 index 0000000000000000000000000000000000000000..5846607e9eeb2141bcec08d114de0ccd647c93b3 GIT binary patch literal 20498 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 L_9VK}8k_tNn)y$I literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-dubbo.png b/pictures/spring-boot-dubbo.png new file mode 100644 index 0000000000000000000000000000000000000000..9992f1c0bd679ece068180f0259b67685da21022 GIT binary patch literal 11282 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 WYwV*LUF7$?fDe)i;8F=A|NjQ0KkqvL literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-jsp.png b/pictures/spring-boot-jsp.png new file mode 100644 index 0000000000000000000000000000000000000000..93f6a6780600153a5117438e8ee1ee25871e9cdc GIT binary patch literal 16065 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 literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-memcached.png b/pictures/spring-boot-memcached.png new file mode 100644 index 0000000000000000000000000000000000000000..9838e54d699e544b1b449e4b4ac2b63f0b056a11 GIT binary patch literal 15965 zcma*O1z1#Hv^G8nNOyNihagCUG%DRFB?tln15!f{&CsGCDm|!_lynXZDJWe^4&B`` z^FRFV{oniD`o7Ea%)_2D=j@oZ_q*15-!-xNx|$?}jD#Q%h~%-Bnjr{;6#~4H@b3aw z-fB6m0RIR)v@EVFboKtmsq}7dc zRKmTI9`^CAL?C9$%K6^TX8OIShpjdbvfG>f?uGaXE21}>wt|UfXJ}(lB|O4fVij}Sg(`$c`S^WryvRn9XzNnf1i^*xFSMD*=1#JW}S3+=reV1 zb#){fvMv0bPgL_FuFgY9^XmRP*PKDCtv&&d<`HelySRy#6@?H9uH(cb#pNbYTGDBVW!K&5>Y!KK*EA`0jlO z{=KToUPU=xH!`zyk<il>@-H<7kW->w&?dr`vz>FOUj>r@3`?QdM&#@9JN( z^!4|5*lhX68W@3^=AKbl*DaRXk38(V^l4g7KHJ(aD2EpWAdQp+=a6FKim4Cbe`8$) zyNbfkCSTVvWWO8CEn9y{-H~aVGBhM;B4(>)yR?Ek~GTJ#ulbBzB zzkJ?cGdkCE8TX1JSWOsGdk2#LbnaF7$%YZzbcieD0MBW@T+#F57 z{B$H{t}v$ySaCD!1MlSLd(w6x8UZ&UPUK2T!uh=R&mK!9<$R8LoKKdQ-$FJ@E3Ecs z{pZJMUuJoe=!@b{QE1hjb!iWRM=y(=C`CAihLhq~(jL9y)$KLX?BgYH`25%c+Wdu? zXf1wfb~yQP<>)>^!Iz@1hhowm3z1``fpm7m+m!xFyp;v&E@sr4`OQJZjaS{a!$|Q| z{J*0l&u%h>@X4=k$7V`jyyVjZo9L?A6jX=AtvvqK!RmUVdB%SVu}hZv(1@w*`8GLd z&g&=D0aXF%dgnGgm)R?T|4o$DP4p`BYds!_ExQv4=7VcoAFclGh$NswcCo>zZwRP( z)NaJ-#e-X>$ZQ8TAA0-wyzp{CG5@KucoUXBH z@$p1{Ws#Cz|zOYAej%MHc7m~MjrC3?<0TAwK~;mU~Ouibrp@&67AtO-bjy$ zM#u9AeDzHitpf%3P@P(p=KyHZrrZXf?g{bsd%BfVt=&$5F|B4cJKM-zJy>TE&26>j zMC|^I`ZzI}G|SudWzER#Fi1|wNG+k&k7N7v0tJUw2Bid9f3WwzH}vP-fQ%;L8n<vX8aHYPc^-OgLgpnQJ z??p8KkNQ0)E$f^6yOcQi$UE}iikXLvh{Z;gWN+f!9?YIRGu-T{W_U~LCc_%2g)tvK z6aoOjfFn8e?CjKGX5z4iHE!e8v2pTcMCRPXlwd)n{Pi4Vct}r9zq8gG0VDlzvHY}# zarKmV-}m3_HV>9kFuD0p@89hi{xg#2-_terWZcPTM1fCKhSbCjW?eoUa~R0;^XgNA zbKmhn(UP>aA*n-}p*Qu&EYC=m$nU-^cG(;1NXlQ?N=*3PxnIBDlYf`I8KKTfqxU(E zf6>V#=gIxMbi+{olO>Z&s7ie#Hp}y`!R|Y4VNdUfoZ5`+6s(GMy&H`Gsx7&evz+<5 zCgVDDoiFz+TIFbQ7XXjwmtS)F)GZxS&qvC93L&-XpH(cBu&prM2wSM=B}khp`NgZI z^PhT@?gHB_naZ=-Jib^NnRj@gKu4*I! zEBTm>i62Z2C;WBs-wXc!oSdQN>;^cy6;R!C_bx3Up#;7lk?bbj_G>i?Y1xfxkn!P^CP&HvD&@Vm zlp_UZ1#If2IAY^dirgieEMYchJ;07j7r^a2qex!0DlOAS6ZNYhD76;G7!Y z3PrvyVp;G0lZ=!UaNJf0rOk}aWHlRr*FRmzp?kU2UlpUZlvYA|63(f>?=28Z(2&?N z4sM?8nZyqR@hF3`iJQ^)yZmG}y;N6ZsG-NssphpF6n#%GJq;x9m_m;c)cg5OP=Rl{ zeHC6PQthrWv^#TZ25naePUCyM6Q|Ro5%uE|ji2edr+H9vtEU?f`%5wquV4RJH?K?% z!Oxvb>|&B-o5lB|{IwC%yitd9`rOS~UWKB|-(C*5RJR+HwP|Xzih>*O?P3g=i1<>uU2e2e`f82 zNif8n!)JEGhyIOpT3Eewhu6~nMZ{H49rKrMA3VE09BWT~GQ~@zACj!wQ{?*5T zj?qZogCzVu!x3#-etrwCFe<*uD6AD{dj0f>HPx>!-+l{gW9XZ9yREyH_6o%QimaFJ zAuiU?#w!7w7vihJ<(=6de5;xDZD!J-u>}DGyd;a6)V+cBXJJGmXAMEJYv}CG{6v|r zM)?|NE~0u9h(Wfud#4u7SXXP`HKs+O^x0&C_Y6L{$MJWn#Q|Q)31Lop6||$o95?f+ zQvP6;-GcMhth=3lC(GU#)u866@8ok#AqY0#CWSg^TUv=yC!+wo{^=2IhfE13Ry{`| zQADt3?8B0@4A?N7$fJRSCMkl?qA-D6&rWa6Gc|SoeL7rkm=M*H7o_&H-)5J#Y6a}w zHKY54n!~ETf6)F8P9BcK2eEZ0=P;WFveqDjb4B;Qauo=e_@}X+fOys>2PgdapSJlz zEG(Kfr$=u1vF?LoclFMd(XVsu54Iz3P(eU zCO;Y*8~Z}|5(E-tRHuMX;TRKY)q_U|VAKdkxRH?<9JR@`f8j3I%&iBG&9Y`5#~^AD+|K4m`Wv4zM{ zkoZNj9&G)53Xx;GtEr~?rBLIV7|hGb*bEoAj$)YGRZY|%C2{0oX;=+?v(;BJkPY+?__Lz zJg>C0^!}S5qj9Rx`9&4|Rs*H#Qic%YAIL0MyX1NMv{Qd)}yL27A&_y5&jv*>lDaZM_y5{*)HJIUjBojvT6WY^x!h_%cmSaZr|B z5l#%&qa1LzT2To;;c>lV3l{%cO+rDTc`blzavZjd+WvO0q61s6>u)bxpx96r?A-zk zk^5<3o0`JM3~K-G@#yHcn3A%uRmkR!01Ake3^7 zbC&MDn1WiWAoBqo;cG6n6fbeL)IjEg{|H|H{dOlNf?{3i^bFLOBX9x^XG^&OND#>D zgFV*iP3+tEH5}5`z!EpuAzqZcNUcGWEXt2mbR%tECLL#Ww(iPvM^Fq`v?FGORe}o! za`(m4m=&iBbrd7l2D5zl!d7scvivwlNF)NbXhVOt8*c-?xXvatYDil?8`RqG0k zQi^}WGNS`)i-GYE{q0Ft#T=Qv%Lh<60yk6%mwnMZ7uq^n25Op@Rr(&9AO)3%{?G zUjdXQu`0`@?&7;eM~U=!>o(dGw)y100W$ToTW`@3b*52VECx-Fc{^v5|2|swq19^% z${UGc%wu&>_J`V$pE_3Uc4^+C?dQCMpV%u=^^XGDCO5@;7fEEg3CZ zsNV!~wPOz+z4kL~HH8R?NXY2?On+|H?r@MRX_+GAA^8)NS8C$Xc4tzcA@ft8ewYZ3 zM2!FDq;Qy3Ea<2PiLK=FyKmiqQOws_>Q0QAiG2R$2fN&6*|)5U)d8uGE+sBsd%iG% zFm0sA^8AYzSaWB-u^%?iSwU~?-p=al89ogcEtcWR;kp`V&Qo~V7l z(ENsgn}i>)?|Ee(F8|v(E3)K#0cB4XAwkA81HT&i9m8rbwx4s@G9k(O1C{%0TL0=R z(%@vEm?Y*7QjFsE{$58OSC8TR(7*T!B$ou+%&tDf-)D^ZoM#M~bZ;ZXQSYSnsJ<1{ z`guxb1wYxvoZ*dG{)A}q)XJlaZ-tNi-M-!P&Gn~xD9I)6qHAIaRrQ!GQM4*dmRpW~ zejzc!5ZS*NbEzldo$PS`-HGU**7q%VKQ37F!jZ@v)jy8#JVwa)znntuGRVv z{!zhFKCjPTR^W6rHLJZ*a!hYB(KOR^SfwVHM$Dwu(KfGcUF|0+Jzo8}<<7r^WbzC& zB~xfqY~Pk5R^Gm6CPwBobA`{DeUcsY4YzX8w*$T_m3k37i;Qnl*CJOp_~pl|H4T>a zb*#2BnCr<=ZDqtdacDm-NUdgy(6@=U?L)A~oLiq&UukOmaOkI<+VMqWnQ_=-4TisE zI$_0|i2IbCp+8ZS@HV)x(%;q-m*`6&Z2+cFzjA-HVx@$__DHLa$?@UT!}dSM z(NB~^b*$|?9X8&pno{51eO# zvtG1RQ&`+Rxp2y}6YK%_MRC@ob7x3&9aV}*(m4@*$8;zl#v|$?Ew8buBOMTn$*O>tSjNSH9kp zvfDk+xWDp&>2T};XIvLjFXFUkH0Q zIe&|~^%53oj0_rb`5;k}qh64U%sXE12#DkCQ3VNE^@q5mnHc$%$vru_P%5+5A#?k% zr;oP@8;2Z9ULMjKkOF2Buie`oFWf^k%Z3Ic(6|G^GuR+{&r!ahz!O2wY3|HDDVfR% zgZN7~4(XM(Qz`>r&rUst_?EX#dy|N^wyq<{at`$F*5Hh%y3Om1&M(fnj5*A6)*I2s z%IvbgtjNb2S}M0zKxg~4vTi&?VQ1zR^VHRXyI< zc}ti*^~6n!^YNYLe;|G-^IQ!4G>hl=$%ph^TqD?X2YBLf1roQDY7MIp)5IPGxl9F`MKIZJv0UI*?aZO zQ~OlENb!r@CCz~pqVB+INf=lzK|~G$(bij%=E@knFIgy- z>JXB0@|2FY?PQzQYeUfte>}RO6m!kG%Rg+h)BRa4gqrme#49QAOS>6%UMsP(HTS&; zBjkk4xN5{-*w@aa;8Q&TX>V9g2SR};&1HuV1jtXlmuYAIVEd1GXNWvx>xlt z5F)1K8Is$+PdB$zwwAbO_ySe%{o|W{lBgpb-S<>k@CWlP>;mSQK$`TwIQw%wV0OgD z6hocsKc|1G=b57s{_c~F;Z8ja8C_#e5>);Hg#(`E^ z>JZieKQJs>D(Rfy|A-zwUOkzi+V6k|9WL0+QLa#HUgLf*EhPc|K5sEHG7e2lJnU59 zgrh>EfW-R_7EVNa{o?%4P^j&F*dtpHBMEzr`8ctB@Ne6vEpPYLIM&~gH^?bMX3V(S zROpGbsf76aD^2e2r{|rE06Ww$}y<~B7(E_ z9nyPb%7ex{C;-~XiJ%k~%@9x1>85{kTZUSYbe)E&zj5LP1W)h-)JtXFcuwAh;AMF+ zH6dKu28vkW?Y2{mVNO8OBM`l)h_1dbpT)=ZWJ(qj+W&~KEVO_d$8Uuv)#sr~W2<0H zK~uQUr5b}Bs^Ct~zV|;+h3wIkCU>9_-KG2wsq%k`HursX`{Do~Yiq4C8y$K$1xlml`P95EaP9&y$yR6S$K@Z4HitTf zZJ@vrAOm5L^IRcfmd5z^mCyV6f_Te<@)`#0us+vyrJufSV(qx(_yq*k1_bt;oyDdm znGUOq*xPdLyjJ9GG9iqS!LQ0Sf-x)OSld@8q8__Tte`enh6ZZ7#3ptch;9)`cTKY$ zp7YGUjwuj(q}%V%{*^~=UZkY#dtdMdWSTh{ON+ZEG`yerNO3YsB%SlyS9)Duh1?Jk zTgoSEqAy-mpntKL9oN(n2zuF-c0>e}vZw!;qT>Z1BXW98<7;zSH=e&S%hg|;ok-5< zm}#v>FlgGv``c^p+SvHCF(fFkPmwmH@3R-%S?+NLk=SN!C4(Ed^i7*h(_;}`!;ug6 zZrcyef(t1&4QP$OX@pluWtepR0Yci`$J87FEc;V9_@$eneqV!IhR$zu(47vqG44Ma zbL9eBbBjgk0g@x8YO+c7(8JxA|WnIhT!*j4Crxx6O*b09Hf@-+g!(QWL)X{!|L`sW#W zo;q?C5x~Th0X$1c`!GX)ax=4cgP-4>(8XqRB@?9Nw|K^6t=*`@EMwU+vDEgg)Q**| zmGsYPAk%ge zaI{4sF36mj6d;7a8QBu2RI@hktElWONN}n`pGDe$Du;2}A~lBN8QY0Deo$JA$zh$Q zC|WGMkqLd_zeer+VoH{zk4+EyVT8>Ct8L~We;)vSuNkgBeC%x!WrF8x#$+UYTvXt0 z;G=h~N$QBVkqc!B4K<@57CsY_$YpNkDF?n>{LLra5Ju)K$VglvB@675IR3hswnb}g zdRws5{~hq-s?ax#$0uw*fz+E%6Czije2-9bZ%ZlsWN*^;(+0o%ivR&V1#Y+{3N|15 zE-GIzgegGqEFVLz+IGYn&vDS2NBrg>Pva+d@99+!`<^CkNW^1FW~<>zC=S!vSeH&m+`<=D@Z_PdWe`vD0|}9Jljv=%NwdAFG(#v1tLV4 zQ&j$*|CZ9iRfEyd#f4u&UozlD( z;(Gh3c7>_TLXjCJb0jE-`?H}oJ!j7LjMKH{`|5O;so*?&l+=A6>C5_*Nqb}=#mDtFv8(x#WZv!r3oR+UDR_yp!}iAsgImKKf>3np94Z$!$tzuwv3H^xTZ)U0aN zx*0oye=HoTZIwDv1AN>U^0cWCCQ)w1(^nk0O`2?F0{q&%cH%2%u>+TojqHq0rOEcl zSvp|HAPcu}E#=PmNztpA#H&VMn7HHu2*k2_TMMu|dQS2^kzAcZ*^JKBGheL@WukM_ z85PmZop8SZx_6<2rKkYL-TZ|U%}n;m-36LCd_F&b-h;f@>%T9V!)E+fYgXDuyX z8{SaG8wYSSUu`#^&{}3csc2|dS$uz(H=d6^zSp)IwrMm>-hbJ^kFE%$4Z$8J)WrN< z=9iwj#4J=Hg2NB$61#=#<_JOcZr6|*nSJiooQBmnS4e*LEqi@XMf<7-VXWS16~K^U<24%~B$_?g13I&}gWsKA z@xAwYkCf>Rmb6ocd<1y*KVV5)AOtl?7XRw(gEO<>EMD|0)aw(cOguqA>g$sKbH#mgX27$?Gdw8yClC%1bDgyvL#a5RLAlGrtcNQEc*NzzbCD zPAGc6e{$G#H0!{Jg*qwb|0Z%blFA{{NC5}5t`I`_Jmh4$enkn57XOtg%TERbl&(hK z0?y4H?|^^{1m)iYc;;u>;T&y6tpAVncW&U5`oD+3CLX07#RUUfC7KnK8{E6tz}%;5LqiJf6ANB zFNS25hb!|&4CV`_W3(?d)GqASkv3*#cvXLxO|H}6;D;GN_?TYTT7>;mCpNrX)!lf~ zv~VOTwIa?q96q`eVfxmGCzuN!B!0~dwX(9RpDMR(pal4Q8NthqUn`opI{odF_lXKk zTDmFmu_nZgb7>#u5tZc%5IiM~Bkjgj&lui(9Vr>bl(=|FK5hLC=&D)#7-o}~aP4Jr zOw(?oSay+?>b_q?lL*H*aJ^HEi?4EzvZrX3olo{PaC2T8QnaL`qyu0v-YB-%quYId zmq$|K+QiIwT!GqfUcDk0iDwIA{X$PY8x`6t>kO)~{+9_ii(eZj|6S~g_i80;84g}t z6phj{`;3c!NEu_M#s&JA$v4d%^{8Kv{n?6}ny3rTgUEg61Z-=AfdWaH;boU-i)?tM zG;=X%)A({B)XWvfwl5c~ma3<{(8pPdm@!$px%`)RVa9}kj$9#}@a-2UHanqxwN$Xs zwQ2%zrB8|$&Cz{FPwk?6S_UXBioUHfvi+yZ=sz@}AEmukaICM^Z9Gw%e}ep?V1&#> z(3B>R6QMbRmZ)w_04|-PQp^K0U1HQ65R`F}y)5~)Ix1B)YhAhMpUb=ue67B^nVy6C zl}2^Gl}07)D;C+-aAUBA30T3|WmV$UYvF?1wE;PVh^0b&R?oD@`AmrA%^P;q>*NzW ztYtKRzNfaXcie!o1bKMVNJ85)io^-mYP0VUR=zWUhnYd^T|;<}a~|9HP4{}%?_bDV z`)CyezzXR-lMtaSP4wCg>(HGKMWEc9SoUR&uL8s^Jnt%4S&FkyFQ^ zYekLB+hiz9E};8WHc9s{oG5>%`nESR^GnP50z}CL+hn8>kWfk|TG&4y-j4k`YGSMI z6MKT9?{fqm;z_{m*bzNN*>`9IQKp`wFoTbA(9ZabxrFCu5xn*}Xy@>%VgAIsuhTr# zHOBM!b##+tx0(y-rw?uJ&J%7TrAs=_^8|m@;P(R(-QH*6 z-JLd~_2{&TT-6Dp&I%-pMnEsG`jHq@Q9SbOXGI!D5Q$7_JF%D_bLq@DJ!^LJjW3Qr zZGUJ#m4FCct2+*49f>s}s9SpUP^_cg2`mp7fw*U2TFicv`Yd=Ys8&YEnBO5kN(T@sIt=ul6o*vDliB}7wvf0#UrPGe^`$*Zl0Qov|}LM!j(d!iTbWuljbbfJe*w;%{YZeeMSk^)|$ zb={1m5XR&nH^kV==LC2lDaR1$KbH{0`+-1qIWz@im;8@yw9W16)I?mmYk30<3|=Q$ zHdkZK>B>ke>TIy+xm-!>e}@Vgr}L8*hyBzi<{}#kY8_< zKnr8Muf$YYR|Y@I5)>%iFo7Z`sVJOLRtoBiDChWteTfUvH$B);MGtzw7%vvH>Xra! zbg+gU<9U33@AliV5k<%$vhKmdyNj|p#{;jaYp*x!Jo};7Hx8%=gIV6N`<7ayMK9wu-r;C7jwXcI+OrB! ztQY{QBfH@>-rc)|CF_FpFda4A?|ei`>@*mF(x9;(e#QQff~FoWd=09A94rR;VO650 z@)GV;+D`*(WKreyaK0ra;CoBFoC2iU3wMa5DHx0l^Z>fn;PO9Xtz&1DDEjlBB00q{ z`6BE;eX0N4+&u(s$Z!*mLBE>$G2*#$9z$?s=&rhbupoEV9M4ONrX5Tp{IktUK>Z4PJSIl*p8EEI?QmjAg;mJ2 z+T$CwgfxU{Z9I9GwJUm6O(>v7s@ZC=z409LboOsJ|0ReW|G~kGBi{aB@q`vn&TipgxgT%xNXDDy z)q5yFnzc(=vw{^bU%YdJ!P<~yfI-ViErmbA$<)62hlHDb9lmNmfjqM2#ZR{TnXH7A zbJO(vvSVetfHA1M0ZKc zL%#beJVZM^u*Tc(6m|Ua?==x%mkLEm+m9vk87JY|9=x^lFg#wp)sqynJ4GRIHEmMlX1@cJpR`K)ho}1 zq1b<*fgbaw4nIpV7^^_fX2=S2p1-0xm9ecK^NWl}NGPr1QiZHq^cc;5YjOE&_VCxb zsCl{r3a+k5F0_yxpm)9W2XtIUdC%AKsF5&VFJGQ$LNVxfimuG7a zu|X{bnOxPwuLKdgq&3OoN1G${UJRdJ&FA?Gd2V@)AaK^i+HX}#gBh%~Uc5?2siA7` zce^rq$WCOAdIK>yM`lU)7u1$^Rp~y_gI6=34t+hp2hI=pJ<8W2;`@xV5dlFJ6r;;P zb0(Kp0u?559p=FK=M|kvbZpRDD|bUK74v@IWO+JssU-7bPU+_8c_0?onOZgoy*xgt{0&#UD<&|ZTCf^^X!Qqe&u)3j_V?%C3c zO>Z*H+DTP%x2L~m{+;P>fi72OjeXdJ?s$11v)(VW9V)gLzZDE+r=^GsYB!`!-fo^+tQr8E2$AY4t7-wV21doTWn;W1Y3 z**fo3%Nf4!o_(<(~B`DKC3YpzDQC|tyhD}4gF5NtxbIAETF4nWA zl4v@6u<}43OSiQ)`~nQ1MnbJ%_tm+V^OYA><-so5NVee!XKgvMKK(a8T|-{$q{1vZ zrLtPWEn?Pv4TgAI8A_Htwbb4%EVz$cd+-h+?fd)|5SkfQv-;M9@G_sycVjat@xkEF z)^GBWfEL*?ak|EXY*qiP+qVoaWB=7zg}A>Y$Hm(&A{uCG@2e>DQZ?@^nUD?$`eDQ> zpEiL2=>JxyV-Q(Y;Ca)J!2zAuwP2(MtZyU+Z*%9R;Oo0Sn-3_UGG{bN)|Ud!t}_J+ z<`d17`DIpjLC03I(K&k-i6&k)$g$@IYefZWscy^%Ohb6DT9I-+tqB5`p#3R14B?9f z@iH{al;`ChC^SqIZ@=4y@o@Ne=1&Q7#gkL2m`u8WDLE3T(DmJ_rQ`X7bT8$&GLIEZ>v!A$nRzdaDE>HX2( zsO}xkcV0QAXE%H14V?S6><&?QMZ`As(dq2ltjvg_6qtY-|tK(#{_dzk}|TtiS-9Z+s_ zku9x6Aby{J#-?FQIwx`6KK`_RGa5)=@4=D3gZqLf+p6kLV4Zsp(_V8TUUraWp!dh9 zP#=Y&yX6Jy^fkJRQjbs6vzwBOLXFF4x%0U*2)uC=M z=y@ca-+MPIO_Au=wcp!_o^g#zU{Ac?;T4fkG}v#Pd+5BaIcuW~p&kS`v*|odSEtdc z?1|VD3YH6qOs2-3pvub8zRc-9;3k3C-XexB}?c=NHJWgFN;+2m=YOyEov*@x)r zD^YxvK8`hl=}7|EE7;|J4~|I0#lkPMMra$&R;%aaQai!5{zo^vWW4zXUKpL?{6_Q7<@t0zTEd}YgQ|}W&;&kvSA{;7vLR!?SkL*PYF&l@>*x=95I&j+&u^{bu#ZSgTssb>IaD1~97 zx6CBmG!@!b6VyWhYQy$RK+fsmfj|#5=0i^~5InTU<%8=>C#ABW3mSI@PnHnzKq1z8 zRXN4CFrX^4Y@e-u-~W96$uM4MetK)$Q_OsUbihXZ{trQ$kSNToR|>#pX?_3N@o966K zwIM$%wk}xRf2hLWR8bb*zo=Y7778c<@kBbhM$28BCm;}!rH<}LP}?(HJRy(Lch4WB z-4>)c5s#E6S{sjj=9p^aoF;?cjsc|FN)R+7XoHmXq}RG3SI#PX3y+g7tYAI>`$tFk zj}akBb+uGYAlXi~{y>O1ehwxUH6pwg<|>O9IArTb5Fcw?XZP;2aQrI+#F1EkQ&VU< zSaS6+kJeX6tgG(5K2XG*NBP94mC>1yfBlY2$?O7qHtaC3(0xr?;%h$Z4m9W@en0i? zWsM7IwFfetRr=H?RtmH2)~Ok<;K7ruzfa<6e*xSD1qDqjoaMj|FVOSwSHZGpBCi7oI*iug<=aDPN%HL@j;pzw~v~$(IDXgIy$cMPZ+0*v;Q*a z=wb-Z_|qQ7!VJy4qYyLlR6yrMP=`JgO$WjAxwvN^?c?eLTKI}po`cw{Nq$$fEjo`2 zwHZtYU_H02=CZ8>{hqGoWZXhMo^W)90(H^)Krg|Q+4be^KTKst0)m0^URyBoS&VGj z)A9oim@-|X>u~-tVUrb?q1Zo#1Zmc{j~RGJDP5^}Oa|IMma%>+FmQU0$Gn7jf2`oX zsQa@!P4`yQ)jm_u?X=O&qSYQtR$CFK#soCRvx&oq^VfHm z1}9oBNXw}^7lBg3>E(zAJZb6{Z2drCYZq&3d=-reDbr?M)Pgrp|Jq3Jb`5Yy>@->e zX}&vT=o8U}n?Bk?hFL@H&L~*^&PDww96EKxQ3nyFTf?L8lkgG+cf8UIwU(eGTgKA(i93h)sYOA}5#{2kq9j$`?)< z{FcC)WcHWXMEeJGR*>@xy4$7f?;nZYc{GNg2`~aec8$EqQo0owW*02l?gq$-Wq7om zrB|;PMCrv2zsVoR!3w3RfwH$Q7?Y;mfFG2+E(qw_wzD_m{_FN7|8*J)15dt2B%54R yeh^zzCJa^$;NP0O0>$tG%?h&;fW5mIyfX1{D*dshIpC+^pvUUEYGo?6;r}1EvQr`e literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-mongodb.png b/pictures/spring-boot-mongodb.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb91b56870ce358a44207c449a08067f3f05e08 GIT binary patch literal 18865 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 literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-mybatis.png b/pictures/spring-boot-mybatis.png new file mode 100644 index 0000000000000000000000000000000000000000..2c20680bcf37e878a4de48b8d61f20afb3ebb91b GIT binary patch literal 21534 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

+ + +``` + +#### 4.2 thymeleaf + +```java +/** + * @author : heibaiying + * @description : 跳转渲染模板引擎 默认模板的存放位置为classpath:templates + */ +@Controller +@RequestMapping("thymeleaf") +public class ThymeleafController { + + @RequestMapping("show") + private String programmerShow(ModelMap modelMap) { + List programmerList = new ArrayList<>(); + programmerList.add(new Programmer("xiaoming", 12, 100000.00f, LocalDate.of(2019, Month.AUGUST, 2))); + programmerList.add(new Programmer("xiaohong", 23, 900000.00f, LocalDate.of(2013, Month.FEBRUARY, 2))); + modelMap.addAttribute("programmers", programmerList); + return "leafShow"; + } +} + +``` + +```html + + + + + thymeleaf模板引擎 + + +
    +
  • + 姓名: + 薪水: +
  • +
+ + +``` + +#### 4.3 文档说明 + +freemarker:提供了完善的中文文档,地址 http://freemarker.foofun.cn/ + +thymeleaf:官方英文文档地址:[thymeleaf 3.0.11RELEASE](https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.pdf) + +注:我在本仓库中也上传了一份[thymeleaf中文文档(gangzi828(刘明刚 译)](https://github.com/heibaiying/spring-samples-for-all/tree/master/referenced%20documents),翻译的版本为3.0.5RELEASE \ No newline at end of file diff --git a/spring-boot/spring-boot-base/pom.xml b/spring-boot/spring-boot-base/pom.xml index 9c2aaa8..c8137e9 100644 --- a/spring-boot/spring-boot-base/pom.xml +++ b/spring-boot/spring-boot-base/pom.xml @@ -47,6 +47,7 @@ + diff --git a/spring-boot/spring-boot-base/src/main/java/com/heibaiying/springbootbase/SpringBootBaseApplication.java b/spring-boot/spring-boot-base/src/main/java/com/heibaiying/springbootbase/SpringBootBaseApplication.java index 547f498..ac395d7 100644 --- a/spring-boot/spring-boot-base/src/main/java/com/heibaiying/springbootbase/SpringBootBaseApplication.java +++ b/spring-boot/spring-boot-base/src/main/java/com/heibaiying/springbootbase/SpringBootBaseApplication.java @@ -6,7 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootBaseApplication { - // 启动器默认开启包扫描,扫描与主程序所在包及其子包,对于本工程而言 默认扫描 com.heibaiying.springbootbase + /*@SpringBootApplication 注解是一个复合注解,里面包含了@ComponentScan注解 + 默认开启包扫描,扫描与主程序所在包及其子包,对于本工程而言 默认扫描 com.heibaiying.springbootbase*/ public static void main(String[] args) { SpringApplication.run(SpringBootBaseApplication.class, args); } diff --git a/spring-boot/spring-boot-data-jpa/README.md b/spring-boot/spring-boot-data-jpa/README.md new file mode 100644 index 0000000..2239e05 --- /dev/null +++ b/spring-boot/spring-boot-data-jpa/README.md @@ -0,0 +1,193 @@ +# spring boot data jpa + +## 一、说明 + +#### 1.1 项目结构 + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-data-jpa.png) + +#### 1.2 项目主要依赖 + +```xml + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + mysql + mysql-connector-java + 8.0.13 + + + + org.springframework.boot + spring-boot-starter-test + test + + +``` + +## 二、data jpa 的使用 + +#### 2.1 在application.yml 中配置数据源 + +```yaml +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + jpa: + hibernate: + ddl-auto: update + #Hibernate默认创建的表是myisam引擎,可以用以下方式指定为使用innodb创建表 + database-platform: org.hibernate.dialect.MySQL57Dialect + show-sql: true +``` + +#### 2.2 新建查询接口 + +```java +/** + * @author : heibaiying + * @description : 查询接口继承自CrudRepository,CrudRepository 默认定义了部分增删改查方法 + */ +public interface ProgRepository extends CrudRepository { + + /* + * 方法名遵循命名规范的查询 更多命名规范可以参考官方文档所列出的这张表格 + */ + List findAllByName(String name); + + /* + *分页排序查询 + */ + Page findAll(Pageable pageable); + + + /* + * 占位符查询 + */ + @Query(value = "select u from Programmer u where u.name = ?1 or u.salary = ?2") + List findByConditionAndOrder(String name, float salary, Sort.Order order); + + + /* + * 传入参数名称 + */ + @Query("select u from Programmer u where u.name = :name or u.age = :age") + Programmer findByParam(@Param("name") String name, + @Param("age") int age); +} + +``` + +关于查询方法遵循的命名规范和关键词见下表: + +| Keyword | Sample | JPQL snippet | +| ------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| `And` | `findByLastnameAndFirstname` | `… where x.lastname = ?1 and x.firstname = ?2` | +| `Or` | `findByLastnameOrFirstname` | `… where x.lastname = ?1 or x.firstname = ?2` | +| `Is,Equals` | `findByFirstname`,`findByFirstnameIs`,
`findByFirstnameEquals` | `… where x.firstname = ?1` | +| `Between` | `findByStartDateBetween` | `… where x.startDate between ?1 and ?2` | +| `LessThan` | `findByAgeLessThan` | `… where x.age < ?1` | +| `LessThanEqual` | `findByAgeLessThanEqual` | `… where x.age <= ?1` | +| `GreaterThan` | `findByAgeGreaterThan` | `… where x.age > ?1` | +| `GreaterThanEqual` | `findByAgeGreaterThanEqual` | `… where x.age >= ?1` | +| `After` | `findByStartDateAfter` | `… where x.startDate > ?1` | +| `Before` | `findByStartDateBefore` | `… where x.startDate < ?1` | +| `IsNull` | `findByAgeIsNull` | `… where x.age is null` | +| `IsNotNull,NotNull` | `findByAge(Is)NotNull` | `… where x.age not null` | +| `Like` | `findByFirstnameLike` | `… where x.firstname like ?1` | +| `NotLike` | `findByFirstnameNotLike` | `… where x.firstname not like ?1` | +| `StartingWith` | `findByFirstnameStartingWith` | `… where x.firstname like ?1`(parameter bound with appended `%`) | +| `EndingWith` | `findByFirstnameEndingWith` | `… where x.firstname like ?1`(parameter bound with prepended `%`) | +| `Containing` | `findByFirstnameContaining` | `… where x.firstname like ?1`(parameter bound wrapped in `%`) | +| `OrderBy` | `findByAgeOrderByLastnameDesc` | `… where x.age = ?1 order by x.lastname desc` | +| `Not` | `findByLastnameNot` | `… where x.lastname <> ?1` | +| `In` | `findByAgeIn(Collection ages)` | `… where x.age in ?1` | +| `NotIn` | `findByAgeNotIn(Collection ages)` | `… where x.age not in ?1` | +| `True` | `findByActiveTrue()` | `… where x.active = true` | +| `False` | `findByActiveFalse()` | `… where x.active = false` | +| `IgnoreCase` | `findByFirstnameIgnoreCase` | `… where UPPER(x.firstame) = UPPER(?1)` | + +#### 2.3 测试类 + +```java +@RunWith(SpringRunner.class) +@SpringBootTest +public class DataJPATests { + + @Autowired + private ProgRepository repository; + + /** + * 保存数据测试 + */ + @Test + public void save() { + // 保存单条数据 + repository.save(new Programmer("pro01", 12, 2121.34f, new Date())); + // 保存多条数据 + List programmers = new ArrayList<>(); + programmers.add(new Programmer("pro02", 22, 3221.34f, new Date())); + programmers.add(new Programmer("pro03", 32, 3321.34f, new Date())); + programmers.add(new Programmer("pro04", 44, 4561.34f, new Date())); + programmers.add(new Programmer("pro01", 44, 4561.34f, new Date())); + repository.saveAll(programmers); + } + + + /** + * 查询数据测试 + */ + @Test + public void get() { + + // 遵循命名规范的查询 + List programmers = repository.findAllByName("pro01"); + programmers.forEach(System.out::println); + + // 传入参数名称 + Programmer param = repository.findByParam("pro02", 22); + System.out.println("findByParam:" + param); + + // 占位符查询 + List byCondition = repository.findByConditionAndOrder("pro03", 3321.34f, Sort.Order.asc("salary")); + System.out.println("byCondition:" + byCondition); + + //条件与分页查询 需要注意的是这里的页数是从第0页开始计算的 + Page page = repository.findAll(PageRequest.of(0, 10, Sort.Direction.DESC, "salary")); + page.get().forEach(System.out::println); + } + + + /** + * 更新数据测试 + */ + @Test + public void update() { + // 保存主键相同的数据就认为是更新操作 + repository.save(new Programmer(1, "updatePro01", 12, 2121.34f, new Date())); + Optional programmer = repository.findById(1); + Assert.assertEquals(programmer.get().getName(), "updatePro01"); + } + + /** + * 删除数据测试 + */ + @Test + public void delete() { + Optional programmer = repository.findById(2); + if (programmer.isPresent()) { + repository.deleteById(2); + } + Assert.assertFalse(programmer.isPresent()); + } +} +``` + diff --git a/spring-boot/spring-boot-data-jpa/src/main/resources/application.yml b/spring-boot/spring-boot-data-jpa/src/main/resources/application.yml index 504d2a7..e044e55 100644 --- a/spring-boot/spring-boot-data-jpa/src/main/resources/application.yml +++ b/spring-boot/spring-boot-data-jpa/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf-8 + url: jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/spring-boot/spring-boot-druid-mybatis/README.md b/spring-boot/spring-boot-druid-mybatis/README.md new file mode 100644 index 0000000..3435f70 --- /dev/null +++ b/spring-boot/spring-boot-druid-mybatis/README.md @@ -0,0 +1,196 @@ +# spring boot 整合 druid+mybatis + +## 一、说明 + +#### 1.1 项目结构 + +1. 项目查询用的表对应的建表语句放置在resources的sql文件夹下; + +2. 为了使用druid控制台的功能,项目以web的方式构建。 + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-druid-mybatis.png) + +#### 1.2 项目主要依赖 + +需要说明的是按照spring 官方对应自定义的starter 命名规范的推荐: + +- 官方的starter命名:spring-boot-starter-XXXX +- 其他第三方starter命名:XXXX-spring-boot-starte + +所以mybatis的starter命名为mybatis-spring-boot-starter,如果有自定义starter需求,也需要按照此命名规则进行命名。 + +```xml + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 + + + + mysql + mysql-connector-java + 8.0.13 + + + + com.alibaba + druid-spring-boot-starter + 1.1.10 + +``` + +spring boot 与 mybatis 版本的对应关系: + +| MyBatis-Spring-Boot-Starter | [MyBatis-Spring](http://www.mybatis.org/spring/index.html#Requirements) | Spring Boot | +| --------------------------- | ------------------------------------------------------------ | ------------- | +| **1.3.x (1.3.1)** | 1.3 or higher | 1.5 or higher | +| **1.2.x (1.2.1)** | 1.3 or higher | 1.4 or higher | +| **1.1.x (1.1.1)** | 1.3 or higher | 1.3 or higher | +| **1.0.x (1.0.2)** | 1.2 or higher | 1.3 or higher | + + + +## 二、整合 druid + mybatis + +#### 2.1 在application.yml 中配置数据源 + +本用例采用druid作为数据库连接池,虽然druid性能略逊于Hikari,但是提供了更为全面的监控管理,可以按照实际需求选用druid或者Hikari。(关于Hikari数据源的配置可以参考[spring-boot-mbatis项目](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-mybatis)) + +```yaml +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + + # 使用 druid 作为连接池 更多配置的说明可以参见 druid starter 中文文档 https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter + type: com.alibaba.druid.pool.DruidDataSource + druid: + # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 + initialSize: 5 + # 最小连接池数量 + minIdle: 5 + # 最大连接池数量 + maxActive: 10 + # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 + maxWait: 60000 + # Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 + timeBetweenEvictionRunsMillis: 60000 + # 连接保持空闲而不被驱逐的最小时间 + minEvictableIdleTimeMillis: 300000 + # 用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUAL + validationQuery: SELECT 1 + # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + testWhileIdle: true + # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + testOnBorrow: false + # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + testOnReturn: false + # 是否自动回收超时连接 + removeAbandoned: true + # 超时时间(以秒数为单位) + remove-abandoned-timeout: 180 + + # druid 监控的配置 如果不使用 druid 的监控功能的话 以下配置就不是必须的 + # 本项目监控台访问地址: http://localhost:8080/druid/login.html + + # WebStatFilter用于采集web-jdbc关联监控的数据。 + # 更多配置可参见: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter + web-stat-filter: + # 是否开启 WebStatFilter 默认是true + enabled: true + # 需要拦截的url + url-pattern: /* + # 排除静态资源的请求 + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" + + # Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。 + # 更多配置可参见:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE + stat-view-servlet: + #是否启用StatViewServlet 默认值true + enabled: true + # 需要拦截的url + url-pattern: /druid/* + # 允许清空统计数据 + reset-enable: true + login-username: druid + login-password: druid + + + +# mybatis 相关配置 +mybatis: + configuration: + # 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 + # oracle数据库建议配置为JdbcType.NULL, 默认是Other + jdbc-type-for-null: 'null' + # 是否打印sql语句 调试的时候可以开启 +log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +``` + +#### 2.2 新建查询接口和controller + +```java +@Mapper +public interface ProgrammerDao { + + + @Select("select * from programmer") + List selectAll(); + + @Insert("insert into programmer (name, age, salary, birthday) VALUES (#{name}, #{age}, #{salary}, #{birthday})") + void save(Programmer programmer); + + @Select("select * from programmer where name = #{id}") + Programmer selectById(int id); + + @Update("update programmer set name=#{name},age=#{age},salary=#{salary},birthday=#{birthday} where id=#{id}") + int modify(Programmer programmer); + + @Delete(" delete from programmer where id = #{id}") + void delete(int id); +} +``` + +```xml +@RestController +public class ProgrammerController { + + @Autowired + private ProgrammerDao programmerDao; + + @GetMapping("/programmers") + public List get() { + return programmerDao.selectAll(); + } +} +``` + +#### 2.3 关于druid监控数据的外部化调用 + +```java +/** + * @author : heibaiying + * @description :在 Spring Boot 中可以通过 HTTP 接口将 Druid 监控数据以JSON 的形式暴露出去, + * 实际使用中你可以根据你的需要自由地对监控数据、暴露方式进行扩展。 + */ + +@RestController +public class DruidStatController { + + @GetMapping("/stat") + public Object druidStat() { + // DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据 + return DruidStatManagerFacade.getInstance().getDataSourceStatDataList(); + } +} +``` + +![druid-status](D:\spring-samples-for-all\pictures\druid-status.png) + + + +#### 2.4 druid 控制台的使用,默认访问地址 http://localhost:8080/druid/login.html + +![spring-boot-druid 控制台](D:\spring-samples-for-all\pictures\spring-boot-druid 控制台.png) \ No newline at end of file diff --git a/spring-boot/spring-boot-druid-mybatis/src/main/resources/application.yml b/spring-boot/spring-boot-druid-mybatis/src/main/resources/application.yml index 47d3129..4356fc8 100644 --- a/spring-boot/spring-boot-druid-mybatis/src/main/resources/application.yml +++ b/spring-boot/spring-boot-druid-mybatis/src/main/resources/application.yml @@ -1,71 +1,70 @@ spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf-8 + url: jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver - # ʹ druid Ϊӳ õ˵Բμ druid starter ĵ https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter + # 使用 druid 作为连接池 更多配置的说明可以参见 druid starter 中文文档 https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter type: com.alibaba.druid.pool.DruidDataSource druid: - # ʼʱӵĸʼʾinitߵһgetConnectionʱ + # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 initialSize: 5 - # Сӳ + # 最小连接池数量 minIdle: 5 - # ӳ + # 最大连接池数量 maxActive: 10 - # ȡʱȴʱ䣬λ롣maxWait֮ȱʡùƽЧʻ½ҪͨuseUnfairLockΪtrueʹ÷ǹƽ + # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 maxWait: 60000 - # Destroy̻߳ӵļʱ䣬ӿʱڵminEvictableIdleTimeMillisرӡ + # Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 timeBetweenEvictionRunsMillis: 60000 - # ӱֿжСʱ + # 连接保持空闲而不被驱逐的最小时间 minEvictableIdleTimeMillis: 300000 - # ǷЧsql ݿⷽԶ, oracle Ӧд SELECT 1 FROM DUAL + # 用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUAL validationQuery: SELECT 1 - # ΪtrueӰܣұ֤ȫԡӵʱ⣬ʱtimeBetweenEvictionRunsMillisִvalidationQueryǷЧ + # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 testWhileIdle: true - # ʱִvalidationQueryǷЧûήܡ + # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnBorrow: false - # 黹ʱִvalidationQueryǷЧûήܡ + # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnReturn: false - # ǷԶճʱ + # 是否自动回收超时连接 removeAbandoned: true - # ʱʱ(Ϊλ) + # 超时时间(以秒数为单位) remove-abandoned-timeout: 180 - # druid ص ʹ druid ļعܵĻ þͲDZ - # Ŀ̨ʵַ: http://localhost:8080/druid/login.html + # druid 监控的配置 如果不使用 druid 的监控功能的话 以下配置就不是必须的 + # 本项目监控台访问地址: http://localhost:8080/druid/login.html - # WebStatFilterڲɼweb-jdbcصݡ - # ÿɲμ: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter + # WebStatFilter用于采集web-jdbc关联监控的数据。 + # 更多配置可参见: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter web-stat-filter: - # Ƿ WebStatFilter Ĭtrue + # 是否开启 WebStatFilter 默认是true enabled: true - # Ҫصurl + # 需要拦截的url url-pattern: /* - # ų̬Դ + # 排除静态资源的请求 exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" - # DruidṩһStatViewServletչʾDruidͳϢ - # ÿɲμ:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE + # Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。 + # 更多配置可参见:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE stat-view-servlet: - #ǷStatViewServlet Ĭֵtrue + #是否启用StatViewServlet 默认值true enabled: true - # Ҫصurl + # 需要拦截的url url-pattern: /druid/* - # ͳ + # 允许清空统计数据 reset-enable: true login-username: druid login-password: druid -# mybatis +# mybatis 相关配置 mybatis: configuration: - # ûΪṩض JDBC ʱΪֵָ JDBC ͡ - # oracleݿ⽨ΪJdbcType.NULL, ĬOther + # 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 + # oracle数据库建议配置为JdbcType.NULL, 默认是Other jdbc-type-for-null: 'null' - # Ƿӡsql ԵʱԿ - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - + # 是否打印sql语句 调试的时候可以开启 +log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file diff --git a/spring-boot/spring-boot-dubbo/README.md b/spring-boot/spring-boot-dubbo/README.md new file mode 100644 index 0000000..9116d9c --- /dev/null +++ b/spring-boot/spring-boot-dubbo/README.md @@ -0,0 +1,348 @@ +# spring boot 整合 dubbo + +## 一、 项目结构说明 + +1.1 按照dubbo 文档推荐的服务最佳实践,建议将服务接口、服务模型、服务异常等均放在 API 包中,所以项目采用maven多模块的构建方式,在spring-boot-dubbo下构建三个子模块: + +1. boot-dubbo-common 是公共模块,用于存放公共的接口和bean,被boot-dubbo-provider和boot-dubbo-consumer在pom.xml中引用; +2. boot-dubbo-provider 是服务的提供者,提供商品的查询服务; +3. boot-dubbo-consumer是服务的消费者,调用provider提供的查询服务。 + +1.2 本项目dubbo的搭建采用zookeeper作为注册中心, 关于zookeeper的安装和基本操作可以参见我的手记 [Zookeeper 基础命令与Java客户端](https://github.com/heibaiying/LearningNotes/blob/master/notes/%E4%B8%AD%E9%97%B4%E4%BB%B6/ZooKeeper/ZooKeeper%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA%E4%B8%8EJava%E5%AE%A2%E6%88%B7%E7%AB%AF.md) + +![spring-scheduling](D:\spring-samples-for-all\pictures\spring-boot-dubbo.png) + + + +## 二、关键依赖 + +在父工程的项目中统一导入依赖dubbo的starter,父工程的pom.xml如下 + +```xml + + + 4.0.0 + pom + + + boot-dubbo-common + boot-dubbo-consumer + boot-dubbo-provider + + + + org.springframework.boot + spring-boot-starter-parent + 2.1.1.RELEASE + + + com.heibaiying + spring-boot-dubbo + 0.0.1-SNAPSHOT + spring-boot-dubbo + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.alibaba.boot + dubbo-spring-boot-starter + 0.2.0 + + + + +``` + + + +## 三、公共模块(boot-dubbo-common) + +- api 下为公共的调用接口; +- bean 下为公共的实体类。 + +![spring-scheduling](D:\spring-samples-for-all\pictures\boot-dubbo-common.png) + +## 四、 服务提供者(boot-dubbo-provider) + +![spring-scheduling](D:\spring-samples-for-all\pictures\boot-dubbo-provider.png) + +#### 4.1 提供方配置 + +```yaml +dubbo: + application: + name: boot-duboo-provider + # 指定注册协议和注册地址 dubbo推荐使用zookeeper作为注册中心,并且在start依赖中引入了zookeeper的java客户端Curator + registry: + protocol: zookeeper + address: 127.0.0.1:2181 + protocol.name: dubbo +``` + +#### 4.2 使用注解@Service暴露服务 + +需要注意的是这里的@Service注解不是spring的注解,而是dubbo的注解 com.alibaba.dubbo.config.annotation.Service + +```java +package com.heibaiying.dubboprovider.service; + +import com.alibaba.dubbo.config.annotation.Service; +import com.heibaiying.api.IProductService; +import com.heibaiying.bean.Product; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author : heibaiying + * @description : 产品提供接口实现类 + */ +@Service(timeout = 5000) +public class ProductService implements IProductService { + + private static List productList = new ArrayList<>(); + + static { + for (int i = 0; i < 20; i++) { + productList.add(new Product(i, "产品" + i, i / 2 == 0, new Date(), 66.66f * i)); + } + } + + public Product queryProductById(int id) { + for (Product product : productList) { + if (product.getId() == id) { + return product; + } + } + return null; + } + + + public List queryAllProducts() { + return productList; + } +} + +``` + +## 五、服务消费者(boot-dubbo-consumer) + +![boot-dubbo-consumer](D:\spring-samples-for-all\pictures\boot-dubbo-consumer1.png) + +#### 1.消费方的配置 + +```yaml +dubbo: + application: + name: boot-duboo-provider + # 指定注册协议和注册地址 dubbo推荐使用zookeeper作为注册中心,并且在start依赖中引入了zookeeper的java客户端Curator + registry: + protocol: zookeeper + address: 127.0.0.1:2181 + protocol.name: dubbo + # 关闭所有服务的启动时检查 (没有提供者时报错)视实际情况设置 + consumer: + check: false +server: +port: 8090 +``` + +#### 2.使用注解@Reference引用远程服务 + +```java +package com.heibaiying.dubboconsumer.controller; + +import com.alibaba.dubbo.config.annotation.Reference; +import com.heibaiying.api.IProductService; +import com.heibaiying.bean.Product; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Controller +@RequestMapping("sell") +public class SellController { + + // dubbo远程引用注解 + @Reference + private IProductService productService; + + @RequestMapping + public String productList(Model model) { + List products = productService.queryAllProducts(); + model.addAttribute("products", products); + return "products"; + } + + @RequestMapping("product/{id}") + public String productDetail(@PathVariable int id, Model model) { + Product product = productService.queryProductById(id); + model.addAttribute("product", product); + return "product"; + } +} +``` + +## 六、项目构建的说明 + +因为在项目中,consumer和provider模块均依赖公共模块,所以在构建consumer和provider项目前需要将common 模块安装到本地仓库,**依次**对**父工程**和**common模块**执行: + +```shell +mvn install -Dmaven.test.skip = true +``` + +consumer中 pom.xml如下 + +```xml + + + 4.0.0 + + + spring-boot-dubbo + com.heibaiying + 0.0.1-SNAPSHOT + + + boot-dubbo-consumer + 0.0.1-SNAPSHOT + boot-dubbo-consumer + dubbo project for Spring Boot + + + 1.8 + + + + + + com.heibaiying + boot-dubbo-common + 0.0.1-SNAPSHOT + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + +``` + +provider中 pom.xml如下 + +```xml + + + 4.0.0 + + + spring-boot-dubbo + com.heibaiying + 0.0.1-SNAPSHOT + + + + boot-dubbo-provider + 0.0.1-SNAPSHOT + boot-dubbo-provider + dubbo project for Spring Boot + + + 1.8 + + + + + + com.heibaiying + boot-dubbo-common + 0.0.1-SNAPSHOT + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + +``` + +## 七、关于dubbo新版本管理控制台的安装说明 + +安装: + +```sh +git clone https://github.com/apache/incubator-dubbo-ops.git /var/tmp/dubbo-ops +cd /var/tmp/dubbo-ops +mvn clean package +``` + +配置: + +```sh +配置文件为: +dubbo-admin-backend/src/main/resources/application.properties +主要的配置有 默认的配置就是127.0.0.1:2181: +dubbo.registry.address=zookeeper://127.0.0.1:2181 +``` + +启动: + +```sh +mvn --projects dubbo-admin-backend spring-boot:run +``` + +访问: + +``` +http://127.0.0.1:8080 +``` \ No newline at end of file diff --git a/spring-boot/spring-boot-dubbo/boot-dubbo-consumer/src/main/resources/application.yml b/spring-boot/spring-boot-dubbo/boot-dubbo-consumer/src/main/resources/application.yml index 023f3f1..f1e417e 100644 --- a/spring-boot/spring-boot-dubbo/boot-dubbo-consumer/src/main/resources/application.yml +++ b/spring-boot/spring-boot-dubbo/boot-dubbo-consumer/src/main/resources/application.yml @@ -1,14 +1,13 @@ dubbo: application: name: boot-duboo-provider - # ָעЭעַ dubboƼʹzookeeperΪעģstartzookeeperjavaͻCurator + # 指定注册协议和注册地址 dubbo推荐使用zookeeper作为注册中心,并且在start依赖中引入了zookeeper的java客户端Curator registry: protocol: zookeeper address: 127.0.0.1:2181 protocol.name: dubbo - # رзʱ (ûṩʱʵ + # 关闭所有服务的启动时检查 (没有提供者时报错)视实际情况设置 consumer: check: false server: - port: 8090 - +port: 8090 \ No newline at end of file diff --git a/spring-boot/spring-boot-dubbo/boot-dubbo-provider/src/main/resources/application.yml b/spring-boot/spring-boot-dubbo/boot-dubbo-provider/src/main/resources/application.yml index 464875f..d4e5972 100644 --- a/spring-boot/spring-boot-dubbo/boot-dubbo-provider/src/main/resources/application.yml +++ b/spring-boot/spring-boot-dubbo/boot-dubbo-provider/src/main/resources/application.yml @@ -1,8 +1,8 @@ dubbo: application: name: boot-duboo-provider - # ָעЭעַ dubboƼʹzookeeperΪעģstartzookeeperjavaͻCurator + # 指定注册协议和注册地址 dubbo推荐使用zookeeper作为注册中心,并且在start依赖中引入了zookeeper的java客户端Curator registry: protocol: zookeeper address: 127.0.0.1:2181 - protocol.name: dubbo + protocol.name: dubbo \ No newline at end of file diff --git a/spring-boot/spring-boot-jsp/README.md b/spring-boot/spring-boot-jsp/README.md new file mode 100644 index 0000000..be18f2e --- /dev/null +++ b/spring-boot/spring-boot-jsp/README.md @@ -0,0 +1,84 @@ +# spring boot 内置容器 整合 jsp + +## 一、说明 + +#### 1.1 项目结构 + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-jsp.png) + +#### 1.2 项目主要依赖 + +```xml + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + + javax.servlet + jstl + +``` + +## 二、整合 jsp + +#### 2.1 导入整合的依赖 + +```xml + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + + javax.servlet + jstl + +``` + +#### 2.2 在application.yml 中指定访问视图文件的前缀和后缀 + +```yml +spring: + mvc: + view: + prefix: /WEB-INF/jsp/ + suffix: .jsp +``` + +#### 2.3 新建controller和show.jsp 测试整合是否成功 + +```java +@Controller +@RequestMapping("index") +public class JspController { + + @RequestMapping + public String jsp(Model model){ + Programmer programmer = new Programmer("heibai", 21, 1298.31f, LocalDate.now()); + model.addAttribute("programmer",programmer); + return "show"; + } +} +``` + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + programmer + + + +
    +
  • 姓名: ${programmer.name}
  • +
  • 年龄: ${programmer.age}
  • +
+ + +``` + diff --git a/spring-boot/spring-boot-jsp/pom.xml b/spring-boot/spring-boot-jsp/pom.xml index 07b7ad7..615c274 100644 --- a/spring-boot/spring-boot-jsp/pom.xml +++ b/spring-boot/spring-boot-jsp/pom.xml @@ -40,6 +40,7 @@ tomcat-embed-jasper provided + javax.servlet jstl diff --git a/spring-boot/spring-boot-memcached/README.md b/spring-boot/spring-boot-memcached/README.md new file mode 100644 index 0000000..725a1a8 --- /dev/null +++ b/spring-boot/spring-boot-memcached/README.md @@ -0,0 +1,148 @@ +# spring boot 整合 mecached + +## 一、说明 + +### 1.1 XMemcached客户端说明 + +spring boot 官方并没有提供关于 memcached 的starter,所以我们这里还是采用XMemcached作为客户端进行整合。 XMemcached是基于java nio的memcached高性能客户端,支持完整的memcached协议,支持客户端分布并且提供了一致性哈希(consistent hash)算法的实现。 + +### 1.2 项目结构说明 + +memcached的整合配置位于config文件夹下。 + +![spring+redis项目目录结构](D:\spring-samples-for-all\pictures\spring-boot-memcached.png) + +### 1.3 主要依赖 + +```xml + + + com.googlecode.xmemcached + xmemcached + 2.4.5 + +``` + + + +## 二、spring boot 整合 memcached + +#### 2.1 单机配置 + +```java +@Bean +public MemcachedClient memcachedClient() { + XMemcachedClientBuilder builder = new XMemcachedClientBuilder("192.168.200.201:11211"); + MemcachedClient memcachedClient = null; +try { + memcachedClient = builder.build(); + } catch (IOException e) { + e.printStackTrace(); +} + return memcachedClient; +} +``` + +#### 2.2 集群配置 + +```java +@Bean +public MemcachedClient memcachedClientForCluster() { + + List addressList = new ArrayList(); + addressList.add(new InetSocketAddress("192.168.200.201", 11211)); + addressList.add(new InetSocketAddress("192.168.200.201", 11212)); + // 赋予权重 + int[] weights = {1, 2}; + XMemcachedClientBuilder builder = new XMemcachedClientBuilder(addressList, weights); + // 设置连接池大小 + builder.setConnectionPoolSize(10); + // 协议工厂 + builder.setCommandFactory(new TextCommandFactory()); + // 分布策略,一致性哈希KetamaMemcachedSessionLocator或者ArraySessionLocator(默认) + builder.setSessionLocator(new KetamaMemcachedSessionLocator()); + // 设置序列化器 + builder.setTranscoder(new SerializingTranscoder()); + MemcachedClient memcachedClient = null; + try { + memcachedClient = builder.build(); + } catch (IOException e) { + e.printStackTrace(); + } + return memcachedClient; +} +``` + +#### 2.3 存储基本类型测试用例 + +xmemcached单机版本和集群版本注入的实例是相同的。 + +```java +/** + * @author : heibaiying + * @description : Memcached 操作基本对象 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class MemSamples { + + @Autowired + private MemcachedClient memcachedClient; + + @Test + public void operate() throws InterruptedException, MemcachedException, TimeoutException { + memcachedClient.set("hello", 0, "Hello,cluster xmemcached"); + String value = memcachedClient.get("hello"); + System.out.println("hello=" + value); + memcachedClient.delete("hello"); + value = memcachedClient.get("hello"); + System.out.println("hello=" + value); + } +} +``` + +#### 2.5 存储实体对象测试用例 + +```java +/** + * @author : heibaiying + * @description :Memcached 序列化与反序列化 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class MemObjectSamples { + + @Autowired + private MemcachedClient memcachedClient; + + @Test + public void operate() throws InterruptedException, MemcachedException, TimeoutException { + memcachedClient.set("programmer", 0, new Programmer("xiaoming", 12, 5000.21f, new Date())); + Programmer programmer = memcachedClient.get("programmer"); + System.out.println("hello ," + programmer.getName()); + memcachedClient.delete("programmer"); + programmer = memcachedClient.get("programmer"); + Assert.assertNull(programmer); + } +} + +``` + + + +## 附:memcached 基本命令 + +| 命令 | 格式 | 说明 | +| --------------- | -------------------------------------------------- | ------------------------------------- | +| 新增 set | set key flags exTime length -> value | 无论什么情况,都可以插入 | +| 新增 add | add key flags exTime length -> value | 只有当key不存在的情况下,才可以插入 | +| 替换 replace | replace key flags exTime length -> value | 只修改已存在key的value值 | +| 追加内容append | append key flags exTime length -> value | length表示追加的长度而不是总长度 | +| 前面追加prepend | prepend key flags exTime length -> value | length表示追加的长度而不是总长度 | +| 查询操作 get | get key | | +| 检查更新 cas | cas key flags exTime length version -> value | 版本正确才更新 | +| 详细获取 gets | gets key | 返回的最后一个数代表 key 的 CAS 令牌 | +| 删除 delete | delete key | 将数据打一个删除标记 | +| 自增 incr | incr key 增加偏移量 | incr和decr只能操作能转换为数字的Value | +| 自减 decr | decr key 减少偏移量 | desr不能将数字减少至0以下 | +| 清库 | flush_all | | \ No newline at end of file diff --git a/spring-boot/spring-boot-memcached/pom.xml b/spring-boot/spring-boot-memcached/pom.xml index 8dff5fc..0535c5e 100644 --- a/spring-boot/spring-boot-memcached/pom.xml +++ b/spring-boot/spring-boot-memcached/pom.xml @@ -35,7 +35,7 @@ true - + com.googlecode.xmemcached xmemcached diff --git a/spring-boot/spring-boot-mongodb/README.md b/spring-boot/spring-boot-mongodb/README.md new file mode 100644 index 0000000..dfa0d09 --- /dev/null +++ b/spring-boot/spring-boot-mongodb/README.md @@ -0,0 +1,182 @@ +# spring boot 整合 mongodb + +## 一、说明 + +#### 1.1 用例结构 + +1. 本用例提供mongdb的简单整合用例; +2. 提供用MongoTemplate的方式操作mongdb,见测试用例MongoOriginalTests.java +3. 提供基于spring data jpa 的方式操作mongodb(推荐),见测试用例MongoJPATests.java + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-mongodb.png) + +#### 1.2 项目主要依赖 + +```xml + + org.springframework.boot + spring-boot-starter-data-mongodb + +``` + + + +## 二、整合 mongodb + +#### 2.1 在application.yml 中配置mongodb数据源 + +```yaml +spring: + data: + mongodb: + database: spring + uri: mongodb://192.168.0.108:27017 +``` + +#### 2.2 基于MongoTemplate实现对mongodb的操作 + +```java +@RunWith(SpringRunner.class) +@SpringBootTest +public class MongoOriginalTests { + + @Autowired + private MongoTemplate mongoTemplate; + + @Test + public void insert() { + // 单条插入 + mongoTemplate.insert(new Programmer("xiaoming", 12, 5000.21f, new Date())); + List programmers = new ArrayList(); + // 批量插入 + programmers.add(new Programmer("xiaohong", 21, 52200.21f, new Date())); + programmers.add(new Programmer("xiaolan", 34, 500.21f, new Date())); + mongoTemplate.insert(programmers, Programmer.class); + } + + // 条件查询 + @Test + public void select() { + Criteria criteria = new Criteria(); + criteria.andOperator(where("name").is("xiaohong"), where("age").is(21)); + Query query = new Query(criteria); + Programmer one = mongoTemplate.findOne(query, Programmer.class); + System.out.println(one); + } + + + // 更新数据 + @Test + public void MUpdate() { + UpdateResult updateResult = mongoTemplate.updateMulti(query(where("name").is("xiaoming")), update("age", 35), Programmer.class); + System.out.println("更新记录数:" + updateResult.getModifiedCount()); + } + + // 删除指定数据 + @Test + public void delete() { + DeleteResult result = mongoTemplate.remove(query(where("name").is("xiaolan")), Programmer.class); + System.out.println("影响记录数:" + result.getDeletedCount()); + System.out.println("是否成功:" + result.wasAcknowledged()); + } + +} +``` + +#### 2.3 使用 data jpa 方式操作mongodb (推荐使用) + +1.新建查询结构,查询方法按照支持的关键字命名 + +```java +public interface ProgrammerRepository extends MongoRepository { + + void deleteAllByName(String name); + + Programmer findAllByName(String names); + + Programmer findByNameAndAge(String name, int age); + +} +``` + +2.测试 + +```java +@RunWith(SpringRunner.class) +@SpringBootTest +public class MongoJPATests { + + @Autowired + private ProgrammerRepository repository; + + @Test + public void insert() { + // 单条插入 + repository.save(new Programmer("python", 23, 21832.34f, new Date())); + // 批量插入 + List programmers = new ArrayList(); + programmers.add(new Programmer("java", 21, 52200.21f, new Date())); + programmers.add(new Programmer("Go", 34, 500.21f, new Date())); + repository.saveAll(programmers); + } + + // 条件查询 + @Test + public void select() { + Programmer java = repository.findByNameAndAge("java", 21); + Assert.assertEquals(java.getSalary(), 52200.21f, 0.01); + } + + + // 更新数据 + @Test + public void MUpdate() { + repository.save(new Programmer("Go", 8, 500.21f, new Date())); + Programmer go = repository.findAllByName("Go"); + Assert.assertEquals(go.getAge(), 8); + } + + // 删除指定数据 + @Test + public void delete() { + repository.deleteAllByName("python"); + Optional python = repository.findById("python"); + Assert.assertFalse(python.isPresent()); + } + +} +``` + +查询方法支持的关键字如下,更多命名规范可以参见Spring Data MongoDB官方文档[Query Methods](https://docs.spring.io/spring-data/mongodb/docs/2.1.3.RELEASE/reference/html/#mongodb.repositories.queries): + +| Keyword | Sample | Logical result | +| ------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| `After` | `findByBirthdateAfter(Date date)` | `{"birthdate" : {"$gt" : date}}` | +| `GreaterThan` | `findByAgeGreaterThan(int age)` | `{"age" : {"$gt" : age}}` | +| `GreaterThanEqual` | `findByAgeGreaterThanEqual(int age)` | `{"age" : {"$gte" : age}}` | +| `Before` | `findByBirthdateBefore(Date date)` | `{"birthdate" : {"$lt" : date}}` | +| `LessThan` | `findByAgeLessThan(int age)` | `{"age" : {"$lt" : age}}` | +| `LessThanEqual` | `findByAgeLessThanEqual(int age)` | `{"age" : {"$lte" : age}}` | +| `Between` | `findByAgeBetween(int from, int to)` | `{"age" : {"$gt" : from, "$lt" : to}}` | +| `In` | `findByAgeIn(Collection ages)` | `{"age" : {"$in" : [ages…]}}` | +| `NotIn` | `findByAgeNotIn(Collection ages)` | `{"age" : {"$nin" : [ages…]}}` | +| `IsNotNull`, `NotNull` | `findByFirstnameNotNull()` | `{"firstname" : {"$ne" : null}}` | +| `IsNull`, `Null` | `findByFirstnameNull()` | `{"firstname" : null}` | +| `Like`, `StartingWith`, `EndingWith` | `findByFirstnameLike(String name)` | `{"firstname" : name} (name as regex)` | +| `NotLike`, `IsNotLike` | `findByFirstnameNotLike(String name)` | `{"firstname" : { "$not" : name }} (name as regex)` | +| `Containing` on String | `findByFirstnameContaining(String name)` | `{"firstname" : name} (name as regex)` | +| `NotContaining` on String | `findByFirstnameNotContaining(String name)` | `{"firstname" : { "$not" : name}} (name as regex)` | +| `Containing` on Collection | `findByAddressesContaining(Address address)` | `{"addresses" : { "$in" : address}}` | +| `NotContaining` on Collection | `findByAddressesNotContaining(Address address)` | `{"addresses" : { "$not" : { "$in" : address}}}` | +| `Regex` | `findByFirstnameRegex(String firstname)` | `{"firstname" : {"$regex" : firstname }}` | +| `(No keyword)` | `findByFirstname(String name)` | `{"firstname" : name}` | +| `Not` | `findByFirstnameNot(String name)` | `{"firstname" : {"$ne" : name}}` | +| `Near` | `findByLocationNear(Point point)` | `{"location" : {"$near" : [x,y]}}` | +| `Near` | `findByLocationNear(Point point, Distance max)` | `{"location" : {"$near" : [x,y], "$maxDistance" : max}}` | +| `Near` | `findByLocationNear(Point point, Distance min, Distance max)` | `{"location" : {"$near" : [x,y], "$minDistance" : min, "$maxDistance" : max}}` | +| `Within` | `findByLocationWithin(Circle circle)` | `{"location" : {"$geoWithin" : {"$center" : [ [x, y], distance]}}}` | +| `Within` | `findByLocationWithin(Box box)` | `{"location" : {"$geoWithin" : {"$box" : [ [x1, y1], x2, y2]}}}` | +| `IsTrue`, `True` | `findByActiveIsTrue()` | `{"active" : true}` | +| `IsFalse`, `False` | `findByActiveIsFalse()` | `{"active" : false}` | +| `Exists` | `findByLocationExists(boolean exists)` | `{"location" : {"$exists" : exists }}` | + diff --git a/spring-boot/spring-boot-mybatis/README.md b/spring-boot/spring-boot-mybatis/README.md new file mode 100644 index 0000000..0d287a6 --- /dev/null +++ b/spring-boot/spring-boot-mybatis/README.md @@ -0,0 +1,249 @@ +# spring boot 整合 mybatis + +## 一、说明 + +#### 1.1 项目结构 + +1. 项目查询用的表对应的建表语句放置在resources的sql文件夹下; + +2. 关于mybatis sql的写法提供两种方式: + + xml 写法:对应的类为ProgrammerMapper.java 和 programmerMapper.xml,用MybatisXmlTest进行测试; + + 注解写法:对应的类为Programmer.java ,用MybatisAnnotationTest进行测试。 + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-mybatis.png) + +#### 1.2 项目主要依赖 + +需要说明的是按照spring 官方对应自定义的starter 命名规范的推荐: + +- 官方的starter命名:spring-boot-starter-XXXX +- 其他第三方starter命名:XXXX-spring-boot-starte + +所以mybatis的starter命名为mybatis-spring-boot-starter,如果有自定义starter需求,也需要按照此命名规则进行命名。 + +```xml + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 + + + + mysql + mysql-connector-java + 8.0.13 + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + +``` + +spring boot 与 mybatis 版本的对应关系: + +| MyBatis-Spring-Boot-Starter | [MyBatis-Spring](http://www.mybatis.org/spring/index.html#Requirements) | Spring Boot | +| --------------------------- | ------------------------------------------------------------ | ------------- | +| **1.3.x (1.3.1)** | 1.3 or higher | 1.5 or higher | +| **1.2.x (1.2.1)** | 1.3 or higher | 1.4 or higher | +| **1.1.x (1.1.1)** | 1.3 or higher | 1.3 or higher | +| **1.0.x (1.0.2)** | 1.2 or higher | 1.3 or higher | + +## 二、整合 mybatis + +#### 2.1 在application.yml 中配置数据源 + +spring boot 2.x 版本默认采用Hikari作为数据库连接池,Hikari是目前java平台性能最好的连接池,性能好于druid。 + +```yaml +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + + # 如果不想配置对数据库连接池做特殊配置的话,以下关于连接池的配置就不是必须的 + # spring-boot 2 默认采用高性能的 Hikari 作为连接池 更多配置可以参考 https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby + type: com.zaxxer.hikari.HikariDataSource + hikari: + # 池中维护的最小空闲连接数 + minimum-idle: 10 + # 池中最大连接数,包括闲置和使用中的连接 + maximum-pool-size: 20 + # 此属性控制从池返回的连接的默认自动提交行为。默认为true + auto-commit: true + # 允许最长空闲时间 + idle-timeout: 30000 + # 此属性表示连接池的用户定义名称,主要显示在日志记录和JMX管理控制台中,以标识池和池配置。 默认值:自动生成 + pool-name: custom-hikari + #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 + max-lifetime: 1800000 + # 数据库连接超时时间,默认30秒,即30000 + connection-timeout: 30000 + # 连接测试sql 这个地方需要根据数据库方言差异而配置 例如 oracle 就应该写成 select 1 from dual + connection-test-query: SELECT 1 + +# mybatis 相关配置 +mybatis: + # 指定 sql xml 文件的位置 + mapper-locations: classpath*:mappers/*.xml + configuration: + # 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 + # oracle数据库建议配置为JdbcType.NULL, 默认是Other + jdbc-type-for-null: 'null' + # 是否打印sql语句 调试的时候可以开启 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +``` + +#### 2.2 xml方式的sql语句 + +新建 ProgrammerMapper.java 和 programmerMapper.xml,及其测试类 + +```java +@Mapper +public interface ProgrammerMapper { + + void save(Programmer programmer); + + Programmer selectById(int id); + + int modify(Programmer programmer); + + void delete(int id); +} +``` + +```xml + + + + + + insert into programmer (name, age, salary, birthday) VALUES (#{name}, #{age}, #{salary}, #{birthday}) + + + + + + update programmer set name=#{name},age=#{age},salary=#{salary},birthday=#{birthday} where id=#{id} + + + + delete from programmer where id = #{id} + + + +``` + +测试类 + +```java +/*** + * @description: xml Sql测试类 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class MybatisXmlTest { + + @Autowired + private ProgrammerMapper mapper; + + @Test + public void save() { + mapper.save(new Programmer("xiaominng", 12, 3467.34f, new Date())); + mapper.save(new Programmer("xiaominng", 12, 3467.34f, new Date())); + } + + @Test + public void modify() { + mapper.modify(new Programmer(1, "xiaohong", 112, 347.34f, new Date())); + } + + @Test + public void selectByCondition() { + Programmer programmers = mapper.selectById(1); + System.out.println(programmers); + } + + @Test + public void delete() { + mapper.delete(2); + Programmer programmers = mapper.selectById(2); + Assert.assertNull(programmers); + } +} +``` + +#### 2.3 注解方式的sql语句 + +```java +@Mapper +public interface ProgrammerDao { + + @Insert("insert into programmer (name, age, salary, birthday) VALUES (#{name}, #{age}, #{salary}, #{birthday})") + void save(Programmer programmer); + + @Select("select * from programmer where name = #{id}") + Programmer selectById(int id); + + @Update("update programmer set name=#{name},age=#{age},salary=#{salary},birthday=#{birthday} where id=#{id}") + int modify(Programmer programmer); + + @Delete(" delete from programmer where id = #{id}") + void delete(int id); +} +``` + +测试类 + +```java +/*** + * @description: 注解Sql测试类 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class MybatisAnnotationTest { + + @Autowired + private ProgrammerDao programmerDao; + + @Test + public void save() { + programmerDao.save(new Programmer("xiaominng", 12, 3467.34f, new Date())); + programmerDao.save(new Programmer("xiaominng", 12, 3467.34f, new Date())); + } + + @Test + public void modify() { + programmerDao.modify(new Programmer(1, "xiaolan", 21, 347.34f, new Date())); + } + + @Test + public void selectByCondition() { + Programmer programmers = programmerDao.selectById(1); + System.out.println(programmers); + } + + @Test + public void delete() { + programmerDao.delete(3); + Programmer programmers = programmerDao.selectById(3); + Assert.assertNull(programmers); + } +} + +``` + diff --git a/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerDao.java b/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerDao.java index d8a35a3..61cd54e 100644 --- a/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerDao.java +++ b/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerDao.java @@ -3,8 +3,6 @@ package com.heibaiying.springboot.dao; import com.heibaiying.springboot.bean.Programmer; import org.apache.ibatis.annotations.*; -import java.util.List; - /** * @author : heibaiying */ diff --git a/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerMapper.java b/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerMapper.java index 6c769c8..9797c00 100644 --- a/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerMapper.java +++ b/spring-boot/spring-boot-mybatis/src/main/java/com/heibaiying/springboot/dao/ProgrammerMapper.java @@ -3,8 +3,6 @@ package com.heibaiying.springboot.dao; import com.heibaiying.springboot.bean.Programmer; import org.apache.ibatis.annotations.Mapper; -import java.util.List; - /** * @author : heibaiying */ diff --git a/spring-boot/spring-boot-mybatis/src/main/resources/application.yml b/spring-boot/spring-boot-mybatis/src/main/resources/application.yml index 06b8071..932dc69 100644 --- a/spring-boot/spring-boot-mybatis/src/main/resources/application.yml +++ b/spring-boot/spring-boot-mybatis/src/main/resources/application.yml @@ -1,55 +1,55 @@ spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf-8 + url: jdbc:mysql://127.0.0.1:3306/mysql?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver - # ԴĻ,¹ӳصþͲDZ - # spring-boot 2 Ĭϲøܵ Hikari Ϊӳ ÿԲο https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby + # 如果不想配置对数据库连接池做特殊配置的话,以下关于连接池的配置就不是必须的 + # spring-boot 2 默认采用高性能的 Hikari 作为连接池 更多配置可以参考 https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby type: com.zaxxer.hikari.HikariDataSource hikari: - # άС + # 池中维护的最小空闲连接数 minimum-idle: 10 - # úʹе + # 池中最大连接数,包括闲置和使用中的连接 maximum-pool-size: 20 - # ԿƴӳطصӵĬԶύΪĬΪtrue + # 此属性控制从池返回的连接的默认自动提交行为。默认为true auto-commit: true - # ʱ + # 允许最长空闲时间 idle-timeout: 30000 - # ԱʾӳصûƣҪʾ־¼JMX̨УԱʶغͳá ĬֵԶ + # 此属性表示连接池的用户定义名称,主要显示在日志记录和JMX管理控制台中,以标识池和池配置。 默认值:自动生成 pool-name: custom-hikari - #ԿƳӵڣֵ0ʾڣĬ180000030 + #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 max-lifetime: 1800000 - # ݿӳʱʱ,Ĭ30룬30000 + # 数据库连接超时时间,默认30秒,即30000 connection-timeout: 30000 - # Ӳsql طҪݿⷽԲ oracle Ӧд select 1 from dual + # 连接测试sql 这个地方需要根据数据库方言差异而配置 例如 oracle 就应该写成 select 1 from dual connection-test-query: SELECT 1 -# mybatis +# mybatis 相关配置 mybatis: - # ָ sql xml ļλ + # 指定 sql xml 文件的位置 mapper-locations: classpath*:mappers/*.xml configuration: - # ûΪṩض JDBC ʱΪֵָ JDBC ͡ - # oracleݿ⽨ΪJdbcType.NULL, ĬOther + # 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 + # oracle数据库建议配置为JdbcType.NULL, 默认是Other jdbc-type-for-null: 'null' - # Ƿӡsql ԵʱԿ + # 是否打印sql语句 调试的时候可以开启 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl -# ע 1 +# 注 1 # oracle # driver="oracle.jdbc.driver.OracleDriver" - # url="jdbc:oracle:thin:@localhost:1521:ݿ" + # url="jdbc:oracle:thin:@localhost:1521:数据库名" # mysql - # driver="com.mysql.jdbc.Driver" - # url="jdbc:mysql://localhost/ݿ?[Ӳ]" + # driver="com.mysql.cj.jdbc.Driver" + # url="jdbc:mysql://localhost/数据库名?[后接参数]" -# ע 2 - # mybatis ø˵Բοsettings http://www.mybatis.org/mybatis-3/zh/configuration.html +# 注 2 + # mybatis 配置更多说明可以参考settings http://www.mybatis.org/mybatis-3/zh/configuration.html -# ע 3 - # spring boot 2.0 ĬϲHikari Ϊӳ githubַ https://github.com/brettwooldridge/HikariCP \ No newline at end of file +# 注 3 +# spring boot 2.0 默认采用Hikari 作为连接池 Hikari github地址 https://github.com/brettwooldridge/HikariCP \ No newline at end of file diff --git a/spring-boot/spring-boot-rabbitmq/README.md b/spring-boot/spring-boot-rabbitmq/README.md new file mode 100644 index 0000000..942df79 --- /dev/null +++ b/spring-boot/spring-boot-rabbitmq/README.md @@ -0,0 +1,390 @@ +# spring boot 整合 rabbitmq + +## 一、 项目结构说明 + +1.1 之前关于spring 整合 rabbitmq 我们采用的是单项目的方式,为了使得用例更具有实际意义,这里采用maven多模块的构建方式,在spring-boot-rabbitmq下构建三个子模块: + +1. rabbitmq-common 是公共模块,用于存放公共的接口、配置和bean,被rabbitmq-producer和rabbitmq-consumer在pom.xml中引用; +2. rabbitmq-producer 是消息的生产者模块; +3. rabbitmq-consumer是消息的消费者模块。 + +1.2 关于rabbitmq安装、交换机、队列、死信队列等基本概念可以参考我的手记[《RabbitMQ实战指南》读书笔记](https://github.com/heibaiying/LearningNotes/blob/master/notes/%E4%B8%AD%E9%97%B4%E4%BB%B6/RabbitMQ/%E3%80%8ARabbitMQ%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0.md),里面有详细的配图说明。 + +![spring-scheduling](D:\spring-samples-for-all\pictures\spring-boot-rabbitmq.png) + + + +## 二、关键依赖 + +在父工程的项目中统一导入依赖rabbitmq的starter(spring-boot-starter-amqp),父工程的pom.xml如下 + +```xml + + + + 4.0.0 + pom + + + rabbitmq-consumer + rabbitmq-producer + rabbitmq-common + + + + org.springframework.boot + spring-boot-starter-parent + 2.1.1.RELEASE + + + com.heibaiying + spring-boot-rabbitmq + 0.0.1-SNAPSHOT + spring-boot-rabbitmq + RabbitMQ project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + +``` + + + +## 三、公共模块(rabbitmq-common) + +- bean 下为公共的实体类。 +- constant 下为公共配置,用静态常量引用。(这里我使用静态常量是为了方便引用,实际中也可以按照情况,抽取为公共配置文件) + +![spring-scheduling](D:\spring-samples-for-all\pictures\rabbitmq-common.png) + +```java +package com.heibaiying.constant; + +/** + * @author : heibaiying + * @description : rabbit 公用配置信息 + */ +public class RabbitInfo { + + // queue 配置 + public static final String QUEUE_NAME = "spring.boot.simple.queue"; + public static final String QUEUE_DURABLE = "true"; + + // exchange 配置 + public static final String EXCHANGE_NAME = "spring.boot.simple.exchange"; + public static final String EXCHANGE_TYPE = "topic"; + + // routing key + public static final String ROUTING_KEY = "springboot.simple.*"; +} + +``` + + + +## 四、服务消费者(rabbitmq-consumer) + +![boot-dubbo-consumer](D:\spring-samples-for-all\pictures\rabbitmq-consumer.png) + +#### 4.1 消息消费者配置 + +```yaml +spring: + rabbitmq: + addresses: 127.0.0.1:5672 + # RabbitMQ 默认的用户名和密码都是guest 而虚拟主机名称是 "/" + # 如果配置其他虚拟主机地址,需要预先用管控台或者图形界面创建 图形界面地址 http://主机地址:15672 + username: guest + password: guest + virtual-host: / + listener: + simple: + # 为了保证信息能够被正确消费,建议签收模式设置为手工签收,并在代码中实现手工签收 + acknowledge-mode: manual + # 侦听器调用者线程的最小数量 + concurrency: 10 + # 侦听器调用者线程的最大数量 + max-concurrency: 50 +``` + +#### 4.2 使用注解@RabbitListener和@RabbitHandler创建消息监听者 + +1. 使用注解创建的交换机、队列、和绑定关系会在项目初始化的时候自动创建,但是不会重复创建; +2. 这里我们创建两个消息监听器,分别演示消息是基本类型和消息是对象时的配置区别。 + +```java +/** + * @author : heibaiying + * @description : 消息是对象的消费者 + */ + +@Component +@Slf4j +public class RabbitmqBeanConsumer { + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(value = RabbitBeanInfo.QUEUE_NAME, durable = RabbitBeanInfo.QUEUE_DURABLE), + exchange = @Exchange(value = RabbitBeanInfo.EXCHANGE_NAME, type = RabbitBeanInfo.EXCHANGE_TYPE), + key = RabbitBeanInfo.ROUTING_KEY) + ) + @RabbitHandler + public void onMessage(@Payload Programmer programmer, @Headers Map headers, Channel channel) throws Exception { + log.info("programmer:{} ", programmer); + Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG); + channel.basicAck(deliveryTag, false); + } +} +``` + +```java +@Component +@Slf4j +public class RabbitmqConsumer { + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(value = RabbitInfo.QUEUE_NAME, durable = RabbitInfo.QUEUE_DURABLE), + exchange = @Exchange(value = RabbitInfo.EXCHANGE_NAME, type = RabbitInfo.EXCHANGE_TYPE), + key = RabbitInfo.ROUTING_KEY) + ) + @RabbitHandler + public void onMessage(Message message, Channel channel) throws Exception { + MessageHeaders headers = message.getHeaders(); + // 获取消息头信息和消息体 + log.info("msgInfo:{} ; payload:{} ", headers.get("msgInfo"), message.getPayload()); + // DELIVERY_TAG 代表 RabbitMQ 向该Channel投递的这条消息的唯一标识ID,是一个单调递增的正整数 + Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG); + // 第二个参数代表是否一次签收多条,当该参数为 true 时,则可以一次性确认 DELIVERY_TAG 小于等于传入值的所有消息 + channel.basicAck(deliveryTag, false); + } + +} +``` + + + +## 五、 消息生产者(rabbitmq-producer) + +![spring-scheduling](D:\spring-samples-for-all\pictures\rabbitmq-producer.png) + +#### 5.1 消息生产者配置 + +```yaml +spring: + rabbitmq: + addresses: 127.0.0.1:5672 + # RabbitMQ 默认的用户名和密码都是guest 而虚拟主机名称是 "/" + # 如果配置其他虚拟主机地址,需要预先用管控台或者图形界面创建 图形界面地址 http://主机地址:15672 + username: guest + password: guest + virtual-host: / + # 是否启用发布者确认 具体确认回调实现见代码 + publisher-confirms: true + # 是否启用发布者返回 具体返回回调实现见代码 + publisher-returns: true + # 是否启用强制消息 保证消息的有效监听 + template.mandatory: true + +server: + port: 8090 +``` + +#### 5.2 创建消息生产者 + +```java +/** + * @author : heibaiying + * @description : 消息生产者 + */ +@Component +@Slf4j +public class RabbitmqProducer { + + @Autowired + private RabbitTemplate rabbitTemplate; + + public void sendSimpleMessage(Map headers, Object message, + String messageId, String exchangeName, String key) { + // 自定义消息头 + MessageHeaders messageHeaders = new MessageHeaders(headers); + // 创建消息 + Message msg = MessageBuilder.createMessage(message, messageHeaders); + /* 确认的回调 确认消息是否到达 Broker 服务器 其实就是是否到达交换器 + 如果发送时候指定的交换器不存在 ack就是false 代表消息不可达 */ + rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> { + log.info("correlationData:{} , ack:{}", correlationData.getId(), ack); + if (!ack) { + System.out.println("进行对应的消息补偿机制"); + } + }); + /* 消息失败的回调 + * 例如消息已经到达交换器上,但路由键匹配任何绑定到该交换器的队列,会触发这个回调,此时 replyText: NO_ROUTE + */ + rabbitTemplate.setReturnCallback((message1, replyCode, replyText, exchange, routingKey) -> { + log.info("message:{}; replyCode: {}; replyText: {} ; exchange:{} ; routingKey:{}", + message1, replyCode, replyText, exchange, routingKey); + }); + // 在实际中ID 应该是全局唯一 能够唯一标识消息 消息不可达的时候触发ConfirmCallback回调方法时可以获取该值,进行对应的错误处理 + CorrelationData correlationData = new CorrelationData(messageId); + rabbitTemplate.convertAndSend(exchangeName, key, msg, correlationData); + } +} +``` + +#### 5.3 以单元测试的方式发送消息 + +```java +@RunWith(SpringRunner.class) +@SpringBootTest +public class RabbitmqProducerTests { + + @Autowired + private RabbitmqProducer producer; + + /*** + * 发送消息体为简单数据类型的消息 + */ + @Test + public void send() { + Map heads = new HashMap<>(); + heads.put("msgInfo", "自定义消息头信息"); + // 模拟生成消息ID,在实际中应该是全局唯一的 消息不可达时候可以在setConfirmCallback回调中取得,可以进行对应的重发或错误处理 + String id = String.valueOf(Math.round(Math.random() * 10000)); + producer.sendSimpleMessage(heads, "hello Spring", id, RabbitInfo.EXCHANGE_NAME, "springboot.simple.abc"); + } + + + /*** + * 发送消息体为bean的消息 + */ + @Test + public void sendBean() { + String id = String.valueOf(Math.round(Math.random() * 10000)); + Programmer programmer = new Programmer("xiaoMing", 12, 12123.45f, new Date()); + producer.sendSimpleMessage(null, programmer, id, RabbitBeanInfo.EXCHANGE_NAME, RabbitBeanInfo.ROUTING_KEY); + } + +} +``` + + + +## 六、项目构建的说明 + +因为在项目中,consumer和producer模块均依赖公共模块,所以在构建consumer和producer项目前需要将common 模块安装到本地仓库,**依次**对**父工程**和**common模块**执行: + +```shell +mvn install -Dmaven.test.skip = true +``` + +consumer中 pom.xml如下 + +```xml + + + 4.0.0 + + + com.heibaiying + spring-boot-rabbitmq + 0.0.1-SNAPSHOT + + + rabbitmq-consumer + 0.0.1-SNAPSHOT + rabbitmq-consumer + RabbitMQ consumer project for Spring Boot + + + 1.8 + + + + + com.heibaiying + rabbitmq-common + 0.0.1-SNAPSHOT + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + +``` + +producer中 pom.xml如下 + +```xml + + + 4.0.0 + + + com.heibaiying + spring-boot-rabbitmq + 0.0.1-SNAPSHOT + + + rabbitmq-producer + 0.0.1-SNAPSHOT + rabbitmq-producer + RabbitMQ producer project for Spring Boot + + + 1.8 + + + + + com.heibaiying + rabbitmq-common + 0.0.1-SNAPSHOT + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + +``` diff --git a/spring-boot/spring-boot-redis/README.md b/spring-boot/spring-boot-redis/README.md new file mode 100644 index 0000000..34d1a6d --- /dev/null +++ b/spring-boot/spring-boot-redis/README.md @@ -0,0 +1,444 @@ +# spring boot 整合 redis + +## 一、说明 + +#### 1.1 项目结构 + +1. RedisConfig.java实现了redisTemplate 序列化与反序列化的配置; +2. RedisOperation和RedisObjectOperation分别封装了对基本类型和对象的操作。 + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-redis.png) + +#### 1.2 项目主要依赖 + +```xml + + + org.springframework.boot + spring-boot-starter-data-redis + + + + com.fasterxml.jackson.core + jackson-databind + 2.9.8 + +``` + + + +## 二、整合 Redis + +#### 2.1 在application.yml 中配置redis数据源 + +```yaml +spring: + redis: + host: 127.0.0.1 + port: 6379 + # 默认采用的也是 0 号数据库 redis官方在4.0之后版本就不推荐采用单节点多数据库(db1-db15)的方式存储数据,如果有需要应该采用集群方式构建 + database: 0 + +# 如果是集群节点 采用如下配置指定节点 +#spring.redis.cluster.nodes +``` + +#### 2.2 封装redis基本操作 + +需要说明的是spring boot 提供了两个template 用于操作redis: + +- StringRedisTemplate:由于redis在大多数使用情况下都是操作字符串类型的存储,所以spring boot 将对字符串的操作单独封装在StringRedisTemplate ; +- RedisTemplate :redis 用于操作任意类型的template。 + +```java +/** + * @author : heibaiying + * @description : redis 基本操作 + */ + +@Component +public class RedisOperation { + + @Autowired + private StringRedisTemplate redisTemplate; + + /*** + * 操作普通字符串 + */ + public void StringSet(String key, String value) { + ValueOperations valueOperations = redisTemplate.opsForValue(); + valueOperations.set(key, value); + } + + /*** + * 操作列表 + */ + public void ListSet(String key, List values) { + ListOperations listOperations = redisTemplate.opsForList(); + values.forEach(value -> listOperations.leftPush(key, value)); + } + + /*** + * 操作集合 + */ + public void SetSet(String key, Set values) { + SetOperations setOperations = redisTemplate.opsForSet(); + values.forEach(value -> setOperations.add(key, value)); + } + + /*** + * 获取字符串 + */ + public String StringGet(String key) { + ValueOperations valueOperations = redisTemplate.opsForValue(); + return valueOperations.get(key); + } + + /*** + * 列表弹出元素 + */ + public String ListLeftPop(String key) { + ListOperations listOperations = redisTemplate.opsForList(); + return listOperations.leftPop(key, 2, TimeUnit.SECONDS); + } + + /*** + * 集合弹出元素 + */ + public String SetPop(String key) { + SetOperations setOperations = redisTemplate.opsForSet(); + return setOperations.pop(key); + } + +} +``` + +```java +/** + * @author : heibaiying + * @description : redis 基本操作 + */ + +@Component +public class RedisObjectOperation { + + @Autowired + private RedisTemplate objectRedisTemplate; + + /*** + * 操作对象 + */ + public void ObjectSet(Object key, Object value) { + ValueOperations valueOperations = objectRedisTemplate.opsForValue(); + valueOperations.set(key, value); + } + + /*** + * 操作元素为对象列表 + */ + public void ListSet(Object key, List values) { + ListOperations listOperations = objectRedisTemplate.opsForList(); + values.forEach(value -> listOperations.leftPush(key, value)); + } + + /*** + * 操作元素为对象集合 + */ + public void SetSet(Object key, Set values) { + SetOperations setOperations = objectRedisTemplate.opsForSet(); + values.forEach(value -> setOperations.add(key, value)); + } + + /*** + * 获取对象 + */ + public Object ObjectGet(Object key) { + ValueOperations valueOperations = objectRedisTemplate.opsForValue(); + return valueOperations.get(key); + } + + /*** + * 列表弹出元素 + */ + public Object ListLeftPop(Object key) { + ListOperations listOperations = objectRedisTemplate.opsForList(); + return listOperations.leftPop(key, 2, TimeUnit.SECONDS); + } + + /*** + * 集合弹出元素 + */ + public Object SetPop(Object key) { + SetOperations setOperations = objectRedisTemplate.opsForSet(); + return setOperations.pop(key); + } + +} +``` + +#### 2.3 redisTemplate 序列化为json格式与反序列化 + +这里需要说明的spring boot 的 redisTemplate 本身是实现了对象的序列化与反序列化的,是支持直接存取对象的。但是这里的序列化默认采用的是JdkSerializationRedisSerializer.serialize()序列化为二进制码,这个本身是不影响redisTemplate 的操作的,因为redisTemplate在取出数据的时候会自动进行反序列化。 + +但是如果我们在命令行中使用get命令去获取数据时候,得到的是一串不直观的二进制码,所以我们尽量将其序列化为直观的json格式存储。 + +```java +/** + * @author : heibaiying + * @description : 自定义序列化器 + * 不定义的话默认采用的是serializer.JdkSerializationRedisSerializer.serialize()序列化为二进制字节码 存储在数据库中不直观 + */ +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + // 使用Jackson2JsonRedisSerialize 需要导入依赖 com.fasterxml.jackson.core jackson-databind + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + + ObjectMapper objectMapper = new ObjectMapper(); + // 第一个参数表示: 表示所有访问者都受到影响 包括 字段, getter / isGetter,setter,creator + // 第二个参数表示: 所有类型的访问修饰符都是可接受的,不论是公有还有私有表变量都会被序列化 + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + + // 设置key,value 序列化规则 + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} +``` + +#### 2.4 测试 + +```java +@RunWith(SpringRunner.class) +@SpringBootTest +public class RedisTests { + + @Autowired + private RedisOperation redisOperation; + + @Test + public void StringOperation() { + redisOperation.StringSet("hello", "redis"); + String s = redisOperation.StringGet("hello"); + Assert.assertEquals(s, "redis"); + } + + @Test + public void ListOperation() { + redisOperation.ListSet("skill", Arrays.asList("java", "oracle", "vue")); + String s = redisOperation.ListLeftPop("skill"); + Assert.assertEquals(s, "vue"); + } + + /* + * 需要注意的是Redis的集合(set)不仅不允许有重复元素,并且集合中的元素是无序的, + * 不能通过索引下标获取元素。哪怕你在java中传入的集合是有序的newLinkedHashSet,但是实际在Redis存储的还是无序的集合 + */ + @Test + public void SetOperation() { + redisOperation.SetSet("skillSet", Sets.newLinkedHashSet("java", "oracle", "vue")); + String s = redisOperation.SetPop("skillSet"); + Assert.assertNotNull(s); + } + +} +``` + +
+ +## 附:Redis的数据结构和操作命令 + +### 1.1 预备 + +#### 1.1.1 全局命令 + +1. 查看所有键: **keys \*** + +2. 查看键总数:**dbsize** + +3. 检查键是否存在:**exists key** + +4. 删除键:**del key [key ...]** 支持删除多个键 + +5. 键过期:**expire key seconds** + + ttl命令会返回键的剩余过期时间, 它有3种返回值: + + - 大于等于0的整数: 键剩余的过期时间。 + - -1: 键没设置过期时间。 + - -2: 键不存在 + +6. 键的数据结构 **type key** + +#### 1.1.2 数据结构和内部编码 + +type命令实际返回的就是当前键的数据结构类型, 它们分别是:**string**(字符串) 、 **hash**(哈希) 、 **list**(列表) 、 **set**(集合) 、 **zset**(有序集合) + +#### 1.1.3 单线程架构 + +1. 纯内存访问, Redis将所有数据放在内存中, 内存的响应时长大约为100纳秒, 这是Redis达到每秒万级别访问的重要基础。 +2. 非阻塞I/O, Redis使用epoll作为I/O多路复用技术的实现, 再加上Redis自身的事件处理模型将epoll中的连接、 读写、 关闭都转换为事件, 不在网络I/O上浪费过多的时间, 如图2-6所示。 +3. 单线程避免了线程切换和竞态产生的消耗。 + +### 1.2 字符串 + +| 作用 | 格式 | 参数或示例 | +| ---------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 设置值 | set key value \[ex seconds]\[px milliseconds][nx\|xx] setnx setex | ex seconds: 为键设置秒级过期时间。
px milliseconds: 为键设置毫秒级过期时间。
nx: 键必须不存在, 才可以设置成功, 用于添加。
xx: 与nx相反, 键必须存在, 才可以设置成功, 用于更新。 | +| 获取值 | get key | r如果获取的键不存在 ,则返回nil(空) | +| 批量设置 | mset key value [key value ...] | mset a 1 b 2 c 3 d 4 | +| 批量获取值 | mget key [key ...] | mget a b c d | +| 计数 | incr key decr key incrby key increment(指定数值自增)
decrby key decrement(指定数值自减)
incrbyfloat key increment (浮点数自增) | 值不是整数, 返回错误。 值是整数, 返回自增或自减后的结果。
键不存在,创建键,并按照值为0自增或自减, 返回结果为1。 | +| 追加值 | append key value | 向字符串的默认追加值 | +| 字符串长度 | strlen key | 获取字符串长度,中文占用三个字节 | +| 设置并返回原值 | getset key value | | +| 设置指定位置的租字符串 | setrange key offeset value | | +| 获取部分字符串 | getrange key start end | | + +### 1.3 哈希 + +| 作用 | 格式 | 参数或示例 | +| ------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 设置值 | hset key field value | hset user:1 name tom
hset user:1 age 12 | +| 获取值 | hget key field | hget user:1 name | +| 删除field | hdel key field [field ...] | | +| 计算field个数 | hlen key | | +| 批量设置或获取field-value | hmget key field [field]
hmset key field value [field value...] | hmset user:1 name mike age 12 city tianjin
hmget user:1 name city | +| 判断field是否存在 | hexists key field | | +| 获取所有field | hkeys key | | +| 获取所有value | hvals key | | +| 获取所有的filed-value | hgetall key | 如果哈希元素个数比较多, 会存在阻塞Redis的可能。
获取全部 可以使用hscan命令, 该命令会渐进式遍历哈希类型 | +| 计数 | hincrby key field
hincrbyfloat key field | | + +### 1.4 列表 + +| 作用 | 格式 | 参数或示例 | +| -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 增 | 左侧插入:lpush key value [value ...] 右侧插入:rpush key value [value ...] 某个指定元素前后插入:linsert key before\|after pivot value | | +| 查 | 获取指定范围内的元素列表:lrange key start end 获取列表指定索引下标的元素:lindex key index 获取列表指定长度:llen key | lrange listkey 0 -1 | +| 删 | 从列表左侧弹出元素:lpop key 从列表右侧弹出元素:rpop key 删除指定元素:lrem key count value 截取列表:ltrim key start end | count>0, 从左到右, 删除最多count个元素。
count<0, 从右到左, 删除最多count绝对值个元素。
count=0, 删除所有 | +| 改 | 修改指定索引下标的元素:lset key index newValue | | +| 阻塞操作 | blpop key [key ...] timeout brpop key [key ...] timeout | key[key...]: 多个列表的键。 timeout: 阻塞时间\|等待时间(单位: 秒) | + + + +### 1.5 集合 + +集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, **集合中不允许有重复元素**, 并且集合中的元素是无序的, **不能通过索引下标获取元素**。 + +**集合内操作**: + +| 作用 | 格式 | 参数或示例 | +| -------------------- | ------------------------------ | ----------------------------------------- | +| 添加元素 | sadd key element [element ...] | 返回结果为添加成功的元素个数 | +| 删除元素 | srem key element [element ...] | 返回结果为成功删除的元素个数 | +| 计算元素个数 | scard key | | +| 判断元素是否在集合中 | sismember key element | | +| 随机返回 | srandmember key [count] | 随机从集合返回指定个数元素,count 默认为1 | +| 从集合随机弹出元素 | spop key | srandmember 不会从集合中删除元素,spop 会 | +| 获取集合中所有元素 | smembers key | 可用sscan 代替 | + +**集合间操作**: + +| 作用 | 格式 | +| ---------------------------- | ------------------------------------------------------------ | +| 求多个集合的交集 | sinter key [key ...] | +| 求多个集合的并集 | suinon key [key ...] | +| 求多个集合的差集 | sdiff key [key ...] | +| 将交集、并集、差集的结果保存 | sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...] | + +### 1.6 有序集合 + +有序集合中的元素可以排序。 但是它和列表使用索引下标作为排序依据不同的是, 它给每个元素设置一个分数(score) 作为排序的依据。 + +**集合内操作**: + +| 作用 | 格式 | 参数或示例 | +| ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 添加成员 | zadd key score member [score member ...] | nx: member必须不存在, 才可设置成功, 用于添加。
xx: member必须存在, 才可以设置成功, 用于更新。
ch: 返回此次操作后, 有序集合元素和分数发生变化的个数
incr: 对score做增加, 相当于后面介绍的zincrby。 | +| 计算成员个数 | zcard key | | +| 计算某个成员的分数 | zscore key member | | +| 计算某个成员的排名 | zrank key member zrevrank key member | zrank是从分数从低到高返回排名, zrevrank反之。 | +| 删除成员 | zrem key member [member ...] | | +| 增加成员分数 | zincrby key increment member | zincrby user:ranking 9 tom | +| 返回指定排名范围的成员 | zrange key start end [withscores] zrange key start end [withscores] | zrange是从低到高返回, zrevrange反之。 | +| 返回指定分数范围内的成员 | zrangebyscore key min max \[withscores][limit offset count] zrevrangebyscore key max min \[withscores][limit offset count] | 其中zrangebyscore按照分数从低到高返回, zrevrangebyscore反之。 [limit offset count]选项可以限制输出的起始位置和个数: 同时min和max还支持开区间(小括号) 和闭区间(中括号) , -inf和+inf分别代表无限小和无限大 | +| 删除指定排名内的升序元素 | zremrangerank key start end | | +| 删除指定分数范围的成员 | zremrangebyscore key min max | | + +**集合间操作**: + +| 作用 | 格式 | +| ---- | ------------------------------------------------------------ | +| 交集 | zinterstore destination numkeys key \[key ...] [weights weight [weight ...]] \[aggregate sum\|min\|max] | +| 并集 | zunionstore destination numkeys key \[key ...] [weights weight [weight ...]] \[aggregate sum\|min\|max] | + +- destination: 交集计算结果保存到这个键。 +- numkeys: 需要做交集计算键的个数。 +- key[key...]: 需要做交集计算的键。 +- weights weight[weight...]: 每个键的权重, 在做交集计算时, 每个键中的每个member会将自己分数乘以这个权重, 每个键的权重默认是1。 +- aggregate sum|min|max: 计算成员交集后, 分值可以按照sum(和) 、min(最小值) 、 max(最大值) 做汇总, 默认值是sum。 + +### 1.7 键管理 + +#### 1.7.1 单个键管理 + +##### 1.键重命名 + +**rename key newkey** + + 为了防止被强行rename, Redis提供了renamenx命令, 确保只有newKey不存在时候才被覆盖。 + +##### 2. 随机返回键 + + **random key** + +##### 3.键过期 + +- expire key seconds: 键在seconds秒后过期。 +- expireat key timestamp: 键在秒级时间戳timestamp后过期。 +- pexpire key milliseconds: 键在milliseconds毫秒后过期。 +- pexpireat key milliseconds-timestamp键在毫秒级时间戳timestamp后过期 + +注意: + +1. 如果expire key的键不存在, 返回结果为0 +2. 如果设置过期时间为负值, 键会立即被删除, 犹如使用del命令一样 +3. persist key t命令可以将键的过期时间清除 +4. 对于字符串类型键, 执行set命令会去掉过期时间, 这个问题很容易在开发中被忽视 +5. Redis不支持二级数据结构(例如哈希、 列表) 内部元素的过期功能, 例如不能对列表类型的一个元素做过期时间设置 +6. setex命令作为set+expire的组合, 不但是原子执行, 同时减少了一次网络通讯的时间 + +#### 1.7.2 键遍历 + +##### 1. 全量键遍历 + +**keys pattern** + +##### 2. 渐进式遍历 + +scan cursor \[match pattern] \[count number] + +- cursor是必需参数, 实际上cursor是一个游标, 第一次遍历从0开始, 每次scan遍历完都会返回当前游标的值, 直到游标值为0, 表示遍历结束。 +- match pattern是可选参数, 它的作用的是做模式的匹配, 这点和keys的模式匹配很像。 +- count number是可选参数, 它的作用是表明每次要遍历的键个数, 默认值是10, 此参数可以适当增大。 + +#### 1.7.3 数据库管理 + +##### 1.切换数据库 + +**select dbIndex** + +##### 2.flushdb/flushall + +flushdb/flushall命令用于清除数据库, 两者的区别的是flushdb只清除当前数据库, flushall会清除所有数据库。 \ No newline at end of file diff --git a/spring-boot/spring-boot-redis/src/main/resources/application.yml b/spring-boot/spring-boot-redis/src/main/resources/application.yml index a69b90f..c914396 100644 --- a/spring-boot/spring-boot-redis/src/main/resources/application.yml +++ b/spring-boot/spring-boot-redis/src/main/resources/application.yml @@ -2,8 +2,8 @@ spring: redis: host: 127.0.0.1 port: 6379 - # ĬϲõҲ 0 ݿ redisٷ4.0֮汾ͲƼõڵݿ(db1-db15)ķʽ洢ݣҪӦòüȺʽ + # 默认采用的也是 0 号数据库 redis官方在4.0之后版本就不推荐采用单节点多数据库(db1-db15)的方式存储数据,如果有需要应该采用集群方式构建 database: 0 -# ǼȺڵ ָڵ +# 如果是集群节点 采用如下配置指定节点 #spring.redis.cluster.nodes \ No newline at end of file diff --git a/spring-boot/spring-boot-redis/src/test/java/com/heibaiying/springbootredis/RedisObjectTests.java b/spring-boot/spring-boot-redis/src/test/java/com/heibaiying/springbootredis/RedisObjectTests.java index 58be9ab..086449f 100644 --- a/spring-boot/spring-boot-redis/src/test/java/com/heibaiying/springbootredis/RedisObjectTests.java +++ b/spring-boot/spring-boot-redis/src/test/java/com/heibaiying/springbootredis/RedisObjectTests.java @@ -2,7 +2,6 @@ package com.heibaiying.springbootredis; import com.heibaiying.springbootredis.bean.Programmer; import com.heibaiying.springbootredis.redis.RedisObjectOperation; -import com.heibaiying.springbootredis.redis.RedisOperation; import org.assertj.core.util.Sets; import org.junit.Assert; import org.junit.Test; @@ -11,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import java.time.LocalDate; import java.util.Arrays; import java.util.Date; diff --git a/spring-boot/spring-boot-servlet/README.md b/spring-boot/spring-boot-servlet/README.md new file mode 100644 index 0000000..a772cb9 --- /dev/null +++ b/spring-boot/spring-boot-servlet/README.md @@ -0,0 +1,230 @@ +# spring boot 整合 servlet + +## 一、说明 + +#### 1.1 项目结构说明 + +1. 项目提供与servlet整合的两种方式,一种是servlet3.0 原生的注解方式,一种是采用spring 注册的方式; +2. servlet、过滤器、监听器分别位于servlet、filter、listen 下,其中以Annotation命名结尾的代表是servlet注解方式实现,采用spring注册方式则在ServletConfig中进行注册; +3. 为了说明外置容器对servlet注解的自动发现机制,项目采用外置容器构建,关于spring boot 整合外置容器的详细说明可以参考[spring-boot-tomcat](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-tomcat) + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-servlet.png) + +#### 1.2 项目依赖 + +```xml + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + javax.servlet + javax.servlet-api + + +``` + +## 二、采用spring 注册方式整合 servlet + +#### 2.1 新建过滤器、监听器和servlet + +```java +/** + * @author : heibaiying + * @description : 自定义过滤器 + */ + +public class CustomFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + request.setAttribute("filterParam","我是filter传递的参数"); + chain.doFilter(request,response); + response.getWriter().append(" CustomFilter "); + } + + @Override + public void destroy() { + + } +} +``` + +```java +/** + * @author : heibaiying + * @description : 自定义监听器 + */ +public class CustomListen implements ServletContextListener { + + //Web应用程序初始化过程正在启动的通知 + @Override + public void contextInitialized(ServletContextEvent sce) { + System.out.println("容器初始化启动"); + } + + + + /* 通知servlet上下文即将关闭 + * 这个地方如果我们使用的是spring boot 内置的容器 是监听不到销毁过程,所以我们使用了外置 tomcat 容器 + */ + @Override + public void contextDestroyed(ServletContextEvent sce) { + System.out.println("容器即将销毁"); + } +} +``` + +```java +/** + * @author : heibaiying + * @description : 自定义servlet + */ +public class CustomServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + System.out.println("doGet 执行:" + req.getAttribute("filterParam")); + resp.getWriter().append("CustomServlet"); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + doGet(req, resp); + } +} +``` + +#### 2.2 注册过滤器、监听器和servlet + +```java +/** + * @author : heibaiying + */ +@Configuration +public class ServletConfig { + + @Bean + public ServletRegistrationBean registrationBean() { + return new ServletRegistrationBean(new CustomServlet(), "/servlet"); + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean bean = new FilterRegistrationBean(); + bean.setFilter(new CustomFilter()); + bean.addUrlPatterns("/servlet"); + return bean; + } + + @Bean + public ServletListenerRegistrationBean listenerRegistrationBean() { + return new ServletListenerRegistrationBean(new CustomListen()); + } + +} +``` + +## 三、采用注解方式整合 servlet + +#### 3.1 新建过滤器、监听器和servlet,分别使用@WebFilter、@WebListener、@WebServlet注解标注 + +```java +/** + * @author : heibaiying + * @description : 自定义过滤器 + */ + +@WebFilter(urlPatterns = "/servletAnn") +public class CustomFilterAnnotation implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + chain.doFilter(request,response); + response.getWriter().append(" CustomFilter Annotation"); + } + + @Override + public void destroy() { + + } +} +``` + +```java +/** + * @author : heibaiying + * @description :自定义监听器 + */ +@WebListener +public class CustomListenAnnotation implements ServletContextListener { + + //Web应用程序初始化过程正在启动的通知 + @Override + public void contextInitialized(ServletContextEvent sce) { + System.out.println("容器初始化启动 Annotation"); + } + + + + /* 通知servlet上下文即将关闭 + * 这个地方如果我们使用的是spring boot 内置的容器 是监听不到销毁过程,所以我们使用了外置 tomcat 容器 + */ + @Override + public void contextDestroyed(ServletContextEvent sce) { + System.out.println("容器即将销毁 Annotation"); + } +} +``` + +```java + +/** + * @author : heibaiying + * @description : 自定义servlet + */ +@WebServlet(urlPatterns = "/servletAnn") +public class CustomServletAnnotation extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.getWriter().append("CustomServlet Annotation"); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + doGet(req, resp); + } +} +``` + +#### 3.2 使注解生效 + +1. 如果是内置容器,需要在启动类上添加@ServletComponentScan("com.heibaiying.springbootservlet") ,指定扫描的包目录; +2. 如果是外置容器,不需要进行任何配置,依靠容器内建的discovery机制自动发现,需要说明的是这里的容器必须支持servlet3.0(tomcat从7.0版本开始支持Servlet3.0)。 \ No newline at end of file diff --git a/spring-boot/spring-boot-servlet/pom.xml b/spring-boot/spring-boot-servlet/pom.xml index 3cb5319..9ce8692 100644 --- a/spring-boot/spring-boot-servlet/pom.xml +++ b/spring-boot/spring-boot-servlet/pom.xml @@ -37,17 +37,16 @@ 2.5 provided - - - org.springframework.boot - spring-boot-starter-test - test - javax.servlet javax.servlet-api + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/spring-boot/spring-boot-servlet/src/main/java/com/heibaiying/springbootservlet/servlet/CustomServletAnnation.java b/spring-boot/spring-boot-servlet/src/main/java/com/heibaiying/springbootservlet/servlet/CustomServletAnnotation.java similarity index 92% rename from spring-boot/spring-boot-servlet/src/main/java/com/heibaiying/springbootservlet/servlet/CustomServletAnnation.java rename to spring-boot/spring-boot-servlet/src/main/java/com/heibaiying/springbootservlet/servlet/CustomServletAnnotation.java index bd4d69e..de6cf62 100644 --- a/spring-boot/spring-boot-servlet/src/main/java/com/heibaiying/springbootservlet/servlet/CustomServletAnnation.java +++ b/spring-boot/spring-boot-servlet/src/main/java/com/heibaiying/springbootservlet/servlet/CustomServletAnnotation.java @@ -12,7 +12,7 @@ import java.io.IOException; * @description : 自定义servlet */ @WebServlet(urlPatterns = "/servletAnn") -public class CustomServletAnnation extends HttpServlet { +public class CustomServletAnnotation extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { diff --git a/spring-boot/spring-boot-tomcat/README.md b/spring-boot/spring-boot-tomcat/README.md new file mode 100644 index 0000000..ba6597d --- /dev/null +++ b/spring-boot/spring-boot-tomcat/README.md @@ -0,0 +1,101 @@ +# spring boot 整合 tomcat + +## 一、说明 + +#### 1.1 项目结构说明 + +spring boot 整合 tomcat 后支持jsp 的使用(内置容器默认是不支持jsp),所以项目整合后采用jspController 跳转到show.jsp测试整合是否成功。 + +![spring-boot-servlet](D:\spring-samples-for-all\pictures\spring-boot-tomcat.png) + +#### 1.2 项目主要依赖 + +```xml + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + javax.servlet + servlet-api + 2.5 + provided + +``` + +## 二、整合 tomcat + +#### 2.1 修改启动类,继承自SpringBootServletInitializer,并覆盖重写其中configure方法 + +```java +/** + * 如果用外置tomcat,启动报错java.lang.NoClassDefFoundError: javax/el/ELManager + * 是因为tomcat 7.0 el-api包中没有ELManager类 , 切换tomcat 为8.0 以上版本即可 + */ +@SpringBootApplication +public class SpringBootTomcatApplication extends SpringBootServletInitializer { + + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + //传入SpringBoot应用的主程序 + return application.sources(SpringBootTomcatApplication.class); + } + + public static void main(String[] args) { + SpringApplication.run(SpringBootTomcatApplication.class, args); + } + +} +``` + +#### 2.2 在application.yml 中指定访问视图文件的前缀和后缀 + +```yml +spring: + mvc: + view: + prefix: /WEB-INF/jsp/ + suffix: .jsp +``` + +#### 2.3 新建controller和show.jsp 测试整合是否成功 + +```java +@Controller +@RequestMapping("index") +public class JspController { + + @RequestMapping + public String jsp(Model model){ + Programmer programmer = new Programmer("heibai", 21, 1298.31f, LocalDate.now()); + model.addAttribute("programmer",programmer); + return "show"; + } +} +``` + +```jsp +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + programmer + + + +
    +
  • 姓名: ${programmer.name}
  • +
  • 年龄: ${programmer.age}
  • +
+ + +``` + diff --git a/spring-boot/spring-boot-websocket/README.md b/spring-boot/spring-boot-websocket/README.md new file mode 100644 index 0000000..6682892 --- /dev/null +++ b/spring-boot/spring-boot-websocket/README.md @@ -0,0 +1,183 @@ +# spring boot websocket + +## 一、说明 + +### 1.1 项目结构说明 + +1. 项目模拟一个简单的群聊功能,为区分不同的聊天客户端,登录时候将临时用户名存储在session当中; +2. 关于websocket的主要配置在websocket文件夹下; +3. 模板引擎采用freemaker; +4. 项目以web的方式构建。 + +![spring-scheduling](D:\spring-samples-for-all\pictures\spring-boot-websocket.png) + + + +### 1.2 主要依赖 + +```xml + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-freemarker + +``` + + + +## 二、spring boot websocket + +#### 2.1 创建消息处理类ChatSocket,使用@ServerEndpoint声明websocket服务 + +```java +@ServerEndpoint(value = "/socket/{username}") +@Component +public class ChatSocket { + + /** + * 建立连接时候触发 + */ + @OnOpen + public void onOpen(Session session, @PathParam("username") String username) { + // 这个方法是线程不安全的 + Constant.nameAndSession.putIfAbsent(username, session); + } + + + /** + * 关闭连接时候触发 + */ + @OnClose + public void onClose(Session session, @PathParam("username") String username) { + Constant.nameAndSession.remove(username); + } + + /** + * 处理消息 + */ + @OnMessage + public void onMessage(Session session, String message, @PathParam("username") String username) throws UnsupportedEncodingException { + // 防止中文乱码 + String msg = URLDecoder.decode(message, "utf-8"); + // 简单模拟群发消息 + Constant.nameAndSession.forEach((s, webSocketSession) + -> { + try { + webSocketSession.getBasicRemote().sendText(username + " : " + msg); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } +} + +``` + +#### 2.2 配置ServerEndpointExporter,ServerEndpointExporter会在运行时候自动注册我们用@ServerEndpoint声明的websocket服务。 + +```java +@Configuration +public class WebSocketConfig { + + /*** + * 检测{@link javax.websocket.server.ServerEndpointConfig}和{@link ServerEndpoint} 类型的bean, + * 并在运行时使用标准Java WebSocket时注册。 + * 我们在{@link com.heibaiying.springboot.websocket.WebSocketConfig}中就是使用@ServerEndpoint去声明websocket服务 + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} +``` + +#### 2.3 前端websocket的实现 + +```jsp + + + + ${Session["username"]}您好!欢迎进入群聊大厅! + + +
${Session["username"]}您好!欢迎进入群聊大厅!
+ + +
+ +
+ + + + +``` + +#### 2.4 简单登录的实现 + +```java + + + + Title + + +
+ + +
+ + +``` + +```java +/** + * @description : 简单登录 + */ +@Controller +public class LoginController { + + @PostMapping("login") + public String login(String username, HttpSession session) { + session.setAttribute(Constant.USER_NAME, username); + return "chat"; + } + + @GetMapping + public String index() { + return "index"; + } +} +``` + diff --git a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/constant/Constant.java b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/constant/Constant.java index 4a3b0a8..529eb1d 100644 --- a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/constant/Constant.java +++ b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/constant/Constant.java @@ -4,11 +4,7 @@ import javax.websocket.Session; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -/** - * @author : 罗祥 - * @description : - * @date :create in 2018/12/27 - */ + public interface Constant { String USER_NAME="username"; diff --git a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/controller/LoginController.java b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/controller/LoginController.java index 582497f..868311f 100644 --- a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/controller/LoginController.java +++ b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/controller/LoginController.java @@ -8,9 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping; import javax.servlet.http.HttpSession; /** - * @author : 罗祥 * @description : 简单登录 - * @date :create in 2018/12/27 */ @Controller public class LoginController { diff --git a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/ChatSocket.java b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/ChatSocket.java index 4080827..40474bf 100644 --- a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/ChatSocket.java +++ b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/ChatSocket.java @@ -21,20 +21,28 @@ import java.net.URLDecoder; @Component public class ChatSocket { - - @OnOpen //建立连接时候触发 + /** + * 建立连接时候触发 + */ + @OnOpen public void onOpen(Session session, @PathParam("username") String username) { // 这个方法是线程不安全的 Constant.nameAndSession.putIfAbsent(username, session); } - @OnClose //关闭连接时候触发 + /** + * 关闭连接时候触发 + */ + @OnClose public void onClose(Session session, @PathParam("username") String username) { Constant.nameAndSession.remove(username); } - @OnMessage //处理消息 + /** + * 处理消息 + */ + @OnMessage public void onMessage(Session session, String message, @PathParam("username") String username) throws UnsupportedEncodingException { // 防止中文乱码 String msg = URLDecoder.decode(message, "utf-8"); diff --git a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/WebSocketConfig.java b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/WebSocketConfig.java index 4bba5dd..4e97831 100644 --- a/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/WebSocketConfig.java +++ b/spring-boot/spring-boot-websocket/src/main/java/com/heibaiying/springboot/websocket/WebSocketConfig.java @@ -4,12 +4,19 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; +import javax.websocket.server.ServerEndpoint; + /** * @author : heibaiying */ @Configuration public class WebSocketConfig { + /*** + * 检测{@link javax.websocket.server.ServerEndpointConfig}和{@link ServerEndpoint} 类型的bean, + * 并在运行时使用标准Java WebSocket时注册。 + * 我们在{@link com.heibaiying.springboot.websocket.WebSocketConfig}中就是使用@ServerEndpoint去声明websocket服务 + */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); diff --git a/spring-boot/spring-boot-yml-profile/README.md b/spring-boot/spring-boot-yml-profile/README.md new file mode 100644 index 0000000..937d48d --- /dev/null +++ b/spring-boot/spring-boot-yml-profile/README.md @@ -0,0 +1,247 @@ +# spring-boot 基础 + +## 一、说明 + +#### 1.1 项目结构说明 + +1. 本项目搭建一个简单的hello spring 的 web工程,简单说明spring-boot 的开箱即用的特性; +2. 模板引擎采用freemaker 和 thymeleaf 作为示例,分别对应模板文件makershow.ftl 和 leafShow.html; +3. spring boot 2.x 默认是不支持jsp的,需要额外的配置,关于使用jsp的整合可以参考spring-boot-jsp项目。 + +![spring-boot-base](D:\spring-samples-for-all\pictures\spring-boot-base.png) + +#### 1.2 项目依赖 + +导入相关的starter(启动器) + +```xml + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.1.RELEASE + + + com.heibaiying + spring-boot-base + 0.0.1-SNAPSHOT + spring-boot-base + Demo project for Spring Boot + + + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + +``` + +1. spring boot 项目默认继承自spring-boot-starter-parent,而spring-boot-starter-parent继承自spring-boot-dependencies, spring-boot-dependencies中定义了关于spring boot 依赖的各种jar包的版本,是spring boot 的版本管理中心。 + +![spring-boot-dependencies](D:\spring-samples-for-all\pictures\spring-boot-dependencies.png) + +2. 关于spring boot 2.x官方支持的所有starter 可以参见官方文档 [Table 13.1. Spring Boot application starters](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#using-boot-starter) + + + +## 二、spring boot 主启动类 + + 如果采用IDEA 或者 Spring Tool Suite (STS) 等开发工具创建的spring boot 工程,会默认创建启动类,如果没有创建,需要手动创建启动类 + +```java +package com.heibaiying.springbootbase; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootBaseApplication { + + // 启动类默认开启包扫描,扫描与主程序所在包及其子包,对于本工程而言 默认扫描 com.heibaiying.springbootbase + public static void main(String[] args) { + SpringApplication.run(SpringBootBaseApplication.class, args); + } + +} +``` + +@SpringBootApplication 注解是一个复合注解,里面包含了@ComponentScan注解,默认开启包扫描,扫描与主程序所在包及其子包,对于本工程而言 默认扫描 com.heibaiying.springbootbase + +```java +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@SpringBootConfiguration +@EnableAutoConfiguration +@ComponentScan(excludeFilters = { + @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), + @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) +public @interface SpringBootApplication { + ... +} +``` + + + +## 三、开箱即用的web工程 + +在springbootBaseApplication.java 的同级目录创建controller文件夹,并在其中创建RestfulController.java,启动项目访问localhost:8080/restful/programmers 即可看到项目搭建成功。 + +```java +/** + * @author : heibaiying + * @description : restful 控制器 + */ +@RestController +@RequestMapping("restful") +public class RestfulController { + + @GetMapping("programmers") + private List getProgrammers() { + List programmers = new ArrayList<>(); + programmers.add(new Programmer("xiaoming", 12, 100000.00f, LocalDate.of(2019, Month.AUGUST, 2))); + programmers.add(new Programmer("xiaohong", 23, 900000.00f, LocalDate.of(2013, Month.FEBRUARY, 2))); + return programmers; + } +} +``` + +这里之所以能够开箱即用,是因为我们在项目中导入spring-boot-starter-web启动器,而@SpringBootApplication 复合注解中默认开启了@EnableAutoConfiguration注解允许开启自动化配置,spring在检查导入starter-web的依赖后就会开启web的自动化配置。 + + + +## 四、模板引擎 + +这里我们在一个项目中同时导入了freemaker 和 thymeleaf的starter(虽然并不推荐,但是在同一个项目中是可以混用这两种模板引擎的)。 + +#### 4.1 freemarker + +```java +/** + * @author : heibaiying + * @description : 跳转渲染模板引擎 默认模板的存放位置为classpath:templates + */ +@Controller +@RequestMapping("freemarker") +public class FreeMarkerController { + + @RequestMapping("show") + private String programmerShow(ModelMap modelMap){ + List programmerList=new ArrayList<>(); + programmerList.add(new Programmer("xiaoming",12,100000.00f,LocalDate.of(2019,Month.AUGUST,2))); + programmerList.add(new Programmer("xiaohong",23,900000.00f,LocalDate.of(2013,Month.FEBRUARY,2))); + modelMap.addAttribute("programmers",programmerList); + return "markerShow"; + } +} + +``` + +```html + + + + + freemarker模板引擎 + + +
    + <#list programmers as programmer> +
  • 姓名: ${programmer.name} 年龄: ${programmer.age}
  • + +
+ + +``` + +#### 4.2 thymeleaf + +```java +/** + * @author : heibaiying + * @description : 跳转渲染模板引擎 默认模板的存放位置为classpath:templates + */ +@Controller +@RequestMapping("thymeleaf") +public class ThymeleafController { + + @RequestMapping("show") + private String programmerShow(ModelMap modelMap) { + List programmerList = new ArrayList<>(); + programmerList.add(new Programmer("xiaoming", 12, 100000.00f, LocalDate.of(2019, Month.AUGUST, 2))); + programmerList.add(new Programmer("xiaohong", 23, 900000.00f, LocalDate.of(2013, Month.FEBRUARY, 2))); + modelMap.addAttribute("programmers", programmerList); + return "leafShow"; + } +} + +``` + +```html + + + + + thymeleaf模板引擎 + + +
    +
  • + 姓名: + 薪水: +
  • +
+ + +``` + +#### 4.3 文档说明 + +freemarker:提供了完善的中文文档,地址 http://freemarker.foofun.cn/ + +thymeleaf:官方英文文档地址:[thymeleaf 3.0.11RELEASE](https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.pdf) + +注:我在本仓库中也上传了一份[thymeleaf中文文档(gangzi828(刘明刚 译)](https://github.com/heibaiying/spring-samples-for-all/tree/master/referenced%20documents),翻译的版本为3.0.5RELEASE \ No newline at end of file diff --git a/spring-boot/spring-boot-yml-profile/src/main/resources/application.yml b/spring-boot/spring-boot-yml-profile/src/main/resources/application.yml index 0b9e370..7c5541a 100644 --- a/spring-boot/spring-boot-yml-profile/src/main/resources/application.yml +++ b/spring-boot/spring-boot-yml-profile/src/main/resources/application.yml @@ -1,10 +1,10 @@ -# ָ +# 指定启动的配置 spring: profiles: active: dev -# õIJȼ devûage,Իõģproddev,ᰴվȷȣʹdevе -# õȼԲ鿴ĿREADME.md +# 配置的补充与优先级 在dev中没有配置age,所以会采用主配置的,在prod中配置dev,会按照精确优先,使用dev中的配置 +# 更多配置的优先级可以查看项目的README.md programmer: age: 999 diff --git a/spring/spring-dubbo-annotation/README.md b/spring/spring-dubbo-annotation/README.md index bf9d8fb..75b8e75 100644 --- a/spring/spring-dubbo-annotation/README.md +++ b/spring/spring-dubbo-annotation/README.md @@ -16,7 +16,7 @@ ## 二、项目依赖 -**在父工程的项目中同一导入依赖dubbo依赖的的jar包** +**在父工程的项目中统一导入依赖dubbo依赖的的jar包** 这里需要注意的是ZooKeeper 3.5.x 和 ZooKeeper 3.4.x 是存在不兼容的情况 详见官网解释[ZooKeeper Version Compatibility](https://curator.apache.org/zk-compatibility.html), zookeeper 3.5 目前是beta版本,所以zookeeper 我选择的版本是 zookeeper-3.4.9 作为服务端。但默认情况下 curator-framework自动引用的最新的3.5的版本客户端,会出现 KeeperException$UnimplementedException 异常 diff --git a/spring/spring-dubbo/README.md b/spring/spring-dubbo/README.md index 52b799b..bc4bc80 100644 --- a/spring/spring-dubbo/README.md +++ b/spring/spring-dubbo/README.md @@ -16,7 +16,7 @@ ## 二、项目依赖 -**在父工程的项目中同一导入依赖dubbo依赖的的jar包** +**在父工程的项目中统一导入依赖dubbo依赖的的jar包** 这里需要注意的是ZooKeeper 3.5.x 和 ZooKeeper 3.4.x 是存在不兼容的情况 详见官网解释[ZooKeeper Version Compatibility](https://curator.apache.org/zk-compatibility.html), zookeeper 3.5 目前是beta版本,所以zookeeper 我选择的版本是 zookeeper-3.4.9 作为服务端。但默认情况下 curator-framework自动引用的最新的3.5的版本客户端,会出现 KeeperException$UnimplementedException 异常 diff --git a/spring/spring-websocket-annotation/README.md b/spring/spring-websocket-annotation/README.md index 1306854..c235a81 100644 --- a/spring/spring-websocket-annotation/README.md +++ b/spring/spring-websocket-annotation/README.md @@ -4,7 +4,7 @@ ### 1.1 项目结构说明 -1. 项目模拟一个简单的群聊功能,为区分不同的聊天客户端,登录时候用临时用户名作为session的id; +1. 项目模拟一个简单的群聊功能,为区分不同的聊天客户端,登录时候将临时用户名存储在session当中; 2. webconfig 包是基础注解的方式配置web,在spring-base-annotation项目中已经讲解过每个类作用; 3. CustomHander为消息的自定义处理器; 4. CustomHandershakerInterceptor为自定义的 websocket 的握手拦截器; diff --git a/spring/spring-websocket/README.md b/spring/spring-websocket/README.md index 8f82b01..7752223 100644 --- a/spring/spring-websocket/README.md +++ b/spring/spring-websocket/README.md @@ -4,7 +4,7 @@ ### 1.1 项目结构说明 -1. 项目模拟一个简单的群聊功能,为区分不同的聊天客户端,登录时候用临时用户名作为session的id; +1. 项目模拟一个简单的群聊功能,为区分不同的聊天客户端,登录时候将临时用户名存储在session当中; 2. CustomHander为消息的自定义处理器; 3. CustomHandershakerInterceptor为自定义的 websocket 的握手拦截器; 4. 项目以web的方式构建。

h_1yf*T2c-OQ=d12js@_ zp7Gocm}eN9?e(J7SbbW~jEa*5-s!WSBkecLWJfpSuZxBQwe*-j0_(QQe3DK^>XnCw zCIkzF2$aBMrlhRgK!WTe@k|UHk<|clvE4+0xbQrI&rL-PtJN**u*%Qp6LUkGiNKYVf$`*yv@ah|)xftd7N59( z70)Z!FGi%X8XC5MnmR&(lxebMY?T>0CKRv`RmJ{c6E0Jc-b z9{Rew=OJOex7`r4;D=DACN52Lt=SgsI$0=c7|{9rzcR02vD(F$3)7#qcF1Z8t@9NT z13Ju2oq2)zu>G0uVcYoJd*PC{O_U(mhy#ut-@@0(4X_LAUMtb(%gdAw>MH6;0I})v z?pco_9vWx;F>;fhYjjHaO1Urze#6-u!>GTrSyZZK=8oYO=YYwr?i+MJQMR%EYHI7w zU(K3wucI$>ZWoT{=-ctneUf}LLvfMk)47`)xMGm1P@g!Ux9^p+!fw=-Bo&TdzBVtT z2yY9H#%pFOt@i~TAr)DA5-1cP{rUKghHw=^eOvxaPct6RpYQ6>AFPl(B?M1n^`X-+a9|0H&>rqiUV>t;DM5nn(# zBIc7kQ8P)z4#G@wet1#)8$wofeYGOyk5tRGqJU+6`53A8YfCE`d_4@zjl z9hXCpM=VQSgs;u?pm7X}%;K4!p|AyMmTuyB^|Dz`{4?^p>g z`bY2VlM}Xw#3Ue@Rc$0X{;5C!R~DoiIj>%Qx$&`Vh5Ev6?y|?o z_>r?WQ+l#X?D_J1ns)vyp3o0^ryI&2QRAP@(BT;GF>0)q zt1Kan5Jl03k&hy^`9_%y^Q}P9{wtrmWhW#HCC!W!=lve!DmMmLCM_KpUN7#%_G8kQ zzo;dcD6aXf{Q(>d-lL$i-6d*}!{~A=iQp<;iWm%s+J2GDkabzcQb{1%Ta6igTv1WP zI0R4^)Zo9;Ve+a0lEfXud_JiRY70*@g@ta+Iu`2XkB|JrZ|VY~;E45|aNGl_l|S%# z&*O?Q3wDkKu-t!zyu;z&mx6HeHcN8rmq^`oPtPvt#Fw=Y1y}}p$=@v$t57dEY^pen z9;t!+X|ubQJC4_cy|-{i}8rOZ(3Mt{8O(Uz{a8tyvlzPvZ8szAhuKCD_+n^u#bhN7YiSe2g=DM6?=DOJ= zNfxXbJhG(*{!r%(h67512`$I4jGoHz%D={xmA_)a z|3w}bclzyLvK+0oYm)bxgb!Wg^!Qi;5+|_Nx|37sLo8@}vHn-E1wI!5r9{QyV)66G zi(0<&88W)Qs;s?MK>>lxsw!<4Lt9(Uq@<)@3v_fl5fQ&yZoDO~?jI8A^z`&FnwN0W zxry!fO#|U_<DI~PZugx3?Z8Q5}3o+18Bi5B-`-MTwHQ}S% z;(lp0Sz2QPzXmE5ztT2hU*IZKt#MejYJ)xh`OhHVMYx7ZSuQqs)E&weSCcjOC zzJQZ)h!~{L!v55@AFmi--%5(h+3Etp+4~5V*=nrEqT)?7GAn>Imcw-|>v;hMDGk^2 zIxIo=4iQiY|I?FSwd`Z6-ZCWM9l9~HDRaQyd@%&tS?HvHReE9MWJW+vCZzt`(o#RG zwgiK>ga0prKA?N!$`XXvAzwf-5P=RnI!iEh2mq%qCG7Jf5J#7Ga7d6^Uy&-Z5O*lSu{9OV{0tP4fn;9ADFxKH%{1}qP zgAfH0lEjw=s2DaOEdLae@v5TlM&yc?n7aWHm8ZAmKSWe^Kt#>lB0*r=WrM5Tv~cOR zVWmSI1u&$XJbIB~1En2I`Jz_d3Q(0Tj*%v&1rk-^g? zAq7=|luv;hx#SBbxulgatEbze0Jk>-M90V}O5OPeH0xxc6=0Wi);!8qfHqsO~r1UsMyf|3VxhqmOEhg8*lc zlhFogV6KFdkx!;kGuNnLA>bEctRPgMs%GKJao#MT0HWvws!?T_$fQhyg@oEMAj{(% zBOpKw5W4?%F8?8KK&R}l_xxY|%m1OENm{7p0MTtcNAPtgzw1gGC2IhRQ-x|fw--q+ zE*nQ`I1_mnunoW!)BP%2E)Hr^Ariyq;jdGsMD*k21=gkkoOG#&wMi>+U(xQAD|D}a zXmgtLjliB={6W+g2=hsK?xF>p{BDi_-!5I0?`)D4K=Jt`tw>Zj#`X1xmsD>+?Bt;Q z@%U_QwJIRDd4L^P{#cSo;h}cKuGhM&Grwj%9s(Ki`xCZ2 z;6e)pYIfcA6xea5O{_O(>nh9dYF_1no4EmKq)E*o7&dSO)T*=pkiIDH@xX?t+*b*fOENR}%aKC}|oPw)|{!cC6)@Z%8@btcCm( zN&HMC@%b8GxNs&f(+NTBL=v@>a*BxgE)(S;&nYc3;veqvtuy(dau0$? zFB`f6<5?vnYiAKiH~I#>OBXVw*J&tKmx z?w!d~CHIvTQ)@WQPp70i&1ZW+^ac(^CQmu26&+W7U~(C2*Js^#H)0ukT1hKs_WtIE z#_9t+uMs~f4{5gqt7juP+|WjZEDtvg@iRR)XTBrP@=62YEuuiB%qp>BlD;{7t1;%f z?6#9VG*zhIk3*xNV|ivox!=M)9rWn$SKAd@8sqxTSH2b2j$X<85<#;KH@AAkkr6zU z=vWvcX!YaJVP5s;MLO#+JhLKUb%MwK7;Y>OrEKncZ$tpv6864-`f8Gl8dDY}D33G* zyQOsMYI*j=CFIgvI(17ryq%<}#|%j1vcxzbbbA{qteh*4=r8NJ~h(-jl9!?K+83KZ*6>+M7sc=b8KG z;xJwAW<(8ntd2v$1Ju_TdymME{PRJIC>Om>*8eJ_pjgVhqW3c+wd@uUk6>9uIhqe{ zU|cn}e-be7f7%KDM>zh)>!&tB&IQdLn&}JUB1;pZi-TYT3&{7xzRmscmskK4XZ=md zLv7jDVJxPA!bbxrd|gt3Id5FcxZ9i@E>s zX5i9cEbA}e_|fhC(Y46slrPY`BN5K<>)US7fTIBFbJmgxqW@BlDc_1}#J-!7_{ zRcbJw`fNbE?JKi>{9ObbF&hQrQID~EW~BD0aUh+T(r2bIr2j(Y|C0B50QqDA#zrRv z0{!iLai}fOL0L_M8OIPXY><29shuzHibmijgJY@M6crvA$-u5j3T7YG++?+ zFKfZmSDGw-2LL)BtjYr)*!}E|^yc5p206rnFCmu30h6r_9;eUh8nc%ux<~C}@~ggN z;^n=#ri%y1;HmIb_kI+K#X8VzLk?%*^j>zQQom);c{bLB6K@;{sarD9Xk(vUj?{L^f)8aJoTd(B(uYZXQ9Ow)%6v{**+2AgU|`QmUI zVDe%Nspwz~o6p9MjD1u@GjwgM3ULM$ft+;Xd5Ju>5v+i8%SQH8EB}Q<1w%k-fpfKg z2hI9j%qvNdMM4Q95ico7F+xx1FVWR8O@<>@(3)QkHedo{UOWN z-$fwsYY}1q?H1+p#*A5Am``r#!0A9 zJ+k7b_PPitpE}C|^Dp@#A_~MA-%2$`xOvKDt%zQrtwsT9yby93FLHK*$ zM^>u4^Yr88(nri;6m|DiKaZ-AyvC*~LeLR#jKWRypzG*%)xQ`%#+Z-lY5})uuLR$+=gHOC7K-nA3TJ+S8 z_}iZBD1%Q^RRPMwW_-><+_AkM_E{9sW$T>I(&jWx-mA3h48( zR|i|z3vTC|S9-Q(XS`O6ISvfKJ^9|SS4{6by-3?}WfUj@7a5Ims(5%Kb5q+iu*GD< zU19r>@jmY28ySx+vwxTnp;HH%9o;c0B4I9~$*}X0d|{U=`h#DhG1qVd{mSiePo4?a zjqN-&oX^{57hxv=Gfca2HsV{vywho0=h|`MjY*LRDlHd*NI`m+No=U*94FG99UF6& zEI_JW~*z%T2`WmSmrfH)tCg@uXCScFU%63b{( zr-QD2mQUgRGL8)BtDYtNKC~RV9qLIwx{4zHyOje!x)NoYKYse0`dLVh^E(R#PcTR} z`nt?S7CV>O)UvYkuPQ?d^T=tDGX1zO7s3QD#YZ7wrfMuVf%FW4t=QJWPL~wj?O3qR zxH$guo5D*vH7jArr_d~JXs_qxR^Vt2+2gOf+(ZvIKR@LOf+vEV+hY+*QG|Eh;hijh ztmzBbiw0ltd+tKZ7=$E40M#6*q7u8YnCukC<|8dbNrxC)kx4hQ7Zz~qDFKmvitGob zX4crUT=sm(FA=3?T*C>zSD@?M@vS}2 zw52TEV!oC66;~pI2ZAT#q;uwq_j*VRM$q%>FFTIJG$Gn8TK79dd$-qEaJ{q-$ zys|JW3b{mNv ziO-p?(0;bIbf??P%@6%1;k7|EPcV#(m0XJ07j1668l`s}jC*w~q@4rYSi9PpU6*+0 zlLp)}u5^GUFvZ-DD=NI>hxaROBf1>mb(Ft0O9#yV{%e|l&#_;#?lM}*i>Er3l6lMt z^71ainCPC`o>*44OTn*`eE>Nc>_RIy8#p=E@T2qrx5u?7= zLAyi9sUeVaNSFUW4w=v*fCKKOvIL8pJ|dQRg?bbVJg7y;?qB{&^q>CtJ0f?!ZAi*C%MpC2w2a5m8064bRQ*E?a zhXsKc;QjB(QBNY~)f(|5n9p{#Q^R5M=#Zfi%Q2a}+VFwMZvKRMK~k;f-Dwz${7m3v zFVL(!p8oAOY%WbS85kf9S`lb=hKQsr)eJ= zgS65n-`Ih{E^>f+bgx%!td}8>*CVm%i8c@a^T>YiVI0wSupkjzeVzl^3Z1W^mV#q8N*Zk z(2pCx2sa@&bcP>JUyKIEwmhQemg(Ett{dohwVmy@l0B`Xh@@rHUNkL~wK{ss12?ZV z{bn#<4R2lP$&L7{=b@oU#2#p6qqey(JbuJ-ccn!>rwE87ZXip0J{=K(v(#3k4fszgVEeQPE;PFf8(2%E+})Sq#OTjoREvf02A(1s6KyQjgY5-v<*mo{ zT7KQ~%Hyt<$U&MsRebZb$I#fo{SMVO~wqgkJ?WpAsjmP(Q{-_M*8NwnpR?9Ik7 zm+digFFyxW-@EFo19!V1bivV%*8v#z#$sn{=%0A8SHObdb@v)siC=7CmQcfxZG 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 literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-redis.png b/pictures/spring-boot-redis.png new file mode 100644 index 0000000000000000000000000000000000000000..89621cb2dfc23fea9c993b85e1ca48cf25e56629 GIT binary patch literal 17299 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 mKZsq5lgsI`$j@ literal 0 HcmV?d00001 diff --git a/pictures/spring-boot-servlet.png b/pictures/spring-boot-servlet.png new file mode 100644 index 0000000000000000000000000000000000000000..81f9c317e257341bd01b4e1a4792a78209bb9e81 GIT binary patch literal 17179 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 + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.1.RELEASE + + + com.heibaiying + spring-boot-base + 0.0.1-SNAPSHOT + spring-boot-base + Demo project for Spring Boot + + + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + +``` + +1. spring boot 项目默认继承自spring-boot-starter-parent,而spring-boot-starter-parent继承自spring-boot-dependencies, spring-boot-dependencies中定义了关于spring boot 依赖的各种jar包的版本,是spring boot 的版本管理中心。 + +![spring-boot-dependencies](D:\spring-samples-for-all\pictures\spring-boot-dependencies.png) + +2. 关于spring boot 2.x官方支持的所有starter 可以参见官方文档 [Table 13.1. Spring Boot application starters](https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#using-boot-starter) + + + +## 二、spring boot 主启动类 + + 如果采用IDEA 或者 Spring Tool Suite (STS) 等开发工具创建的spring boot 工程,会默认创建启动类,如果没有创建,需要手动创建启动类 + +```java +package com.heibaiying.springbootbase; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootBaseApplication { + + // 启动类默认开启包扫描,扫描与主程序所在包及其子包,对于本工程而言 默认扫描 com.heibaiying.springbootbase + public static void main(String[] args) { + SpringApplication.run(SpringBootBaseApplication.class, args); + } + +} +``` + +@SpringBootApplication 注解是一个复合注解,里面包含了@ComponentScan注解,默认开启包扫描,扫描与主程序所在包及其子包,对于本工程而言 默认扫描 com.heibaiying.springbootbase + +```java +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@SpringBootConfiguration +@EnableAutoConfiguration +@ComponentScan(excludeFilters = { + @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), + @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) +public @interface SpringBootApplication { + ... +} +``` + + + +## 三、开箱即用的web工程 + +在springbootBaseApplication.java 的同级目录创建controller文件夹,并在其中创建RestfulController.java,启动项目访问localhost:8080/restful/programmers 即可看到项目搭建成功。 + +```java +/** + * @author : heibaiying + * @description : restful 控制器 + */ +@RestController +@RequestMapping("restful") +public class RestfulController { + + @GetMapping("programmers") + private List getProgrammers() { + List programmers = new ArrayList<>(); + programmers.add(new Programmer("xiaoming", 12, 100000.00f, LocalDate.of(2019, Month.AUGUST, 2))); + programmers.add(new Programmer("xiaohong", 23, 900000.00f, LocalDate.of(2013, Month.FEBRUARY, 2))); + return programmers; + } +} +``` + +这里之所以能够开箱即用,是因为我们在项目中导入spring-boot-starter-web启动器,而@SpringBootApplication 复合注解中默认开启了@EnableAutoConfiguration注解允许开启自动化配置,spring在检查导入starter-web的依赖后就会开启web的自动化配置。 + + + +## 四、模板引擎 + +这里我们在一个项目中同时导入了freemaker 和 thymeleaf的starter(虽然并不推荐,但是在同一个项目中是可以混用这两种模板引擎的)。 + +#### 4.1 freemarker + +```java +/** + * @author : heibaiying + * @description : 跳转渲染模板引擎 默认模板的存放位置为classpath:templates + */ +@Controller +@RequestMapping("freemarker") +public class FreeMarkerController { + + @RequestMapping("show") + private String programmerShow(ModelMap modelMap){ + List programmerList=new ArrayList<>(); + programmerList.add(new Programmer("xiaoming",12,100000.00f,LocalDate.of(2019,Month.AUGUST,2))); + programmerList.add(new Programmer("xiaohong",23,900000.00f,LocalDate.of(2013,Month.FEBRUARY,2))); + modelMap.addAttribute("programmers",programmerList); + return "markerShow"; + } +} + +``` + +```html + + + + + freemarker模板引擎 + + +