Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring上下文中承载类范围内的数据_Java_Spring_Spring Boot - Fatal编程技术网

Java 在Spring上下文中承载类范围内的数据

Java 在Spring上下文中承载类范围内的数据,java,spring,spring-boot,Java,Spring,Spring Boot,我正在编写一个spring引导组件/服务,它采用复合结构,丰富它,并将其转换为不同的复合结构 合成代码示例: @Component public class Enricher { private final ExternalCache cache; public Result enrich(Request req) { Result result = new Result(); result.setLayers(req.getAllLevels(

我正在编写一个spring引导组件/服务,它采用复合结构,丰富它,并将其转换为不同的复合结构

合成代码示例:

@Component
public class Enricher {
    private final ExternalCache cache;

    public Result enrich(Request req) {
        Result result = new Result();
        result.setLayers(req.getAllLevels().forEach(level -> toLayer(level)));
        return result;
    }

    private Layer toLayer(Level level) {
        Layer layer = new Layer();
        layer.setLevels(level.getAllSubLevels().forEach(subLevel -> toSubLayer(subLevel)));
        return layer;
    }
    
    private SubLayer toSubLayer(SubLevel subLevel) {
        // Need a property of the original request here!
        SubLayer subLayer = new SubLayer(cache.get(requestId));
    
        // ... Applying other logic to SubLayer here ...
    
        return subLayer;
    }
}
为了创建子层,我需要请求实例的属性。因为每个spring组件定义为单例,所以它不应该持有任何请求状态。 因此,如果我想使用请求的属性,我必须执行以下操作之一:

  • 在整个调用堆栈中传播它-将起作用,但会使代码变得非常复杂和不可读,尤其是当我需要较低级别上的多个属性时
  • 使用ThreadLocal,在enrich()方法的开头设置它,并在返回之前清除它-可读性更强,但也容易出错,有点忽略了ThreadLocal的要点
  • 将bean声明为原型——没有帮助,因为存储状态仍然有问题,这也可能会影响调用方bean(可能还必须将其转换为原型)
  • 如果不是Springbean,我可以将这些参数声明为字段并在构造函数中设置它们,但我仍然希望享受Springbean的好处


    有没有一种方法可以优雅地解决这个问题?

    因为每个spring组件在定义上都是单例组件,所以它不能保存状态。
    我本能地认为单例组件可以比任何其他类型的beanBTW更好地保存状态,我会通过调用堆栈传播它。根据所需属性的数量,您可能希望创建一个maintainable@YassinHajaj澄清了我关于单身和州的声明。10倍用于指出它。关于传播,正如我所说,它会起作用,但它非常麻烦。创建参数对象将使事情更加复杂。当然,问题已经很复杂了,拥有一个复杂但可维护的解决方案是没有问题的。顺便说一句,如果您的问题在这里没有得到回答,您也可以在CodeReviewStackExchange上试试运气,如果您为他们提供了一段您想要实现的代码