struts2代码精巧设计之—会话域设计

因为来了家新公司,这里没有webx这样公司层面自定义的框架,用的是struts2,第一次接触,慢慢也算是有点了解,经常跟踪调试的时候就看看源码了,就随手把其中部分写的好,精巧的设计拉出来。

1.会话域的设计

现在的代码架构基本都是分层的,我们虽然想做到各个层次之间耦合尽量的低,但是难免或是很难做到完全依赖于抽象而不互相影响,这个时候,对于穿梭于不同层次的对象的传递的处理就很有意思。

一般的做法就是直接传递引用,因为类似java或是C#都支持,还有种就是通过线程上下文进行传递,struts2中采用就是第二种,例如它里面的ActionContext

将threadlocal当做上下文环境。获取的时候通过以下代码:
public static ActionContext getContext() {
return (ActionContext) actionContext.get();
ActionContext

static ThreadLocal actionContext = new ThreadLocal(); // 通过ThreadLocal 传递不同的 ActionContext

Map<String, Object> context;
/**
* Creates a new ActionContext initialized with another context.
*
* @param context a context map.
*/
public ActionContext(Map<String, Object> context) {
this.context = context;
}

// 具体的 ActionContext 又维护了一个 Map,来保存上下文中的数据

同理它的Dispatcher也是采用这种做的。
不同线程的Dispatcher存放在一个ThreadLocal中。

public class Dispatcher {

/**
* Provide a logging instance.
*/
private static final Logger LOG = LoggerFactory.getLogger(Dispatcher.class);

/**
* Provide a thread local instance.
*/
private static ThreadLocal<Dispatcher> instance = new ThreadLocal<Dispatcher>();

/**
* Store list of DispatcherListeners.
*/
private static List<DispatcherListener> dispatcherListeners =
new CopyOnWriteArrayList<DispatcherListener>();

作者: inter12

在这苦短的人生中,追求点自己的简单快乐

发表评论

电子邮件地址不会被公开。 必填项已用*标注