Spring Boot @具有请求作用域属性的组件

7uzetpgm  于 2022-12-12  发布在  Spring
关注(0)|答案(3)|浏览(131)

我在SpringBoot项目中有一个@Component类,默认情况下,这个类的作用域是singleton,这是可以的。
但是现在我需要一个对象,它有请求作用域,将在这个Component类的很多方法中使用。唯一的方法是在所有方法中将这个对象作为参数传递。或者我可以,例如,在一个单例中声明一个@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是一个单例。根据并发性,我会遇到不同请求的问题,一个请求会影响method2()中的另一个。我需要myObject是请求作用域。

pprl5pva

pprl5pva1#

我觉得不干净:
首先,我们将@Component类称为Component
你想在你的Component的方法中使用另一个单独的对象吗(叫它OtherS)?
LombokRequiredArgsConstructorprivate static final OtherS otherSingleton一起使用,那么你就可以在你的Component内部以任何方法使用它。

是否要在其他类的其他方法中使用Component的对象?
你可以反转前面的代码块,然后用Component做同样的事情(就像之前的OtherS一样)。当你用@RequiredArgsConstructor把它声明为另一个Bean中的Bean时,它将不是null,而是作为一个Singleton类属性使用(所以你可以用this-kw访问它)。

zf9nrax1

zf9nrax12#

您可以将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参数传递给每个方法。只有当您访问组件时,组件才会被每个请求示例化,如here所述。
请注意,要求范围在附加至要求的执行绪之外不可用。如果您从非要求系结执行绪存取它,将会掷回下列例外状况:
java.lang.IllegalStateException:未找到线程绑定请求

col17t5w

col17t5w3#

您可以使用@Lazy注解。
@Lazy与@Bean(或@Lazy与 @Component ):在应用程序启动时不要急于加载,直到应用程序中使用它
@懒惰与@自动连线:在外部类初始化期间不加载,直到应用程序首次使用它。
启动上下文时,必须加载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在每次请求时创建,并将在请求结束时销毁。

相关问题