异常 2020-01-07 错误 程序运行时发生的不被期望的事件,阻 ⽌了程序按照预期正常执行。常见程序错误分三类: 编译错误:没有遵循语法规范。 运行时错误:程序在执行时发生的错误。 逻辑错误:程序没有按照预期的逻辑顺序执行。 Java 异常体系 个 java.lang.Throwable 类是 Java 中所有错误和异常的超类,其派生的两个子类分别为:Error、Exception。 Error 包含大量子类,用于抽象出错后程序无法处理的情况,例如:OutOfMemoryError。 Exception 包含大量子类,用于抽象程序本身可以处理的异常。例如:ArrayIndexOutOfBoundException。同时 Exception 又派生出量大子类: 运行时异常(不可查异常):RuntimeException 类及其子类,例如:ArrayIndexOutOfBoundsException。ClassNotFoundException。 非运行时异常(编译时可查异常):所有 Exception 类及其子类(RuntimeException 类及其子类除外),例如:IOException。....
JDK8~13新特性 2019-10-28 接口新特性_JDK8 使用场景 接口里面定义公用的业务逻辑,抽取出来,每个子类都必须具备;静态方法可以充当工具类 默认方法default 接⼝⾥⾯定义⼀个默认⽅法,这个接⼝的实现类实现了这个接⼝之后,不⽤管这个 default修饰的⽅法就可以直接调⽤,即接⼝⽅法的默认实现。 Animal_interface public interface Animal { void run(); void eat(); default void breath(){ System.out.println("使用氧气呼吸"); } static void test(){ System.out.println("这个是静态方法"); } } Dog public class Dog implements Animal { @Override public void run() { System.out.println("dog 跑"); } @Override public void eat() { System.out.println("dog 吃"); } } 静态方法 接⼝名.静态⽅法来访....
Mybatis 2020-01-12 # MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 快速入门 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>....
MyBatis-Plus 2020-01-07 什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。消除了 JDBC 的复杂性,MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 MyBatis vs JPA MyBatis 的优势 SQL 语句可以自由控制,更灵活、性能较高。 SQL 与代码分离、易于阅读和维护 提供 XML 标签,支持编写动态 SQL 语句 MyBatis 的劣势 简单的 CRUD 操作还得写 SQL 语句(XML 或注解) XML 中有大量的 SQL 要维护 MyBatis 自身功能很有限,但支持 Plugin MyBatis-Plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网 码云 GitHun 无侵入:只做....
Netty 2020-04-13 剖析:启动服务 # 服务启动主线 * Selector selector = sun.nio.ch.SelectorProviderImpl.openSelector() * ServerSocketChannel serverSocketChannel = provider.openServerSocketChannel() * selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this); * javaChannel().bind(localAddress, config.getBacklog()); * selectionKey.interestOps(OP_ACCEPT); • Selector 是在 new NioEventLoopGroup()(创建一批 NioEventLoop)时创建。 • 第一次 Register 并不是监听 OP_ACCEPT,而是 0: selectionKey = javaChannel().register(eventLoop().unwrap....
Shiro 2020-01-07 什么是权限控制 将指定用户绑定到指定资源上,只能对指定资源进行(CRUD)操作。 限框架核心知识 ACL 和 RBAC ACL: Access Control List 访问控制列表 以前盛行的一种权限设计,它的核心在于用户直接和权限挂钩。 例子:常见的文件系统权限设计(Linux 文件系统权限设计), 直接给用户加权限 优点:简单易用,开发便捷。 缺点:用户和权限直接挂钩,导致在授予时的复杂性,比较分散,不便于管理。 RBAC: Role Based Access Control 基于角色的访问控制系统。权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。 例子:基于 RBAC 模型的权限验证框架与应用 Apache Shiro、Spring Security。 优点:简化了用户与权限的管理,通过对用户进行分类,使得角色与权限关联起来 缺点:开发对比 ACL 相对复杂 总结:不能过于复杂,规则过多,维护性和性能会下降, 更多分类 ABAC、PBAC 等。 Apache Shiro VS Spring Security Spring Security ....
线程池 2020-03-11 线程池 单个请求处理的时间很短,海量请求的情况下,频繁的创建线程,销毁线程所带来的系统开销是巨大的。 降低频繁创建、销毁线程的开销、线程的创建和销毁需要 JVM 进行大量的辅助操作。(内存的分配与回收、还会给垃圾回收器带来压力) “池”的概念可以很好的防止资源不足。过多线程会占用大量内存,导致OOM。 加快响应速度(复用池中的线程) 合理利用CPU和内存。 统一管理资源。 线程池适用的场景 服务器接受到大量请求时,使用线程池技术是非常适合的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率。 5个以上的线程就可以使用线程池来管理。 不使用线程池(海量任务) 线程的创建和销毁需要 JVM 进行大量的辅助操作。(内存的分配与回收、还会给垃圾回收器带来压力) 在Java语言中每创建一个线程直接对应操作系统中的一个线程。在操作系统中频繁创建、销毁大量线程会造成很大的系统开销。操作系统支持创建的线程数是有上限的。(线程数量无法与未知的任务数量一一对应) 无法作用于C10K场景,会引发OOM异常。 public class EveryTaskOneThread { publi....