各位的 web 项目是怎样规划的,都采取了哪些策略?

2020-05-12 16:43:59 +08:00
 tctc4869

做项目之前,开发者都得有一个好的规划,关于 Controller,Service,Dao,Entity 的规划,但是好的规划也会根据所用的框架,例如 MVC 和 ORM,以及是否有多数据源来做调整

大家在开发前的规划,让各位对各自项目作出了怎样的规划?

我先说一下,我开发过的其中一个项目的规划

Spring + Spring mvc+mybatis+tk.mybatis SSM,这个搭配应该算是前年主流常规的把,首先是包的分类

com 模块根包 com.xxx1 子模块 1,com.xxx2 子模块 2,一个子模块,拥有的子包名称包括 Model,Service,Dao,Cache,Util,Config 其中任何一项 common 常用,存放常用的方法 config 配置项,配置 web 启动时调用的类加载初始化数据和持久层的配置,例如 mybaits 配置文件,web 过滤器 resources 存放配置文件 。用于生产环境配置调整

spring 扫描策略,不扫描 Service,只扫描 Controller 和 dao,Service 类不写 @service 注解。

在所有的实体类继承一个基类,基类有 Long id,LocalDate Create_date,LocalTime create_time 三个字段,

并且所有的实体类的内容添加如下代码: public static XXXDao dao; public static XXXService service=getSingleton(XXXService.class);代码,在 spring 开始启动后通过反射配置把扫描到的 dao 类实例添加到实体类里的 XXXDao 字段里进去,那样就不用了在搞什么 @autowired 注解写个 set 注入。

mybatis,手动编写 sql 语句,从来不把 sql 语句写在 xml 里,直接写在注解上。 通过 java 来配置级联删除策略

数据库方面的配置 数据库主键策略都采用整型或长整型,通过雪花算法或自增或序列分配 id,如果是通过序列分配主键的表,则序列起始从 10000 开始。 用户类除了主键,还有用户名,姓名,登录名,密码,标识 id 等字段,标识 id 是字符串类型,通过字符串 id 生成算法随机生成,用于让其他用户不通过主键 id 来能确认用户唯一

以上是我开发的一个单数据源的项目的规划概况,可能有些没说出来,各位开发项目,面临单数据源或多数据源,以及为了少写代码或着是开发体验,都做了哪些规划呢

1884 次点击
所在节点    Java
5 条回复
opengps
2020-05-12 23:57:19 +08:00
规划要跟项目相匹配,不能是约束

你做个日均访问量 1000 的博客,那么怎么快怎么来,甚至可以直接页面代码里写 SQL

如果你要 200 人的团队做个日均 10 访问量的企业系统,反而需要各种分层架构

我以上数字举例的主要目的是为了说这句:架构对于开发团队的影响很大,然后才是业务规模大小。
a7217107
2020-05-13 14:53:54 +08:00
有个疑问,请教下 。
所有实体类添加代码 ( public static...) 相对于 @Autowired 注解,不应该是 @Autowired 注解更便捷一点吗
Aresxue
2020-05-13 15:25:08 +08:00
mybatis 的注解式 sql 是最鸡肋的一个,其它注解是比较先进的,但它和 sql 放一起可读性特别差, 如果有复杂 sql 不建议这么做。
至于使用 set 替换 autowired 其实是在搞复古,但如果想这么搞建议使用 Javasist 或者 asm 做字节码生成,看到大量重复无明显含义的代码很让人厌烦。
数据库那里应该是单库,那么直接用自增序列应该是性能最好且使用起来最方便的一种,标识 id 如果没有含义存在的价值就不大
多数据源生产实践中是大坑,能上分布式就上分布式,然后单应用就只连接一个库,想要做其它库操作直接调用其它模块
tctc4869
2020-05-13 21:59:33 +08:00
@a7217107

比如要创建多个 Controller 编写验证用户代码,例如判断用户是什么什么,按照我的方式,我可以通过 User.service.isExists(user_id),User.dao.getByid(loginName)实现,

如果我使用 @Autowired 的方式,先得写一个字段,还得取名字,叫什么 UserService userSerivce,在上面写个 @Autowired,然后写 set 方法实现 set 注入,然后以 userService.isExists(user_id),userService.getDao().getById 调用,感觉还不如把实体类相关的 dao 和 service 写在实体类内作为 public 访问权限的静态成员进行调用,省去“声明字段写 @Autowired 生成 set”更快更方便。

当然没有实体类的 dao 和 Service 是另一回事。
yjxjn
2020-05-25 09:57:48 +08:00
@Aresxue 不仅仅是可读性差,mybatis 注解式 SQL 看似先进,但是如果真正遇到 SQL 修改的问题,不得频繁发版么,而且也不符合模块化的思想,xml 里面写好了,不动 source,直接改 xml 不就行了。

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

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

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

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

© 2021 V2EX