文章目录
本文内容
这图很简单:
一堆接口作为基础功能。
下面各自都只实现一部分。
只有最底下的DSM不是抽象类。
接口们
Destroyable:可以选择死法。
CacheManagerAware:可以使用缓存管理器CM。
EventBusAware:可以通知事件总线EB。
Authorizer:鉴权功能。
Authenticator:登陆功能。
SessionManager:基础的会话功能(开启会话,获取会话)。
SecurityManager:
爸爸的:登陆,鉴权,会话开启与获取。
自己的:创建用户,会话登陆登出。
实现类们
可以根据各自的成员来推断功能:
CachingSM:缓存管理器,消息总线。
private CacheManager cacheManager;
private EventBus eventBus;
RealmSM:数据源。
private Collection<Realm> realms;
AuthenticatingSM:登录器。
private Authenticator authenticator;
AuthorizingSM:鉴权器。
private Authorizer authorizer;
SessionsSM:会话。
private SessionManager sessionManager;
DefaultSM:杂七杂八。
private static final Logger log = LoggerFactory.getLogger(DefaultSecurityManager.class);
protected RememberMeManager rememberMeManager;
protected SubjectDAO subjectDAO;
protected SubjectFactory subjectFactory;
资源的关闭过程
总是关闭当前层的资源,再调父类的关闭方法:
//SessionsSM
public void destroy() {
LifecycleUtils.destroy(getSessionManager());
this.sessionManager = null;
super.destroy();
}
//AuthorizingSM
public void destroy() {
LifecycleUtils.destroy(getAuthorizer());
this.authorizer = null;
super.destroy();
}
//AuthenticatingSM
public void destroy() {
LifecycleUtils.destroy(getAuthenticator());
this.authenticator = null;
super.destroy();
}
//RealmSM
public void destroy() {
LifecycleUtils.destroy(getRealms());
this.realms = null;
super.destroy();
}
//CachingSecurityManager
public void destroy() {
LifecycleUtils.destroy(getCacheManager());
this.cacheManager = null;
LifecycleUtils.destroy(getEventBus());
this.eventBus = new DefaultEventBus();
}
可以看到,一堆赋值null,还有调用LifecycleUtils。
public static void destroy(Object o) {
if (o instanceof Destroyable) {
destroy((Destroyable) o);
} else if (o instanceof Collection) {
destroy((Collection)o);
}
}
垃圾分类。
public static void destroy(Destroyable d) {
if (d != null) {
try {
d.destroy();
} catch (Throwable t) {
if (log.isDebugEnabled()) {
String msg = "Unable to cleanly destroy instance [" + d + "] of type [" + d.getClass().getName() + "].";
log.debug(msg, t);
}
}
}
}
直接调用destroy()方法。
public static void destroy(Collection c) {
if (c == null || c.isEmpty()) {
return;
}
for (Object o : c) {
destroy(o);
}
}
空集合直接返回,非空则遍历之,对每一个成员递归地关闭。