我应该把我的 ThreadLocal 放在弹簧注入的单例中吗?
有几个人(例如在服务器端 http://www.theserverside.com/news/thread.tss?thread_id=41473)建议使用ThreadLocal对象与使用全局变量一样糟糕。我想如果你把它们变成公共静态变量,这是真的。那么问题是,很难说出它在哪里被使用,在哪里被更改,等等。
在我的春季DI tomcat web应用程序中,如果我只是让spring创建一个包含我的ThreadLocal的单例对象,然后将该单例注入任何需要它的类,它似乎可以解决这个问题。
所以我的单例看起来像这样:
@Component
public class Username {
private ThreadLocal<String> username;
public Username() {
username = new ThreadLocal<String>();
}
public String getUsername()
return username.get();
}
public void setUsername(String name) {
username.set(name);
}
}
可能需要它的类如下所示:
@Service
public class addEntryTransaction {
@Autowired
Username username;
public void method() {
...
log("Method called by "+username.getUsername());
...
}
}
这仍然具有不必通过许多不关心的层传递用户名的好处,因此使方法参数更简单。@Autowired是此类使用该变量的声明。
这种方法的优点和缺点是什么?