一、类的加载机制
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。
二、AOP
通知: 通知定义了切面是什么以及何时使用的概念。Spring 切面可以应用5种类型的通知:
- 前置通知(Before):在目标方法被调用之前调用通知功能。
- 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
- 返回通知(After-returning):在目标方法成功执行之后调用通知。
- 异常通知(After-throwing):在目标方法抛出异常后调用通知。
- 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
连接点:是在应用执行过程中能够插入切面的一个点。
- 切点: 切点定义了切面在何处要织入的一个或者多个连接点。
- 切面:是通知和切点的结合。通知和切点共同定义了切面的全部内容。
- 引入:引入允许我们向现有类添加新方法或属性。
- 织入:是把切面应用到目标对象,并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有多个点可以进行织入:
- 编译期: 在目标类编译时,切面被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
- 类加载期:切面在目标加载到JVM时被织入。这种方式需要特殊的类加载器(class loader)它可以在目标类被引入应用之前增强该目标类的字节码。
- 运行期: 切面在应用运行到某个时刻时被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。SpringAOP就是以这种方式织入切面的。
三、事务管理
1.原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
2.一致性(Consistency)事务在完成时,必须是所有的数据都保持一致状态。
3.隔离性(Isolation)并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性。
4.持久性(Durability)一旦事务完成,数据库的改变必须是持久化的。
Spring事务的隔离级别
| 名称 | 值 | 解释 |
|---|---|---|
| ISOLATION_DEFAULT | -1 | 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应 |
| ISOLATION_READ_UNCOMMITTED | 1 | 这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。 |
| ISOLATION_READ_COMMITTED | 2 | 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。 |
| ISOLATION_REPEATABLE_READ | 4 | 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。 |
| ISOLATION_SERIALIZABLE | 8 | 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。 |
Spring事务的传播属性
由上图可知,Spring定义了7个以PROPAGATION_开头的常量表示它的传播属性。
| 名称 | 值 | 解释 |
|---|---|---|
| PROPAGATION_REQUIRED | 0 | 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是Spring默认的事务的传播。 |
| PROPAGATION_SUPPORTS | 1 | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
| PROPAGATION_MANDATORY | 2 | 支持当前事务,如果当前没有事务,就抛出异常。 |
| PROPAGATION_REQUIRES_NEW | 3 | 新建事务,如果当前存在事务,把当前事务挂起。 |
| PROPAGATION_NOT_SUPPORTED | 4 | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
| PROPAGATION_NEVER | 5 | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
| PROPAGATION_NESTED | 6 | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 |
1,string类型:
string类型是二进制类型,可以将图片和视屏,等等保存起来,也可以将一些静态文件保存起来,如js、css等等
2,list类型:
list类型是双向链表结构,如在微博中的我关注的列表或者论坛中所有回帖用户的id等等数据,同时list也能实现简单的消息队列,具体可以先用rpush把消息放入到队列尾部,再用lpop把消息从队列头部取出
3,set类型:
set类型是一种无序类型,在redis内部是通过 HashTable实现,查找和删除元素十分快速,可以用于记录一些不能重复的数据,例如每次注册的时候将用户名存起来,每次新的用户注册的时候,都可以先set查询该用户名是否被注册,效率极高,还有一种比较广泛的应用就是投票系统,比如一天用户只能投票一次,我们就可以使用今天的日期作为set的key,存取用户的投票行为,查询的时候也用日期查询,是不是感觉效率很高呢
4,sorted set 类型:
sorted set 类似于set ,只不过sorted set 是一种有序集合,在web中比较有用,如我们要对博客按照顶贴进行排序,我们就可以将排序的字段设置成sorted set 的score,将具体数值设置成具体的值,每次更新数据只需要用zadd命令修改score的值就可以了
5,hash类型:
hash类型是每个key对用一个HashTable,适合于存储对象,例如用户的信息对象,用户id作为key,具体信息作为value
本文深入讲解Java类的加载机制,包括加载、验证、准备、解析、初始化等阶段;阐述Spring AOP通知机制,涵盖前置、后置、返回、异常及环绕通知;探讨Spring事务管理,涉及原子性、一致性、隔离性和持久性的核心概念;并介绍Redis五种数据类型的典型应用场景。
2093

被折叠的 条评论
为什么被折叠?



