工作总结-002
-
异常捕获
service捕获业务异常,自定义BaseException;
interface捕获业务异常,以及其他异常,用Exception“兜底”。 -
参数校验
不要觉得别人的代码多可靠,该有的校验要有;“不该有的校验”也要有。
考虑因素全面,逻辑严谨。
记录的唯一性可以用唯一索引保证。
alter table table_name add unique key key_name (column1_name ,column2_name); -
少用int
在需要数据转换的场景,如VO转为DTO,DTO最好用基础数据类型的包装类。
如果VO用了Integer,而Dto对应类型是int,当VO的Integer为null时,为Dto相应属性赋值会有问题。
// VO的Integer age
vo.age = null;
// Dto的int age
// ... 下面这行有问题
dto.setAge(vo.getAge());
这里涉及到拆箱问题,通过javap -c 反编译class文件,可看到调用了Integer.intValue()。针对dto.setAge(vo.getAge());会执行vo.getAge(),因为vo.age = null; null.intValue()会报空指针异常。
- dubbo接口使用方式
- 1)用dubbo注解
自动化配置 @EnableDubboConfiguration
consumer的注解 @DubboConsumer
producer的注解 @Service(import com.alibaba.dubbo.config.annotation.Service)
参考 http://www.jianshu.com/p/06bfa92f2e20
- 2)不用Dubbo注解
consumer:
@Bean("ConsumerInterface")
public ReferenceBean<ConsumerInterface> consumerInterface() {
ReferenceBean<ConsumerInterface> referenceBean = new ReferenceBean<>();
referenceBean.setInterface(ConsumerInterface.class);
referenceBean.setCheck(false);
referenceBean.setVersion("1.0.0");
referenceBean.setTimeout(5000);
return referenceBean;
}
producer:
@Resource
private ProducerInterface producerInterfaceImpl;
@Bean
public ServiceBean<ProducerInterface> producerInterface() {
ServiceBean<ProducerInterface> serviceBean = new ServiceBean<>();
serviceBean.setInterface(ProducerInterface.class);
serviceBean.setRef(producerInterfaceImpl);
referenceBean.setVersion("1.0.0");
referenceBean.setTimeout(5000);
return serviceBean;
}
- 不要直接使用线程
阿里巴巴Java开发手册:
使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,避资源耗尽风险。 Executors返回的线程池对象的弊端如下 :
1)FixedThreadPool和SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2)CachedThreadPool 和 ScheduledThreadPool: 允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
自己写线程池工具类 http://note.youdao.com/noteshare?id=30ca03fa9d7f9772e5e8a811089a1fa6
-
关于Autowired
Autowired annotation is not supported on static fields
Autowired 与 Resource 的区别
Autowired按类型装配,Resource默认按属性名进行装配 -
为什么HashMap初始化时要指定大小?
避免resize降低效率 -
注释
发布文档,方便其他人了解代码功能。
方法的注释,说明功能、入参、返参、可能抛出的异常。
/**
* @author: Ali
* @date: 2017/12/15
* @since: java 1.8
* description: XXXXXX
*
* @param someParam 入参描述
* @return returnParam 返参描述
* @throws XXXException XXX异常
*/
- maven库引不下来,删掉本地相应仓库,重新import