spring开发实践手记

项目结构分层

Sofaboot 中SpringMVC分层

App
		biz
			service-impl(manager层接口的实现以及VO和model的转换)
			shared(manager层的接口)
		common
			dal(数据库层面,比如mybatis相关代码)
			service
				façade(给其他微服务模块提供的接口)
				integration(集成其他模块接口的代理,或者mq等中间件的代码汇聚)
		core
			model(领域模型及枚举等)
			service(service层及仓储层代码)
		test
			单测,后端代码主要依赖单测保证质量,测试用例保证80%的行覆盖率和70%的分支覆盖率,100%的通过率。所有测试数据均不能影响数据库中现有的数据,测试完成后需清理测试数据(数据准备和清理工作不需要开发人员处理,开发人指定数据及相关条件,由测试框架的前置处理器和后置处理器处理,整个测试框架是基于testNG和动态代理实现的)。
		web
			web的controller和config等

一个完整的请求的代码流程是controller->manager->service->repository->dal,其中manager层或service层可能会调integration层的接口

1) controller中的代码非常简洁,业务逻辑提取到manager层,manager层需要校验入参,调用service,将处理的结果转换成VO。
2) integration层,处理集成其他模块的接口或处理mq等中间件模块

对象转换

在不同的层面,参数的形态不同
1)在web层面是VO(Request、Response等),所有参数必须配置相应的校验,比如@NotNull或指定正则表达式等
2)在service层是领域模型model
3)在dal层是DO

不同形态的对象通过Convertor工具类的静态方法,手动调用getter和setter进行转换,不允许使用copyProperties方法拷贝对象的值,避免潜在问题,比如参数名称不一致导致的。

Asserts断言来判断业务中的异常

封装Asserts工具类,提供isEmpty notNull isTrue 等断言方法,对于断言错误的情况,给定错误信息,抛出runtimeException,异常信息被AOP动态代理的异常阶段捕获,输出异常信息。
如mysql插入数据返回状态为0,则抛出相应的异常,指定错误信息。

好处是:代码保证了数据的正确性校验,并且没有过多的throw Exception
异常和日志通过AOP统一捕获
和业务无关的横切面都可以使用AOP来完成,我们在操作日志也有使用,只是对原先代码仍有所侵入,可以有所优化。异常管理这块可以相应改造,可大大减少代码中的try catch代码,并在统一的位置进行异常日志记录。

多线程的使用,必须显示的使用ThreadPoolExecutor

原因在阿里开发手册中有提到,
1)避免潜在的OOM问题,
2)线程命名,方便定位。
3)开发者理解各个参数的意义,灵活运用。

ThreadPoolExecutor的详解可参考
https://segmentfault.com/a/1190000008693801

使用策略模式去除项目中的if else

方便添加新的策略时,不需要修改if else

使用AOP管理项目中的异常、日志、参数校验等非业务操作

比如异常的统一捕获
ResponseEntityExceptionHandler
@ControllerAdvice

使用AOP进行redis缓存操作,解决业务代码过多冗余代码

使用观察者模式解决多个业务的解耦

Spring中使用,涉及以下几个类
SmartApplicationListener
ApplicationEvent
ApplicationContext

你可能感兴趣的:(java)