AOP:面向切面
将通用逻辑从业务逻辑中分离出来。
统一异常处理:
- 一般为了客户端容易处理,定义一个统一的Result类,分为code,msg,data等三个信息,将需要返回的信息放在data中。
关于事物回滚的问题:
spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
那么什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。
结论:
在spring的事务管理环境下,使用unckecked exception可以极大地简化异常的处理,只需要在事务层声明可能抛出的异常(这里的异常可以是自定义的unckecked exception体系),在所有的中间层都只是需要简单throws即可,不需要捕捉和处理,直接到最高层,比如UI层再进行异常的捕捉和处理
在service类前加上@Transactional,声明这个service所有方法需要事务管理;也可以单独在方法应用。每一个业务方法开始时都会打开一个事务。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked
如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
[对propagation的详细解释:事物属性的枚举类型 详细见:http://ccoder.cc/2018/01/12/transacation-propagation/]
单元测试:
- api(controller)
- service:直接进行方法的调用。
关于maven的生命周期和打包:
https://blog.csdn.net/zhaojianting/article/details/80321488
https://blog.csdn.net/zhaojianting/article/details/80324533
项目打包的时候会自动运行测试类:mvn clean package
打包的时候跳过运行测试类:mvn clean package -Dmaven.test.skip=true
关于maven-jar-plugin打包后依赖lib目录(与target下的classes目录同级)的理解: