个人编程总结
代码习惯
复制对象时(大多用于返回模型转换,如 entity→bo bo→resp),在目标对象中写对源的复制;因为这种情况大概率目标对源是一种依赖关系,数据的来源应该基本从源对象来的。此种处理可以方便的梳理对象之间的关系,尤其在业务复杂后方便梳理;
可以写一个公共的泛型接口,并设置默认复制方法,如BeanUtil.toBean之类,保持更大统一;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26/**
* 从源数据复制对象,需保证字段,类型一致
*
* @author liukewen
* @since 2022/8/3
*/
public interface CopyFromSource<S,T> {
/**
* 复制对象值
* @param s
* @return
*/
default T copy(S s){
BeanUtil.copyProperties(s,this);
return (T) this;
}
default T copy(S s, Consumer<T> consumer){
T copy = copy(s);
if (consumer !=null){
consumer.accept(copy);
}
return copy;
}
}反例:在业务中到处使用 Bean.copy, 将会导致有一个地方修改时难以找到利用此对象创建的类,改起来十分麻烦;
对象差异大的尽量不要用这个,因为,久了你也不知道哪些字段是复制了的,又得看代码逻辑;
禁止使用map作为接口的返回及入参,map导致接口语义不清晰,需要跟踪代码才能清楚含义,非常不利于维护;
Vo返回的数据字段一定是要都有意义的,没有意义的字段会导致接口语义不清晰(跟map一样);
feign 传输时入参返参不得出现无意义的字段,否则会导致业务调用者不清楚是否有相应的入参数据或返回数据;
合理使用继承关系,具有相同意义的对象或有联系的对象应当使用继承,在后期维护时只需要修改其中一处便可以;
入参具有相同意义都需要实现相同逻辑的可以考虑抽象类或接口,并在相同的逻辑处实现默认方法;
eg: 管家必传医生ID,医生后台赋值的情况,可以利用接口的性质统一校验;凡是相同或及其相似代码的处理逻辑一致的必有需要调整的,避免出现改一处都需要改;
Service层需要无状态,上下文相关的东西赋值应该在controller中做;
规划后台服务模块时划分好功能对应的模块,服务之间要在数据库之间隔离,通过service调用;
Conroller的@RequestParam尽量写上,否则框架会做更多的处理匹配字段对应(另外的sm框架,反射都无法做到);
模型之间最好要有关联,不能都只在业务中体现;
获取外部的接口必须统一管理,在统一的jar或公共模块中处理,不能在各自的业务中去调用,否则到处都会有相应的代码,当需要调整的时候不容易找全调用接口;同时也没办法统一管理token等。
枚举类型不应该用数字表示,更不应在程序中用魔法值等于,这样会造成类型引用不清晰;
2. 框架搭建
- 抽离公共工具-模型包,项目中所有地方都用到的基本模型、工具、异常定义等单独放到一个包(不依赖spring等,只有模型);
- 抽离公共配置 starter 并将公共信息定义好(比如租户、登录人、流水号、公共Feign等 信息的拦截及配置);
- 抽离数据库持久层starter 配置好数据库信息和持久层工具(mybatis、mybatis-plus等),需要用的地方直接依赖,不访问数据库的可以不依赖此(如web工程);
- eureka-client可以配置为starter,并做好配置,配置好公共配置,其余业务模块直接引入配置好应用自己的配置即可(
spring.application.name server.port
); - eureka-client可以配置好Feign和Hystrix ,使得所有的Feign和Hystrix具有相同的全局配置;
- Zuul或SpringCloud Getway单独部署一个工程作为全局网关,网关中可以配置具体的服务名的访问规则,实现全局负载均衡和初步鉴权;
- 网关鉴权中可以整合Spring Cloud Security,以Oauth2方式鉴权;
- SaaS系统的租户可以通过前端差异化处理,也可以通过网关的ip来源不同在网关中处理;