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