Несколько человек (например, на стороне сервера http://www.theserverside.com/news/thread.tss?thread_id=41473)) полагают, что использование объектов ThreadLocal так же плохо, как и использование глобальных переменных.
Я полагаю, что это правда, если вы сделаете их открытыми статическими переменными.
Проблема в том, что трудно определить, где он используется, где он изменен и т. Д.
В моем весеннем веб-приложении DI tomcat, похоже, эта проблема решается, если я просто заставлю Spring создать одноэлементный объект, в котором есть мои ThreadLocal (s), а затем внедрить этот синглтон в любой класс, который в этом нуждается.
Итак, мой синглтон выглядит так:
@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 - это объявление о том, что этот класс использует эту переменную.
Каковы преимущества и недостатки этого подхода?