您的当前位置:首页正文

ThreadLocal与参数传递(转载)

2021-05-17 来源:一二三四网
ThreadLocal与参数传递(转载)

最近同事想通过⾃定义函数来输出国际化⽂字。⽐如: ${my:i18n('login.userid')}.

EL⽀持我们⾃定义这样的函数,问题是这个函数没法获取request对象,不知道当前页⾯的语⾔。

由此我想到threadlocal也许可以解决这个问题。

我的思路是做⼀个filter,每次都把request引⽤保存在⼀个threadlocal变量⾥。然后在上述的i18n⾃定义函数⾥读取这个threadlocal变量,得到request。 代码如下:

1 定义⼀个类读写threadlocal变量public class ThreadAttributes {

private static ThreadLocal> threadAttribues = new ThreadLocal>() { protected synchronized Map initialValue() { return new HashMap(); } };

public static Object getThreadAttribute(String name) { return threadAttribues.get().get(name); }

public static Object setThreadAttribute(String name, Object value) { return threadAttribues.get().put(name, value); }}

2 在⼀个filter⾥写⼊request

public void doFilter(ServletRequest req, ServletResponse resp,

FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) resp;

ThreadAttributes.setThreadAttribute(\"request\ .....}

3 读取request

HttpServletRequest request = (HttpServletRequest)ThreadAttributes.getThreadAttribute(\"request\");

由此,我想到其他类似的问题。

跟web相关的⾥的⽅法,往往都有request参数; 跟数据库相关的⽅法,往往都有连接或事务的参数; 跟绘图相关的⽅法⾥,往往有⼀个绘图设备参数; 。。。。

如今分层架构⾮常普及,如果这些⾮常令⼈讨厌,但⼜的确需要的参数,都⽤上述的⽅案来在堆栈之间传递,将是⼀个不错的主意。事实上,spring已经让我们尝到了甜头,解放了我们的DAO对象,看不到connection参数。 我这⾥且叫它为“隐式参数”模式。

因篇幅问题不能全部显示,请点此查看更多更全内容