繁体   English   中英

@Component 请求 scope 属性

[英]@Component with request scope attributes

我的 SpringBoot 项目中有一个 class @Component 这个Scope默认是singleton就可以了。
但是现在我需要一个 object,请求 scope,它将用于此组件 class 的许多方法中。唯一的方法是将此 object 作为所有方法中的参数传递? 或者,例如,我可以在 singleton 或类似的东西中声明一个@RequestScope属性吗?

- - 编辑

一个例子:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    @Autowired
    private MyBC myBC;

    private MyClass myObject;

    public method1(MyClass param) {
        myObject = param;
        method2();
    }

    public method2() {
        System.out.println(myObject);
    }
}

我的问题是:在这段代码中, myObject是一个 singleton。根据并发性,我会遇到不同请求的问题,一个会影响method2()中的另一个。 我需要将myObject设为请求范围。

对我来说似乎不干净:

首先,让我们将您的@Component class 称为Component


您想Component的方法中使用另一个 singleton object(称之为OtherS )吗?

LombokRequiredArgsConstructorprivate static final OtherS otherSingleton使用,然后您可以在Component中以任何方法使用它。


要么


你想在其他class的其他方法中使用Component的object吗?

您可以反转前一个块并使用Component做同样的事情(与之前的OtherS一样)。 当您使用@RequiredArgsConstructor将其声明为另一个Bean中的Bean时,它将不是null并将用作Singleton class 属性(因此您可以使用this -kw 访问它)。

您可以将MyClass定义为@RequestScope组件,如下所示:

@Component
@RequestScope
public class MyClass {

  private Object data;

  public MyClass(HttpServletRequest request) {
    data = //extract data from the request
  }

  public Object getData() {
    return data;
  }
}

然后像注入任何其他 bean 一样注入它,而不MyClass参数传递给每个方法。 仅当您访问组件时,每个请求才会实例化该组件,如此所述。

请注意,请求 scope 在附加到请求的线程之外不可用。 如果您从非请求绑定线程访问它,将抛出以下异常:

java.lang.IllegalStateException:未找到线程绑定请求

您可以使用@Lazy注释。

@Lazy 和@Bean(或@Lazy 和@Component):在应用程序启动期间不要急切加载,直到在应用程序中使用它

@Lazy 和@Autowired:在外部 class 初始化期间不要加载,直到应用程序首次使用它。

启动上下文时,您必须加载MyReqBean

@RequiredArgsConstructor
@Configuration
@ComponentScan(basePackages = "com.xyz")
public class MyConfig {

    private final MyBC myBC;

    @Bean
    @Lazy
    @RequestScope //define req bean.
    public MyReqBean myReqBean() {
        return new MyReqBean(myBC);
    }
}

@RequiredArgsConstructor
public class MyReqBean {
    
    private final MyBC myBC; //singleton bean

    public method2() {
        System.out.println(myBC.getX());
    }
}

MyReqBean在每次请求时创建,并在请求结束时销毁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM