[英]@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
)吗?
将Lombok
的RequiredArgsConstructor
与private 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.