spring家族
Spring 家族Spring常见问题总结
SpringIOC
IOCIOC原理IOC(Inversion of Control):控制反转 Spring Core最核心的部分 需要先了解依赖注入(Dependency Inversion) 依赖注入含义把底层类作为参数传递给上层类,实现上层对下层的“控制” 使用依赖注入的代码实例 需要修改轮胎时只用改一下轮胎就行了,不再需要大动干戈 IOC、DI、DL的关系DL(Dependency Lookup):依赖查找(已经被抛弃,需要用户自己使用API查找对象) 依赖注入的方式 Setter 实现特定属性的pulic setter来让IOC容器调用注入所依赖类型的对象 Interface 实现特定的接口以供IOC容器注入所依赖类型的对象 Constructor 基于构造函数,实现特定参数的构造函数,在创建对象时让IOC容器注入所依赖类型的对象 Annotation 基于注解,通过Java的注解机制来让IOC容器注入所依赖类型的对象 如Autowired 依赖倒置原则、IOC、DI、IOC容器的关系 依赖倒置原则是一种思想:高层模块不应该依赖低层模块,两者都应该依赖其抽...
SpringAOP
Spring AOP 关注点分离:不同的问题交给不同的部分去解决。 面向切面编程AOP正是此种技术的体现。 通用化功能代码的实现,对应的就是所谓的切面(Aspect)。 业务功能代码和切面代码分开后,架构将变得高内聚低耦合。 确保功能的完整性:切面最终需要被合并到业务中(Weave) AOP的三种织入方式 编译时织入:需要特殊的Java编译器,如AspectJ。 类加载时织入:需要特殊的Java编译器,如AspectJ和AspectWerkz。 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单。 SpringBoot 切面实例 AOP主要名词概念 Aspect:通用功能的代码实现。 Target:被织入Aspect的对象。 Join Point:可以作为切入点的机会,几乎所有方法都能做为切入点。 Pointcut:Aspect实际被应用在的Join Point,支持正则 Advice:类里的方法以及这个方法如何织入到目标方法的方式 Weaving(织入):AOP的实现过程 Advice种类 前置通知:Before 后置通知:AfterRet...
Java异常体系
Java 异常体系异常处理机制主要回答了三个问题 What:异常类型回答了什么被抛出 Where:异常堆栈跟踪回答了在哪抛出 Why:异常信息回答了为什么被抛出 异常体系 Error和Exception的区别从概念角度解析java异常处理机制 Error:程序无法处理的系统错误,编译器不做检查 一般是与Jvm相关的问题,如系统崩快,内存不住,stackOverFlow等 仅靠程序本身无法恢复 Exception:程序可以处理的异常,捕获后可以恢复 总结:前者是程序无法处理的错误,后者是可以处理的错误。 Exception: RuntimeException:不可预知,程序应该自行避免 如访问空指针,数组下标越界,除0 非RuntimeException:可预知的,从编译器校验的异常 如文件不存在而打开文件失败 从责任的角度 Error属于JVM需要承担的责任 RuntimeException是程序应该负担的责任 Checked Exception可检查异常是Java编译器应该负担的责任 常见Error及Exception 异常处理机制 抛出异常:...
Map体系
Map体系 HashMap、HashTable、ConcurrentHashMapHashMap(Java 8以前):数组+链表 数组长度默认16 存储规则:hash(key.hashCode())%len HashMap(Java 8及以后):数组+链表+红黑树 通过常量TREEIFY_THRESHOLD决定是否将链表转化为红黑树 使用LazyLoad原则,首次使用时才会初始化数组 HashMap:如何有效减少碰撞 扰动函数:促使元素位置均匀分布,减少碰撞几率。 使用final对象,并采用合适的equals()和hashCode()方法。 Hash函数 高16位与低16位做异或,让结果更均匀,同时数组长度总是二的倍数,方便取下标,直接多取一位就行了。 HashMap:扩容问题 多线程条件下,调整大小会存在条件竞争,容易造成死锁 reHashing是一个比较耗时的过程(将原来的内容重新移到新的hash值对应的桶中) HashMap在JDK1.8之后引入了红黑树的概念,表示若桶中链表元素超过8时(并且数组的大小是64),会自动转化成红黑树;若桶中元素小...
Java的IO机制
JAVA的I/O机制BIO、NIO、AIOBIO:Block-IO 基于字节流和字符流进行操作 如InputStream和OutputStream,Reader和Writer 两端都会阻塞。 缺点:效率低 NIO:NonBlock-IO构建多路复用的、同步非阻塞的IO操作 第一个阶段:程序不断询问内核是否数据准备完成,非阻塞 第二个阶段:拷贝数据阻塞等待 NIO核心: Channels Buffers Selectors Channel类似流,数据可以从Channel读到Buffer,也可以从Buffer写入Chennel NIO-Channels FileChannel 其有两个方法: 避免了两次用户态和内核态间的上下文切换,即“零拷贝”,效率较高。 DatagramChannel SocketChannel ServerSocketChannel NIO-Buffers ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer MappedBy...
Buffer缓冲区的原理及应用
Buffer的原理及应用缓冲区的概念数据在缓冲区中排队,你先入先出的形式读写。先写入的数据先被读出来。所以看上去缓冲区像一个水管,数据流入缓冲区,然后再流出。 缓冲区内部是用于存储数据的数据结构。可能是数组、可能是链表、甚至可能是复杂的树结构,比如哈希表、树等等都有可能。 比如一个聊天服务,在处理用户发送的消息时,例如微信,一定不能马上处理这条消息。而是应该先缓冲。如果你马上处理这些消息,当并发量高的时候,总有你处理不过来的时候。而你对消息进行了缓冲有很多的好处,首先是避免了瓶颈的出现(运算性能的瓶颈。Io性能的瓶颈)。其次,有时候批量处理数据的成本更低。比如批量写入磁盘。批量发送网络请求。可以更好的利用底层的设施,比如批量写入磁盘数据就比单个一点点写入快很多很多,这些都是缓冲区的价值。 缓冲区操作 flip() 翻转:读写切换 clear() :清空缓冲区 rewind() :重读或重写 flip操作读取这样的缓冲区就需要进行缓冲区的翻转,也就是flip操作。 上图中的flip操作,将position设置为0,limit设置为position的位置。这样就从一个写入缓...
数据库架构
数据库架构如何设计一个数据库? 从如下模块出发: 为什么要使用索引?对于数据量大的表而言,查询某一条如果进行全表扫描无疑非常慢,所以需要使用索引。 通过关键信息快速定位 什么样的信息能成为索引主键、唯一键、普通键等 索引的数据结构 建立二叉树进行二分查找 建立B-Tree结构进行查找 建立B+-Tree结构进行查找 建立Hash结构进行查找 MySQL使用B+-Tree进行索引
稀疏-密集索引与搜索引擎
稀疏、密集索引与搜索引擎稀疏索引与密集索引的区别 密集索引文件中每一个搜索码值都对应一个索引值 叶子结点不仅仅保存键值,还保存有其他列的信息。 密集索引决定了物理表的排列顺序,所以一个表只创建一个密集索引,通常是主键。 稀疏索引文件只为索引码的某些值建立索引项 叶子结点仅保存了键位信息和该行数据的地址(有的稀疏索引仅保存了键位信息及其主键)。 定位到叶子结点之后仍然需要通过地址或者主键信息进一步定位到数据。 在MySQL中的具体分析主要存储引擎 MysISAM 其索引无论是主键索引还是唯一键索引或者普通索引,均为稀疏索引 InnoDB 必须有且仅有一个密集索引 如果一个主键被定义,则主键作为密集索引 如果没有主键被定义,则第一个唯一非空索引作为密集索引 若上述均不满足,InnoDB内部会生成一个隐藏主键作为密集索引 非主键索引(稀疏索引)的叶子结点并不存储行数据的物理地址,而是存储该行的主键值。 故稀疏索引包含两次查找,一次查找到主键值,第二次根据主键值找到数据 MyISAM和InnoDB索引存储对比图 InnoDB使用密集索引,将主键组织...
慢查询sql
如何定位并优化慢SQL查询1. 根据慢日志定位慢查询sql使用SQL命令查询慢日志设置1SHOW VARIABLES LIKE '%QUERY%'; 最后两个变量slow_query_log和slow_query_log_file即和慢日志有关,第一个变量控制是否开启慢日志,第二个变量定义慢日志存储位置。 超过long_query_time时间等查询会被记录在慢日志中。 开启慢查询命令打开慢查询: 1SET GLOBAL slow_query_log = ON; 设置慢查询时间: 1SET GLOBAL long_query_time = 1; 直接使用命令设置数据库重启后会还原,想要永久需要到my.cnf配置文件中去设置。 使用sql命令查询慢日志状态1SHOW STATUS like '%slow_queries%'; Slow_queries显示慢查询记录条数。 2. 使用explain等工具分析sql在命令前加explian即可分析 例如: 1EXPLAIN SELECT `name` FROM person_inf...








