Spring(二)-AOP
参考文献
路人甲-Spring系列
AOP
AOP是一种编程范式,通过将横切关注点(如日志记录、安全性检查等)与核心业务逻辑进行分离,可以使代码更加模块化、可维护性更高.
Spring框架中的AOP模块提供了一种方便的方式来实现AOP,它采用了动态代理和字节码增强技术,可以在运行时动态地将切面逻辑织入到目标对象的方法中,从而实现AOP的目的.
Aspect-Oriented Programming,意为面向切面编程.
作用:在程序中具有公共特性的某些类/某些方法上进行拦截, 在方法执行的前面/后面/执行结果返回后增加执行一些方法.
AOP相关概念
目标对象(target): 目标对象将要被增强的对象,即包含主业逻辑的类对象.
连接点(join point): 连接点,程序运行的某一个点,比如执行某个方法,在Spring AOP中join point总是表示一个方法的执行.
代理对象(proxy): AOP中会通过代理的方式,对目标对象生成一个代理对象,代理对象中会加入需要增强功能,通过代理对象来间接的访问目标对象,起到增强目标对象的效果.
通知(advice) ...
Spring(二) Inversion of Control (IoC)
参考文献
什么是IoC?
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法;
将对象的创建和组装的主动控制权都交给Spring容器来完成,使用这只需要从Spring容器中查找需要的使用的对象.
主要是为了降低系统代码的耦合度,让系统利于维护和扩展.
Spring容器主要负责容器中对象的创建,组装,对象查找,对象生命周期的管理等等操作.
IoC容器的职责
实现与执行的任务之间要解耦;
实现bean的管理,让应用程序不用过渡关注bean的生命周期以及依赖;
IoC容器是具有依赖注入功能的容器,负责对象的实例化,对象的初始化,对象和对象之间依赖关系配置,对象销毁,对外提供对象的查找等操作,对象的整个生命周期都是由容器来控制.
通用职责
依赖处理
依赖查找
依赖注入
生命周期管理
容器的生命周期(启动,停止…);
托管的资源(Java Beans或其他资源的生命周期);
配置
容器的配置
外部化配置
托管的资源(Java Beans或其他资源)
如何实现IoC?
IoC主要实现策 ...
Spring-面试题
什么是Spring Framework?
Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度.
它是轻量级、松散耦合的.
Spring核心主要两部分:
IOC - 控制反转
AOP - 面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚.
Spring Framework有哪些核心模块?
spring-core: Spring基础API模块,如资源管理,泛型处理;
spring-beans: Spring Bean相关,如依赖查找,依赖注入;
spring-aop: Spring AOP处理,如动态代理,AOP字节码提升;
spring-context: 事件驱动,注解驱动,模块驱动等;
spring-expression: Spring表达式语言模块;
什么是IoC?
IoC是反转控制,类似好莱坞原则,主要实现有依赖注入(DI)和依赖查找;
IoC: 将类的对象的创建交给Spring容器来管理创建
DI: 将类里面的属性在创建类的过程中给属性赋值
依赖查找和依赖注入的区别?
依赖查找是通过容器或上下文来查找所需的依赖关系,并将其注入到所需的 ...
Kafka-副本和ISR
参考文献
Apache Kafka实战–胡夕
ISR
就是Kafka集群动态维护的一组同步副本集合(in-sysn replicas);
每个topic分区都有自己的ISR列表,ISR中的所有副本都与leader保持同步状态.
值得注意的是,leader副本总是包含在ISR中的,只有ISR中的副本才有资格被选举为leader.而 producer写入的一条Kafka消息只有被ISR中的所有副本都接收到,被视为"已提交"状态.由此可见,若ISR中有N个副本,那么该分区最多可以忍受N-1个副本崩溃而不丢失已提交的消息;
foller副本同步
foller副本只做一件事情:向leader副本请求数据.
起始位移(base offset): 表示该副本当前所含第一条消息的offset;
高水印值(high watermark,HW): 副本高水印值.它保存了该副本最新一条已提交消息的位移.
leader分区的HW值决定了副本中已提交消息的范围,也确定了consumer能够获取的消息的上限,超过HW值的所有消息都被视为"未提交成功的" ...
Spring(一) SpringFramework总览
参考文献
小马哥讲Spring核心编程思想
核心特性(Core)
IoC容器(IoC Container)
Spring事件(Events)
资源管理(Resources)
国际化(i18n)
校验(Validation)
数据绑定(Data Binding)
类型转换(Type Conversion)
Spring表达式(Spring Express Language)
面向切面编程(AOP)
数据存储(Data Access)
JDBC
事务抽象(Transactions)
DAO支持(DAO Support)
O/R映射(O/R Mapping)
XML编列(XML Marshalling)
Web技术
Web Servlet技术栈
Spring MVC
WebSocket
SocketJS
Web Reactive 技术栈
Spring WebFlux
WebClient
WebSocket
技术整合(Integration)
远程调用(Remoting)–(同步)
Java RMI
基于Hessian协议
Java消息服务(JMS)–( ...
MySQL(七)-存储过程,视图,触发器
参考文献
MySQL 8 Cookbook
存储过程
存储的函数(function)和过程(procedure)都称为存储例程(routine);
要创建存储过程,应该具有CREATE ROUTINE权限
存储函数有返回值,存储过程没有返回值.
所有代码都写在BEGIN和END之间
存储函数可以直接在SELECT语句中调用
可以使用CALL语句调用存储过程.
123456789101112131415161718-- 修改最外层语句结束符delimiter 自定义结束符号 SQL语句自定义结束符号delimiter ; -- 修改回原来的分号-- 语句块包裹begin 语句块end-- 特殊的执行1. 只要添加记录,就会触发程序。2. Insert into on duplicate key update 语法会触发: 如果没有重复记录,会触发 before insert, after insert; 如果有重复记录并更新,会触发 before insert, before update, after update; 如果有重复记录但是没有 ...
MySQL(四)-常见函数
MySQL常见函数
字符函数
数值运算符与函数
比较运算符与函数
日期时间函数
信息函数
聚合函数
加密函数
字符函数
函数名称
描述
CONCAT()
字符连接
CONCAT_WS()
使用指定的分隔符进行字符连接
FORMAT()
数字格式化函数
LOWER()
转换为小写字母
UPPER()
转换为大写字母
LEFT()
获取左侧字符
RIGHT()
获取右侧字符
LENGTH()
获取字符串长度
LTRIM()
删除前导空格
RTRIM()
删除后导空格
SUBSTRING()
字符串截取
[NOT] LIKE
模式匹配
REPLACE()
字符串替换
数值运算符与函数
函数名称
描述
CEIL()
进一取整(向上取整)
FLOOR()
舍一取整(向下取整)
DIV
整数除法
MOD
取模
POWER()
幂运算
ROUND()
四舍五入
TRUNCATE()
数字截取
ABS()
取绝对值
比较运算符与函数
函数名称
描述
[NOT] BETW ...
MySQL(三)-理论
参考文献
MySQL 数据库面试题(2021最新版)
极客时间–MySQL实战45讲
MySQL技术内幕 InnoDB存储引擎
MySQL 设计与开发规范,很详细,你该注意了
MySQL技术内幕 SQL编程
SQL四种语言: DDL,DML,DCL,TCL
DDL
DDL(Data Definition Language ) 数据库定义语言 statements are used to define the database structure or schema.
DDL是SQL语言的四大功能之一.用于定义数据库的三级结构,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性、安全控制等约束DDL
不需要commit.
123456CREATEALTERDROPTRUNCATECOMMENTRENAME
DML
DML(Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects.
由DBMS提供,用于让用户或程序员使用, ...
Java多线程(四)-线程池
参考文献
Java 线程池必备知识点:工作流程、常见参数、调优、监控
以面试官视角万字解读线程池10大经典面试题!
线程池
合理使用线程池的好处
降低资源消耗.
通过重复利用已经创建的线程降低线程创建的和销毁造成的消耗.例如,工作线程Woker会无线循环获取阻塞队列中的任务来执行.
提高响应速度.
当任务到达时,任务可以不需要等到线程创建就能立即执行.
提高线程的可管理性.
线程是稀缺资源,Java的线程池可以对线程资源进行统一分配、调优和监控.
实现线程池
一般的线程池主要分为以下4个组成部分
线程池管理器:用于创建并管理线程池
工作线程:线程池中的线程
任务接口:每个任务必须实现的接口,用于工作线程调度其运行
任务队列:用于存放待处理的任务,提供一种缓冲机制
自定义拒绝策略接口
1234@FunctionalInterfacepublic interface RejectPolicy<T> { void reject(BlockingQueue<T> queue, T task);}
...
无题
参考文献
3W 字详解 Java 集合
源码阅读(1):Java中主要的List结构——概述
集合框架
所有集合实现类的最顶层接口为Iterable和Collection接口,再向下Collection分为了三种不同的形式,分别是List,Queue和Set接口,然后就是对应的不同的实现方式.
List
ArrayList: Object[] 数组
Vector: Object[] 数组
LinkedList: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
Set
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
LinkedHashSet: LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)
Queue
Priorit ...