V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tctc4869
V2EX  ›  Java

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

  •  
  •   tctc4869 · 2020-05-12 16:43:59 +08:00 · 1788 次点击
    这是一个创建于 1451 天前的主题,其中的信息可能已经有所发展或是发生改变。

    做项目之前,开发者都得有一个好的规划,关于 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 来能确认用户唯一

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

    5 条回复    2020-05-25 09:57:48 +08:00
    opengps
        1
    opengps  
       2020-05-12 23:57:19 +08:00 via Android
    规划要跟项目相匹配,不能是约束

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

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

    我以上数字举例的主要目的是为了说这句:架构对于开发团队的影响很大,然后才是业务规模大小。
    a7217107
        2
    a7217107  
       2020-05-13 14:53:54 +08:00
    有个疑问,请教下 。
    所有实体类添加代码 ( public static...) 相对于 @Autowired 注解,不应该是 @Autowired 注解更便捷一点吗
    Aresxue
        3
    Aresxue  
       2020-05-13 15:25:08 +08:00
    mybatis 的注解式 sql 是最鸡肋的一个,其它注解是比较先进的,但它和 sql 放一起可读性特别差, 如果有复杂 sql 不建议这么做。
    至于使用 set 替换 autowired 其实是在搞复古,但如果想这么搞建议使用 Javasist 或者 asm 做字节码生成,看到大量重复无明显含义的代码很让人厌烦。
    数据库那里应该是单库,那么直接用自增序列应该是性能最好且使用起来最方便的一种,标识 id 如果没有含义存在的价值就不大
    多数据源生产实践中是大坑,能上分布式就上分布式,然后单应用就只连接一个库,想要做其它库操作直接调用其它模块
    tctc4869
        4
    tctc4869  
    OP
       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
        5
    yjxjn  
       2020-05-25 09:57:48 +08:00
    @Aresxue 不仅仅是可读性差,mybatis 注解式 SQL 看似先进,但是如果真正遇到 SQL 修改的问题,不得频繁发版么,而且也不符合模块化的思想,xml 里面写好了,不动 source,直接改 xml 不就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2236 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:48 · PVG 14:48 · LAX 23:48 · JFK 02:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.