当前位置: 首页 > 面试题库 >

我是否应该将ThreadLocals放入弹簧注入的单例中?

杨俊茂
2023-03-14
问题内容

一些人(例如,在服务器端http://www.theserverside.com/news/thread.tss?thread_id=41473)建议使用ThreadLocal对象与使用全局变量一样糟糕。我想如果您将它们设为公共静态变量,那是真的。然后的问题是,很难分辨出它的使用位置,更改位置等。

在我的spring 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是该类使用该变量的声明。

这种方法的优点和缺点是什么?


问题答案:

如果使用Spring,则可以简单地使用请求范围的bean而不是显式ThreadLocals:

public interface UserName {
    ...
}

@Component 
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
public class UsernameImpl implements UserName { 
    private String username; 
    ...
}


 类似资料:
  • 问题内容: 我正在尝试转换此原始sql查询: 在Spring Data规范中,我认为到目前为止我的问题是如何连接这些表。 这是我当前在规范中的转换: 我得到这个异常: 我想补充一点,例如我是Spring框架的新手,因此这是我在Spring上的第一个应用程序,因此我对新手问题表示歉意;) 编辑:添加的实体产品,BeforeRelationShip Product和FollowRelationShip

  • 问题内容: 我没有使用Spring,所以正在类中创建EntityManager的实例。 我使用了Hibernate-Eclipse逆向工程来自动生成类。这些类都有一个EntityManager的实例。 我不确定100%Hibernate如何与EntityManager一起工作,所以我想知道是否可以创建这么多的此类实例(EntityManager),例如,事务是否会出现问题? 我是否应该仅创建一个单

  • 我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方

  • 问题内容: 我听说将block元素放入内联元素是HTML的罪过: 但是,如果您像样式表那样设置外部锚点,该怎么办?还是错吗?关于块级和内联元素的HTML 4.01规范似乎是这样认为的: 样式表提供了一种方法来指定任意元素的呈现,包括将元素呈现为块还是内联。在某些情况下,例如列表元素的内联样式,这可能是适当的,但总的来说,不鼓励作者以这种方式覆盖HTML元素的常规解释。 有人对此问题有其他建议吗?

  • 问题内容: 我的单例访问器方法通常是: 我可以做些什么来改善这一点? 问题答案: 另一种选择是使用该方法。从文档中: 运行时恰好在该类或从其继承的任何类从程序内部发送其第一条消息之前,一次将其发送到程序中的每个类。(因此,如果不使用该类,则可能永远不会调用该方法。)运行时以线程安全的方式将消息发送给类。超类在其子类之前收到此消息。 因此,您可以执行以下操作:

  • 入门前端,是一件很难的事吗?在今天,我也没有想好一个答案,也不知道怎样给出一个答案。这个问题并不取决于前端,而是取决于不同人的需求。到底是想要快得一步登天呢,还是一点点的慢慢来,去享受前端带来的乐趣。 对于不同领域的学者来说,都会有一个相似的问题:如何从入门到精通?入门并不是一件很复杂的事,只是多数人想要的是更快的入门,这才是真正复杂的地方。虽说条条道路都是通过罗马的,但并不是每条道路都是能满足人