Java Web技术经验总结
接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解——跟着开涛学SpringMVC。注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的、最先应该使用的
“@Autowired”的含义是:ListableBeanFactory接口定义的<T> Map<String, T> getBeansOfType(Class<T> var1) throws BeansException;,即获取类型T的所有实例,并存放在一个Map中:key集合是这些实例的包名、value集合是这些实例本身。
接口层应该实现如下目标(参考:SpringMVC4.1之Controller层最佳实践):
统一的响应体、请求体,规避Map、List作参数或者响应结果的方式(尤其是参 - 数用Map来包装,这种代码有时候看起来真的让人很沮丧)
统一的错误信息
统一的请求数据校验
统一的接口异常捕获
MySQL建表的时候,可以按照下列顺序考虑
表名,以及备注
字段定义,以及备注,注意按照下列顺序定义字段!
id,主键,自增
按照字段的使用频率依次定义(字段的顺序为什么重要:);
可为空的字段要提供默认值;
修改时间(mtime)
创建时间(ctime)
索引和约束(强文推荐:如何应对并发(1):关于数据索引)
唯一键(对于有唯一约束的表,插入数据时应使用insert ... on duplicate语句,参考insert on duplicate语法)
普通索引
组合索引
使用@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
Spring中的xxxAware接口是spring框架中的常用模式,经常用于在spring启动阶段通过这类接口提供的setXxx方法给spring管理的bean赋值。Aware接口有点监听者、回调函数或者观察者模式的感觉。在启动过程中,Spring会检查每个bean是否实现了某些个xxxAware接口,如果发现一个,则调用对应的方法,给bean提供相应的信息。参见stackoverflow答案:BeanNameAware and BeanFactoryAware。常见的xxxAware接口有:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware。
工作中的软件开发,要做到哪些方面?敏捷开发并不是野蛮开发,最关键的特性是小步快跑,作为开发者,还是要从下列几个方面考虑问题:
需求评审,产出需求文档
设计评审,产出设计文档
代码开发(尽量使用最佳实践,注意要写基本的单元测试)
基本功能开发
日志记录
异常处理
入参检查
返回结果生成
异步任务处理
代码review:自己review => 高级开发者review;核心代码需要团队review
测试
功能测试(正常case、异常case)
性能测试(压力测试)
稳定性测试
发布
风险评估(影响范围、后果)
回滚预案(应急处理方案、服务降级等)
灰度发布(流量灰度、用户灰度、地域灰度等)
在spring中不能通过new一个实例来使用,否则在mockito测试的时候没法预设行为;在spring中要使用其他组件,必须通过xml或者注解方式,由spring容器负责装配。
单元测试,推荐使用Mockito框架,理由有三:(1)可专注于被测试对象;(2)不需要建立复杂的bean依赖关系;(3)DSL描述性语言简单易懂。参考文章:反模式的经典 - Mockito设计解析 在项目开发中,建议配合使用Mockito和Assertj写单元测试。
实现定时任务,可使用Quartz框架,参考:Spring 调度工具Quartz cron 表达式的格式
作者:杜琪
链接:https://www.jianshu.com/p/86e915d616c4
來源:简书
Java Web技术经验总结的更多相关文章
- Java Web技术总结(目录)
来源于:http://www.jianshu.com/p/539bdb7d6cfa Java Web技术经验总结(一) Java Web技术经验总结(二) Java Web技术经验总结(三) Java ...
- 深入分析Java Web技术内幕(修订版)
阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著 ISBN 978-7-121- ...
- 基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写
基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写 专业程序代写服务(QQ:928900200) 随着社会的进步.服务行业的服务水平不断发展与提高,宾馆.酒店.旅游等服务行业的信息量和工作 ...
- developerWorks 图书频道: 深入分析 Java Web 技术内幕,第 10 章
developerWorks 图书频道: 深入分析 Java Web 技术内幕,第 10 章 深入理解 Session 与 Cookie Session 与 Cookie 不管是对 Java Web ...
- 深入分析Java Web技术(1)
BS网络模型的基本过程: 当我们在浏览器中输入"www.google.com"的时候,首先会请求DNS服务器对域名进行解析成都应的IP地址,然后根据这个IP地址在互联网上找到谷歌的 ...
- Servlet工作原理解析 《深入分析java web 技术内幕》第九章
参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...
- JAVA Coder 的《深入分析Java Web 技术内幕》读书笔记
本文基于<深入分析Java Web 技术内幕> <深入分析Java Web 技术内幕>,作者是 许令波,电子工业出版社.本文只是记录书本当中的精彩部分,作个人回顾和技术分享,请 ...
- 《深入分析Java Web技术内幕》读书笔记 - 第1章 深入Web请求过程
第1章 深入Web请求过程 1 1.1 B/S网络架构概述 2 基于统一的应用层协议HTTP来交互数据. 1.2 如何发起一个请求 4 HTTP连接本质是建立Socket连接.请求实现方式:工具包如H ...
- 深入分析Java Web技术内幕
深入web请求过程 发起一个http请求的过程就是建立一个socket通信的过程 HTTPClient是一个开源的实现了http请求的工具包 深入分析java I/O的工作机制 深入分析java We ...
随机推荐
- tomcat端口冲突解决 Address already in use: JVM_Bind <null>:8080
java.net.BindException: Address already in use: JVM_Bind <null>:8080 Caused by: java.net.BindE ...
- css3毛玻璃效果白边问题
注:css3毛玻璃效果应该很多人都知道怎么实现,但是有个问题是图片模糊了之后相当于缩小了,所以颜色深的图片会出现白边,这里说下我参考网上的解决方式吧! 1.毛玻璃实现方法: CSS3 blur滤镜实现 ...
- [shell基础]——变量
变量的赋值 #定义变量,注意等号两边没有任何空格 variable=#定义环境变量export variable= #双引号:可含空格.可转义特殊字符 variable=" " # ...
- Laravel 使用Voyager导致多个数据库连接总是返回默认连接?
问题与分析 最近的项目碰到一个奇怪的问题,在Laravel(5.3)中想建立多个数据库连接连到MySQL的不同数据库(另一个连接名为conn2),执行如下语句得到却发现得到的仍然是默认连接: $con ...
- PHP之数组和函数的基本教程
[PHP数组的分类] 按照下标的不同,PHP数组分为关联数组与索引数组 索引数组:下标从0开始,依次增长: 关联数组:下标为字符串格式,每个下标字符串与数字的值一一关联对应(有点像对象的键值对) [关 ...
- MVVM - 事件转命令2
在使用MVVM模式时, 按照模式的规则是尽量不直接使用事件. 所以对于以前一直使用事件模式的同行来说确实有点头疼. 还好微软给我们提供了几种间接使用事件(命令)的方法, 下面我就来看看这几种方法: I ...
- spring实现可重置时间定时器
此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台 一. jar包介绍 1. spring-framework-4.3.4.RELEASE 的 lib ...
- JS里的居民们4-数组((堆)队列
编码1(队头在最右) 练习如何使用数组来实现队列,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关入队.出队.获取 ...
- 纯css模仿天猫首页
<style> *{margin:0;padding:0} li{list-style:none} a{text-decoration:none} #wrapper{font: 12px/ ...
- android query 模糊查询
package com.example.utils; import java.util.ArrayList; import android.content.ContentValues; import ...