一
1.StringManager.java类中用到了jdk的类ResourceBundle。这个类的作用是国际化,使用方法
ResourceBundle bundle = new ResourceBundle(baseName);
bundle.getString("key");
其中baseName就是包的路径下的properties文件,例如
com.maclaren.bundles.LocalStrings就是com/maclaren/bundles目录下的LocalStrings.properties文件
在StringManager类中是这样取得的
private StringManager(String packageName) {
String bundleName = packageName + "LocalStrings";
try {
bundle = ResourceBundle.getBundle(bundleName);
}
catch(MissingResourceException ex) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl != null) {
try {
bundle = ResourceBundle.getBundle(bundleName, Local.getDefault(), cl);
return;
}
catch (MissingResourceException ex2) {
}
}
}
}
2.ReentrantReadWriteLock在tomcat的源代码中,一些在并发环境下需要读取配置文件的操作中使用锁来保存一致性。
ReentrantReadWriteLock是jdk5.0之后才支持的,作用类似synchronized的作用,但是更加面向对象
声明
ReadWriteLock rwl = new ReentrantReadLock();
Lock readLock = rwl.readLock();
Lock writeLock = rwl.writeLock();
使用
try {
readLock.lock();
}
finally {
readLock.unlock();
}
3.有些时候,如果需要在系统退出前完成某些操作,那么可以使用ShutdownHook。自己的shutdownHook一定要继承Thread,在run方法内写自己的实现然后这样使用
Runtime.getRuntime().addShutdownHook(**)
参数就是自己写的shutdownHook类
Class clz = Class.forName("com.****");
Class[] paramTypes = new Class[1];
Object[] paramValus = new Object[1];
paramTypes[0] = String.class;
paramValues[0] = "**";
Method method = clz.getMethod(methodName, paramTypes);
method.invoke(methodName, paramValues);
5.transient volatile strictfp
transient只能修饰变量,当对象序列化的时候不保存该变量
volatile只能修改变量,在多线程环境下,每个线程都保存自己的变量,而该修饰符修饰的变量在被读取的时候总是强制重新从共享内存里面读取该变量,保证一致性,每次有线程修改该变量都强制同步到共享中
strictftp可以修饰类方法,可以使得浮点计算精度更高
二、Connector模块
1.Request和RequestFacade这两个类的对比可以发现,tomcat源代码中很多facade,其实就是有点类似接口开发中,暴露有限的方法给外部调用,再有一个就是Facade类做了些额外的处理,当然可以将这些处理逻辑放到原始的类中,但是这样逻辑就会过多,代码臃肿,如果facade符合门面模式。具体的在Request类中有个方法
public Enumeration getAttributeNames() {
if(isSecure() && !sslAttributeParsed) {
getAttribute(Globals.CERTIFICATES_ATTR);
}
return new Enumberation(attributes.keySet(), true)
}
而在RequestFacade类中
public Enumeration getAttributeNames() {
if (request == null) {
throw new IllegalStateException(
new GetAttributePrivilegedAction();
)
} else {
return request.getAttributeNames();
}
}
其中GetAttributePrivilegedAction是有安全管理器的
private final class GetAttributePrivilegedAction
implements PrivilegedAction {
public Object run() {
return request.getAttributeNames();
}
}
其他的一些方法也是类似的,都是安全管理器做些处理。
另外一个注意的地方就是在RequestFacade类中,Request对象的处理,没有使用单例模式
public RequestFacadeRequest(Request requeset){
this.request = request;
}
protected Request request = null;
而且RequestFacade类还不让克隆
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}