Java Web技术经验总结

  1. 接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解——跟着开涛学SpringMVC。注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的、最先应该使用的
  2. “@Autowired”的含义是:ListableBeanFactory接口定义的<T> Map<String, T> getBeansOfType(Class<T> var1) throws BeansException;,即获取类型T的所有实例,并存放在一个Map中:key集合是这些实例的包名、value集合是这些实例本身。
  3. 接口层应该实现如下目标(参考:SpringMVC4.1之Controller层最佳实践):
  • 统一的响应体、请求体,规避Map、List作参数或者响应结果的方式(尤其是参 - 数用Map来包装,这种代码有时候看起来真的让人很沮丧)
  • 统一的错误信息
  • 统一的请求数据校验
  • 统一的接口异常捕获
  1. MySQL建表的时候,可以按照下列顺序考虑
  • 表名,以及备注
  • 字段定义,以及备注,注意按照下列顺序定义字段!
    • id,主键,自增
    • 按照字段的使用频率依次定义(字段的顺序为什么重要:);
    • 可为空的字段要提供默认值
    • 修改时间(mtime)
    • 创建时间(ctime)
  • 索引和约束(强文推荐:如何应对并发(1):关于数据索引)
    • 唯一键(对于有唯一约束的表,插入数据时应使用insert ... on duplicate语句,参考insert on duplicate语法)
    • 普通索引
    • 组合索引
  1. 使用@Async注解,可限定某个类的所有方法或者某个方法进行异步处理,属于对线程池技术的封装。参考官方文档:Annotation Support for Scheduling and Asynchronous Execution,另外,CSDN这篇博文也不错:Spring异步任务处理,@Async的配置和使用。
  • <task:executor/>标签对应的实现类是ThreadpoolExecutor
    • pool-size(core-size和max-size):有异步请求到达时,如果当前线程数小于core-size时,则启动一个新线程提供服务;如果当前线程数达到core-size,则将新请求放入Blockqueue;如果BlockQueue也满了,则启动新线程提供服务,直到线程池内的线程数达到max-size;
    • queue-capacity:BlockQueue的大小
    • keep-alive:超过core-size的那部分线程,任务完成后在线程池中存活的时间;
    • rejection-policy:线程池内线程超过max-size之后,对于新来的服务请求的处理策略(忽略、抛异常或者改为同步调用)。
  • 线程池的大小:可根据Little定律(队列中任务的平均数量等于进入速率和平均停留时间的乘积)估算。
  • 需要通过日志打印验证@Async确实起作用了,可能有三个坑:(1)内部调用不能异步;(2)不能重复扫描,确保带@Async注解的方法所在的类只被Component-Scan扫一次;(3)必须是public的,不能是public static的。参考文章如下:
    • Spring的两种任务调度Scheduled和Async
    • Spring Async not working
  1. Spring中的xxxAware接口是spring框架中的常用模式,经常用于在spring启动阶段通过这类接口提供的setXxx方法给spring管理的bean赋值。Aware接口有点监听者、回调函数或者观察者模式的感觉。在启动过程中,Spring会检查每个bean是否实现了某些个xxxAware接口,如果发现一个,则调用对应的方法,给bean提供相应的信息。参见stackoverflow答案:BeanNameAware and BeanFactoryAware。常见的xxxAware接口有:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware。
  2. 工作中的软件开发,要做到哪些方面?敏捷开发并不是野蛮开发,最关键的特性是小步快跑,作为开发者,还是要从下列几个方面考虑问题:
  • 需求评审,产出需求文档
  • 设计评审,产出设计文档
  • 代码开发(尽量使用最佳实践,注意要写基本的单元测试)
    • 基本功能开发
    • 日志记录
    • 异常处理
    • 入参检查
    • 返回结果生成
    • 异步任务处理
  • 代码review:自己review => 高级开发者review;核心代码需要团队review
  • 测试
    • 功能测试(正常case、异常case)
    • 性能测试(压力测试)
    • 稳定性测试
  • 发布
    • 风险评估(影响范围、后果)
    • 回滚预案(应急处理方案、服务降级等)
    • 灰度发布(流量灰度、用户灰度、地域灰度等)
  1. 在spring中不能通过new一个实例来使用,否则在mockito测试的时候没法预设行为;在spring中要使用其他组件,必须通过xml或者注解方式,由spring容器负责装配。
  2. 单元测试,推荐使用Mockito框架,理由有三:(1)可专注于被测试对象;(2)不需要建立复杂的bean依赖关系;(3)DSL描述性语言简单易懂。参考文章:反模式的经典 - Mockito设计解析 在项目开发中,建议配合使用Mockito和Assertj写单元测试。
  3. 实现定时任务,可使用Quartz框架,参考:Spring 调度工具Quartz cron 表达式的格式

作者:杜琪 链接:https://www.jianshu.com/p/86e915d616c4 來源:简书

原文发布于微信公众号 - java工会(javagonghui)

原文发表时间:2018-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

一个MySQL死锁问题的反思

很早之前我写过几篇关于MySQL死锁的分析,比如 换个角度看待MySQL死锁的一点简单认识 MySQL死锁的两个小案例 MySQL在RR隔离级别下的unique...

3408
来自专栏A周立SpringCloud

实用技巧:Hystrix传播ThreadLocal对象(两种方案)

目前,Spring Cloud已在南京公司推广开来,不仅如此,深圳那边近期也要基于Spring Cloud新开微服务了。 于是,领导要求我出一套基于Spring...

5375
来自专栏tkokof 的技术,小趣及杂念

小议游戏控制台

  近来一直在搞iOS平台游戏,所用引擎则是cocos2dx,不少时间接触下来,感觉是愈来愈喜欢了:),虽然起初引擎稍显简陋,目前也仍然和商业引擎存在差距,但鉴...

541
来自专栏Java3y

面试前需要了解的东西

我在面试前针对Java基础也花了不少的时间,期间也将自己写过的博文粗略地刷了一遍,同时也在网上找了不少比较好的资料(部分是没看完的)。在这里给大家分享一下~~~

870
来自专栏java学习

学习java需要会哪些知识才能够去应聘工作?

按照我去培训机构的学习经历,给初学还有自学Java 的同学一个基本的学习脉络,希望对大家有帮助。 不建议找到一本书死啃,没啥用,不要有这一页看不明白我就不往下看...

26610
来自专栏musazhang的专栏

畅游数据库性能优化过程简析(下)

经过周末两天的折腾,在大家的帮助下最终将用户 DB 的性能峰值由最初的不到 8W 的 QPS + TPS 提升至 17W,心情也由最初的忐忑过渡到现在的平静,现...

2480
来自专栏java学习

学习java需要会哪些知识才能够去应聘工作?

Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 按照我去培训机构的学习经历,给初学还有自学Java 的同学一个基本的学习脉络,希望...

3296
来自专栏java架构学习交流

如何用比较快速的方法掌握Spring的核心——依赖注入,Java web轻量级开发面试教程 读书笔记

      我们知道,Java方面的高级程序员一定得掌握Spring的技能,其中包括Spring 依赖注入(IOC),面向切面(AOP),和数据库的整合(比如和...

18510
来自专栏架构师小秘圈

分布式唯一ID极简教程

一,题记 所有的业务系统,都有生成ID的需求,如订单id,商品id,文章ID等。这个ID会是数据库中的唯一主键,在它上面会建立聚集索引! ID生成的核心需求有两...

3757
来自专栏Spark学习技巧

大数据查询——HBase读写设计与实践

作者 | 汪婷编辑 | Vincent导语:本文介绍的项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和...

2299

扫码关注云+社区