Java 如何使用线程上下文跨方法传递对象?

Java 如何使用线程上下文跨方法传递对象?,java,dropwizard,mdc,Java,Dropwizard,Mdc,我希望在线程内的方法之间传递对象,而不使用方法签名 例如: public class Controller { @GET public void requestController() { // set user data in the controller currentThread } } public class Service { public void serviceMethod() { // get

我希望在线程内的方法之间传递对象,而不使用方法签名

例如:

public class Controller {

    @GET
    public void requestController() {

        // set user data in the controller currentThread

    }

}

public class Service {
    
    public void serviceMethod() {

        // get user data in the service method from currentThread

    }

}
由于
控制器
服务
在同一个线程中,我应该能够访问
服务
中设置在
控制器
中的对象

MDC
确实遵循使用
MDC.put
MDC.get
的相同方法,但我不确定它使用的是哪种模式。

您正在寻找一种新的模式。MDC在内部使用它

用法 用法非常简单。您需要一个ThreadLocal实例,所有需要访问该实例的组件都可以访问该实例。在大多数情况下,它只是一个
公共静态final
变量

公共类SomeClass{
//在这里使用您想要的任何类,例如String
public static final ThreadLocal TL_MESSAGE=new ThreadLocal();
}
公共类控制器{
@得到
公共无效请求控制器(){
SomeClass.TL_MESSAGE.set(“hello world”);
试一试{
//设置后的所有内容都应包装在此try finally块中
service.serviceMethod();//这可以是代码中的任何地方,不必在这里直接调用。只要线程相同,并且方法在set和remove之间调用
}最后{
SomeClass.TL_MESSAGE.remove();
}
}
}
公务舱服务{
公共void服务方法(){
String message=SomeClass.TL_message.get();
}
}
陷阱/内存泄漏的可能性! 确保始终删除设置的值。
有关更多信息,请参阅:

您正在寻找的。但是要小心使用,如果不这样做,很容易导致内存泄漏properly@codeflush.dev请详细说明内存泄漏部分,它可能会造成什么问题?另外,您可以添加一个
ThreadLocal
的示例吗?感谢您添加了这个示例,您知道为什么我们在写入
ThreadLocal
时必须跟踪上一次操作吗?这是
LogbackMDC
put
实现这是非常特定于Logback用例的。查看您共享的类中的注释和链接的票证。