1说明:这里以Struts2的IOC和缓存简述,侧重讲缓存。 编写方式不是"手把手式",需要结合struts2源码或熟读过源码的人,强烈建议阅读者需要有哈希算法基础,jvm内存知识和java并发编程相关知识的读者。
2.表达能力有限,有出处的忘包含或指证。
3.目的:分享
一 、首先上图:
图1. struts2_IOC容器_构造器缓存_关联过程
图2. struts2_构造器缓存实现
二、进入struts2缓存世界,以ContainerImpl.java中的
@SuppressWarnings(“unchecked”)
ConstructorInjector getConstructor(Class implementation) {
return constructors.get(implementation);
}
方法为主线展开。
下面以注释和代码的方式贴出来 >>>>>>>>>>>
>>>>>ReferenceCache以ConstructorInjector存取过程进行简述:
一、存储:ConstructorInjector
1.通过key从缓存中取实例对象ConstructorInjector, 它存储于ReferenceMap.java类成员属性:
ConcurrentMap<Object, Object> delegate = new ConcurrentHashMap<Object, Object>();中,
2.使用了一个策略模式来存储键值对(K-V)到delegate中,例如:
delegate.put(keyReference, valueReference);
(2.1)其中keyReference被包装成强,软,弱类型(这三种类型的划分,使得每种类型都有自己的特性,
便于jvm对内存达到更精准的维护),关于这三种引用类型可以查阅一些内存相关的书籍,这里就不敖述。
Object referenceKey(K key) {
switch (keyReferenceType) {
case STRONG: return key;
cas