spring-best-practices 总结了下这几年 Spring 开发的一些优雅实现

2019-12-25 21:50:29 +08:00
 rizon

Github 地址: https://github.com/othorizon/spring-best-practices


spring 最佳实践

总结了本人 3 年 Java 开发中的一些开发经验和工具类以及 Spring 框架的应用
采用了 Spring 项目的模式来最简单直观的呈现,直接拿来作为初始化项目也是不错的选择
该项目还在打磨中,仍有很多需要完善和优化的地方

持续更新,欢迎 PR

概要

第三方工具的使用

运维


Github 地址: https://github.com/othorizon/spring-best-practices

先起个头,后面会花时间去整理、沉淀和打磨的。

不知道这东西到底有没有写的价值,所以有些小纠结, 不过对别人来说也许毫无用处,但是对我来说却是非常有意义的了。
如果您觉得这里面有能对你有点用处的东西,麻烦给个 star 支持下哈~~

6213 次点击
所在节点    程序员
41 条回复
rizon
2019-12-26 12:08:44 +08:00
@m1862897 #20
hutool 确实提供了很多好东西
mapstruct 也有他的优势,mapstruct 工作原理上完全不同,是预编译的方式,虽然缺少了动态执行的灵活性,但也确保了可靠性,而且效率上也是高于反射的。
我用 mapstruct 的原因就是它公开透明、可控。而且也提供了一些可以做复杂映射的配置。
不要因为代码写起来复杂不够简洁就放弃。

当然有些场景下我也会用 beanutils,还是看场景吧,融会贯通嘛
lx91714
2019-12-26 12:10:21 +08:00
很不错哦
Allianzcortex
2019-12-26 12:45:51 +08:00
@rizon @FanError 理解。如果只针对 HTTP 方法的话两者没什么特别的优劣。我用 AOP 实现的是 authorization,用 interceptor 和 filter 也实现了 authentication https://github.com/Allianzcortex/LaraForum/tree/master/src/main/java/com/laraforum/authentication
BoomMan
2019-12-26 13:15:24 +08:00
我也有相关的积累,想贡献自己的一部分代码,微信沟通下,哪部分比较合适吧. Wx TG92ZV9Zb3VfODAyMw==
lihongjie0209
2019-12-26 13:29:24 +08:00
@m1862897 #20 mapstruct 是代码生成实现拷贝, beanutil 是反射拷贝.
代码生成是类型安全的, beanutil 不是.
代码生成是可以重构的, beanutil 不能.
代码生成目前执行效率最高, 反射最慢.
代码生成可以重写成生成代码的方法, 定制化灵活, 反射不行
BoomMan
2019-12-26 13:36:19 +08:00
@rizon 我也有相关的积累,想贡献自己的一部分代码,微信沟通下,哪部分比较合适吧. Wx TG92ZV9Zb3VfODAyMw==
BoomMan
2019-12-26 14:18:00 +08:00
@rizon 提了一个 pr,之前很少提,流程不是很熟悉,如果有问题可以进一步沟通哈
chendy
2019-12-26 14:32:42 +08:00
两三年前试过 mapstruct 和另外几个用 apt 的拷贝…
可能是 idea 支持不好,代码更新总是不及时,加了注解除非 clean 掉重新编译否则一直不生效
看到楼主推荐,打算再拿出来试试
rizon
2019-12-26 15:20:32 +08:00
@BoomMan #26 感谢支持哈,我看了下 pr,您提的内容有些重了,这毕竟是个 demo 程序哈,
另外就是参数校验的代码我其实也在整理精简,所以冲突了哈,抱歉哈,嘿嘿😁。
现在已经 push 了,您也可以参考一下,基本都是一样的,但是我加了一个错误信息的国际化处理,也就是`ValidationMessages.properties`配置错误信息。
后面我还会提交一些自己写的参数校验注解,比如枚举校验等

再有就是您提到的 @ConfigurationProperties 在 yml 配置里没有提示的问题,
虽然采用编写 META-INF 可以解决,不过 idea 其实是有提示的,引入了`spring-boot-configuration-processor` 之后在 idea 的设置里 'Annotation Processors' 中勾选为 enable 就可以了,每次 build 的时候会更新提示,这和 lombok 一样都依赖这个 processor 的处理
rizon
2019-12-26 15:23:17 +08:00
@chendy #28 因为是预编译的,会生成实现类在`target/generated-sources/annotations`文件夹,所以有时候是需要 clean 一下的
BoomMan
2019-12-26 15:33:15 +08:00
@rizon ok,我理解的是需要一个清楚明了的例子,如果全部整合在一起不太好。
Sunyanzi
2019-12-26 15:58:04 +08:00
@Takamine 啊前辈好 ... 我努力琢磨了十分钟也没明白这个逻辑关系 ...

装一道门还可以理解成需要开关门有个类似 threshold 的东西 ... 穿了件衣服是啥啦 ...

@securityCoding 明白 ... 我之前只知道到在 SpringMVC 之外没地方配置 Interceptor ... 现在就更清晰了 ...

@rizon 我不太理解这个「专门专事」和「更粗暴」包括「手脚太长」的结论是如何得到的 ... 可否举例 ..?

在我看来定义一个 Interceptor 之后还要去 XML 或者 Configuration 里面注册与配置应用场景 ...

修改拦截规则也需要修改配置 ... 这远不如对自定义注解进行切面织入来得优雅 ..? 是我理解错了什么吗 ..?
967182
2019-12-26 16:04:04 +08:00
Mybatis-Plus 实现零 版本升级头疼吗?
Takamine
2019-12-26 19:29:17 +08:00
@Sunyanzi ……你才是前辈。_(:з」∠)_
我觉得拦截器是还没有进入到实际的业务领域中就处理了,和应用实际上某种程度松耦合了,而用 AOP 织入的时候,就已经是去代理业务领域的对象了。
rizon
2019-12-26 20:38:41 +08:00
@Sunyanzi #32
aop 缺少可控性,aop 是针对一个可以模糊匹配的 path 去做拦截的,但是 path 本身是没有意义的,也就是说只有写这个代码的你知道他的业务上的意义。我个人看来,这就是大忌。 如果误伤了咋办,你了解代码你不会误伤,但是不能避免后来人在缺少对代码的足够理解的情况下被误伤了。
而且后续的人维护这类代码还是很头疼的,不敢乱动。
但是拦截器就是针对某个业务场景去拦截,天然意义上就不会出现这种情况。

换言之,拦截器是低耦合的,代码侵入性低。
rizon
2019-12-26 20:41:02 +08:00
@967182 #33 版本升级的场景倒是没有遇到过
buliugu
2019-12-27 09:35:51 +08:00
@967182 Mybatis-Plus 升级要慎重,前后版本兼容性不是很好
zppass
2019-12-27 10:48:21 +08:00
再加一个分页的插件,pageHelpr。关于拦截器,我感觉更多是请求拦截,文件后缀限制,粒度可能达不到 AOP 的粒度那么细那么灵活(实际拦截器也能写得更细节,但是失去了作为通用配置的作用),这是我的想法。
rizon
2019-12-27 11:11:06 +08:00
@zppass #38 现在案例中用的是 mybatis-plus 所以不需要和这个去分页,
不过我也会加上的,我会加一个手写 sql 的案例,通过 pageheleper 注入分页数据, 以及写一个和 pagehelper 同原理的动态表名工具
rizon
2019-12-27 14:54:03 +08:00
@zppass #38 pagehelper 插件的使用加上了,也加了一个按日期等方式做分表时的动态表名查询的解决方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX