我在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
是请求作用域。
3条答案
按热度按时间pprl5pva1#
我觉得不干净:
首先,我们将
@Component
类称为Component
。你想在你的
Component
的方法中使用另一个单独的对象吗(叫它OtherS
)?将
Lombok
的RequiredArgsConstructor
与private static final OtherS otherSingleton
一起使用,那么你就可以在你的Component
内部以任何方法使用它。或
是否要在其他类的其他方法中使用
Component
的对象?你可以反转前面的代码块,然后用
Component
做同样的事情(就像之前的OtherS
一样)。当你用@RequiredArgsConstructor
把它声明为另一个Bean
中的Bean
时,它将不是null
,而是作为一个Singleton
类属性使用(所以你可以用this
-kw访问它)。zf9nrax12#
您可以将
MyClass
定义为@RequestScope
元件,如下所示:然后像其他bean一样注入它,而不必将
MyClass
参数传递给每个方法。只有当您访问组件时,组件才会被每个请求示例化,如here所述。请注意,要求范围在附加至要求的执行绪之外不可用。如果您从非要求系结执行绪存取它,将会掷回下列例外状况:
java.lang.IllegalStateException:未找到线程绑定请求
col17t5w3#
您可以使用
@Lazy
注解。@Lazy与@Bean(或@Lazy与 @Component ):在应用程序启动时不要急于加载,直到应用程序中使用它
@懒惰与@自动连线:在外部类初始化期间不加载,直到应用程序首次使用它。
启动上下文时,必须加载
MyReqBean
。MyReqBean
在每次请求时创建,并将在请求结束时销毁。