今天学习acegi时说SecurityContextHolder uses a ThreadLocal,在SecurityContextHolder类的initialize方法中,会根据strategyName的不同NEW一个对象,如: strategy = new ();ThreadLocalSecurityContextHolderStrategy
在执行getContext()时,会调用strategy的getContext()方法,在ThreadLocalSecurityContextHolderStrategy中,有:
private static ThreadLocal contextHolder = new ThreadLocal();
contextHolder.set(null);
}
if (contextHolder.get() == null) {
contextHolder.set(new SecurityContextImpl());
}
}
Assert.notNull(context, "Only non-null SecurityContext instances are permitted");
contextHolder.set(context);
}
public void clearContext() {
contextHolder.set(null);
}
public SecurityContext getContext() {
if (contextHolder.get() == null) {
contextHolder.set(new SecurityContextImpl());
}
return (SecurityContext) contextHolder.get();
}
public void setContext(SecurityContext context) {
Assert.notNull(context, "Only non-null SecurityContext instances are permitted");
contextHolder.set(context);
}
其中用到了ThreadLocal,之前就对此类不太了解,所以查了一些资料:
参见:
1,ThreadLocal与synchronized http://www.javaeye.com/topic/81936
2,ThreadLocal的几种误区http://www.blogjava.net/jspark/archive/2006/08/01/61165.html
3,ThreadLocal简要介绍http://myrss.easyjf.com/html/20070317/2950332416031572.htm
一直有一个疑问,就是每个ThreadLocal对每个线程似乎只能维持一个值,那么如果acegi和hibernate都用到ThreadLocal时,并且在同一个线程,这个值不是就要被重写吗?
现在的理解是,acegi和hibernate创建的是两个ThreadLocal对象,所以即使在同一线程,key值相同,值也会不同.就像建立了两个map对象一样,每个map对象中相同的key的value可以不同.