系统分层设计是一种设计思想(分而治之),是让每层对象都有一个独立职责,再让多 层对象协同(耦合)完成一个完整的功能。这样做可以更好提高系统可扩展性,但同时也会 增加系统整体运维的难度
Spring Boot 是 Java 软件开发框架(很多人现在把它理解为一个脚手架),其设计目 的是用来简化 Spring 项目的初始搭建以及开发过程。该框架使用了特定的注解方式来进行 配置,从而使开发人员不再需要大量的 xml 配置。不再需要大量的手动依赖管理。约定大于配置,开箱即用的方式
特性
SpringBoot 其核心特性包含如下几个方面:
▪ 起步依赖(Starter Dependency),
▪ 自动配置(Auto Configuration),
▪ 健康检查(Actator)-监控。
▪ 嵌入式服务(Tomcat,Jetty)等。
是通过复用对象,以减少因创建和释放对象 所带来的资源消耗,进而来提升系统性能。
用户通过 DataSource 对象的 getConnection()方法,获取一个连接。假 如池中有连接,则直接将连接返回给用户。假如池中没有连接,则会调用 Dirver(驱动, 由数据库厂商进行实现)对象的 connect 方法从数据库获取,拿到连接以后,可以将连接 在池中放一份,然后将连接返回给调用方。连接需求方再次需要连接时,可以从池中获取, 用完以后再还给池对象。
原理:在系统初始化的时候,在内存中开辟一片空间,将一定数量的数据库连接作为对象存储 在对象池里,并对外提供数据库连接的获取和归还方法。
用户访问数据库时,并不是建立一 个新的连接,而是从数据库连接池中取出一个已有的空闲连接对象;使用完毕归还后的连接 也不会马上关闭,而是由数据库连接池统一管理回收,为下一次借用做好准备。
如果由于高 并发请求导致数据库连接池中的连接被借用完毕,其他线程就会等待,直到有连接被归还。
整个过程中,连接并不会关闭,而是源源不断地循环使用,有借有还。
数据库连接池还可以 通过设置其参数来控制连接池中的初始连接数、连接的上下限数,以及每个连接的最大使用 次数、最大空闲时间等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况 等。
构成:数据库连接池以连接池的管理为核心,主要支持连接池的建立和释放这两大核心功能。
功能:
Mybatis 是一个优秀的持久层框架,底层基于 JDBC 实现与数据库的交互。并在 JDBC 操作的基础上做了封装和优化,它借助灵活的 SQL 定制,参数及结果集的映射方式,更好的 适应了当前互联网技术的发展。
核心组件分析:
▪ DispatcherServlet :前端控制器, 处理请求的入口。
▪ HandlerMapping:映射器对象, 用于管理 url 与对应 controller 的映射关系。
▪ Interceptors:拦截器,实现请求响应的共性处理。
▪ Controller:后端控制器-handler, 负责处理请求的控制逻辑。
▪ ViewResolver:视图解析器,解析对应的视图关系(前缀+viewname+后缀)。
请求处理流程分析如下:
▪ 请求方法参数描述设计
▪ 响应结果封装及转换
Java 项目中处理异常方式无非两种,要么执行 trycatch 操作,要么执行 throw 操作(抛 给其它对象处理)。
▪ 捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。
▪ 避免直接抛出RuntimeException,更不允许抛出Exception或者Throwable,应 使用有业务含义的自定义异常(例如 ServiceException)。
▪ 捕获异常后必须进行处理(例如记录日志)。如果不想处理它,需要将异常抛给它 的调用者。
▪ 最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。
▪ 避免出现重复的代码(Don’t Repeat Yourself),即 DAY 原则。
@RestControllerAdvice //@ControllerAdvice+@ResponseBody
▪ 此注解描述的类为全局异常处理类
@ExceptionHandler(RuntimeException.class)
▪ @ExceptionHandler 注解描述的方法为异常处理方法,
注解中定义的异常类型为方法可以处理的异常类型.
▪ 404 (资源没有找到)
▪ 400 (请求参数与服务端参数不匹配)
▪ 405 (请求方式与服务端不匹配)
▪ 500 (服务端处理请求的过程中出现了问题
Lombok 是一个第三的 Java 库,它会自动插入编辑器和构建工具中。
Lombok 提供了一 组有用的注释,用来告诉编译过程中的编译工具,在源代码编译成字节码的过程中,在字节码 中添加一些量样板代码。但是为哪些类或方法进行编译增强,需要通过注解对其进行描述,
常用注解有:
▪ @Setter 用于为描述的类生成 setter 方法,不包含 final 修饰属性。
▪ @Getter 用于为描述的类生成 getter 方法。
▪ @ToString 用于为描述的类添加 toString 方法。
▪ @EqualsAndHashCode 用于为描述的类,生成 hashCode 和 equals 方法。
▪ @NoArgsConstructor 用于为描述的类生成无参的构造方法。
▪ @AllArgsConstructor 用于为描述的类生成包含类中所有字段的构造方法。
▪ @Data 用于为描述的类生成 setter/getter、equals、canEqual、hashCode、toString 方法,如为 final 属性,则不会为该属性生成 setter 方法。
▪ @Slf4J 用于为描述的类添加一个日志属性对象。
AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域中的面向切 面编程,它是面向对象编程(OOP)的一种补充和完善。
AOP与OOP区别
实际项目中我们通常将面向对象理解 为一个静态过程(例如一个系统有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面的运行期代理方式,理解为一个动态过程(在对象运行时动态织入一些扩展功能或控制对象执行)
相关术语分析
▪ 切面(aspect): 横切面对象,一般为一个具体类对象。
▪ 切入点(pointcut):定义了切入扩展业务逻辑的位置(哪些方法运行时切入扩展业务),一 般会通过表达式进行相关定义,一个切面中可以定义多个切入点。
▪ 通知(Advice): 内部封装扩展业务逻辑的具体方法对象,一个切面中可以有多个通知(在 切面的某个特定位置上执行的动作(扩展功能)。
▪ 连接点(joinpoint):程序执行过程中,封装了某个正在执行的目标方法信息的对象,可以 通过此对象获取具体的目标方法信息,甚至去调用目标方法
通知类型
▪ @Around (优先级最高的通知,可以在目标方法执行之前,之后灵活进行业务拓展.)
▪ @Before (目标方法执行之前调用)
▪ @AfterReturning (目标方法正常结束时执行)
▪ @AfterThrowing (目标方法异常结束时执行)
▪ @After (目标方法结束时执行,正常结束和异常结束它都会执行)
切面执行顺序
切面的优先级需要借助@Order 注解进行描述,数字越小优先级越高,默认优先级比较低
启动异步
SpringBoot 工程中默认支持异步操作,但是我们需要首先在启动类的上面,添加启动 异步操作的注解(@EnableAsync)描述。
定义切入点方法
某个业务方法需要执行异步操作,可以使用@Async 注解对方法进行描述。@Async 注解描述的方法,在 spring 中会认为这是一个异步切入点方法, 在这 个切入点方法执行时,底层会通过通知方法获取线程池中的线程,通过池中的线程调用切入点方法(底层默认池类型为 ThreadPoolExecutor 类型)
自定义线程池的配置(properties)
#核心线程数
spring.task.execution.pool.core-size=2
#阻塞式队列容量
spring.task.execution.pool.queue-capacity=1
#池中允许的最大线程数
spring.task.execution.pool.max-size=3
#普通线程超出keep-alive属性设置的时间值,则释放线程
spring.task.execution.pool.keep-alive=60000
#配置线程名的前缀,设置的目的是了更好识别这些线程,出现问题便于调试
spring.task.execution.thread-name-prefix=db-service-task-
#是否允许核心线程被释放
spring.task.execution.pool.allow-core-thread-timeout=false