gpt4 book ai didi

java - 单例 bean 中的请求范围字段

转载 作者:行者123 更新时间:2023-11-30 09:20:21 25 4
gpt4 key购买 nike

我知道可以在 Spring 中将请求范围的 bean 注入(inject)到单例 bean 中,所以我知道我正在尝试做的事情会起作用,我只是想知道是否有一种方法可以更简洁地表达它而无需那么多额外不必要的类定义。我是 Spring 注释的新手,所以可能有一个我不知道的注释。

我有一个抽象类,它在我的应用程序中可能会扩展 100 次,作为不同的单例 spring bean。以此类定义为例:

/** The abstract class with a field that needs to be request-specific **/
public abstract class AbstractSingletonBean {

private SampleState state;
public SampleState getState() { return state; }
public void setState(SampleState state) { this.state = state; }

// Other fields that are just singleton here
}

还有一个 bean 定义的示例:

@Component
public class SampleSingletonBean extends AbstractSingletonBean {

@Resource(name="sampleState")
public void setState(SampleState state) { super.setState(state); }
}

现在我们当然需要一个名为 sampleState 的 bean。所以我必须创建两个类:一个基类来定义 SampleState 中的字段,然后是一个请求范围的 bean 定义。这是因为 AbstractSingletonBean 的每个扩展都需要它自己的状态字段的请求范围实例。

这里可能是基类:

public class SampleState {
private String fieldOne;
public String getFieldOne() { return fieldOne }
public void setFieldOne() { this.fieldOne = fieldOne }
}

这是这个愚蠢的 bean 定义:

@Component ("sampleState")
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SampleStateBean extends SampleState {}

困扰我的是,如果我有 100 个 AbstractSingletonBean 扩展,我将需要 100 个 SampleStateBean 扩展,仅使用样板代码来使其具有请求范围.有没有一种方法可以在 AbstractSingletonBean 的扩展中覆盖 setState() 并向 spring 指示它应该动态创建一个新的请求范围的 bean 并将其注入(inject)到这里?所以我的 SampleSingletonBean 可能如下所示:

@Component
public class SampleSingletonBean extends AbstractSingletonBean {

@Resource
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public void setState(SampleState state) { super.setState(state); }
}

当然这是行不通的,因为@Resource 需要引用一个已经存在的bean。是否有另一个注释可以在不为每个 SampleState bean 创建新类的情况下完成此操作?

最佳答案

Spring 也可以注入(inject)抽象类。所以你可以将 SampleState 的注入(inject)移动到抽象类,如果每个 AbstractSingletonBean 后代只需要一个 SampleState (如你的例子)。

关于java - 单例 bean 中的请求范围字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17455324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com