我知道可以在 Spring 中将请求范围的 bean 注入到单例 bean 中,所以我知道我正在尝试做的事情会起作用,我只是想知道是否有一种方法可以更简洁地表达它,而无需那么多额外的不必要的类定义。我是 Spring 注释的新手,所以也许有一个我不知道的注释。
我有一个抽象类,它将在我的应用程序中作为不同的单例 spring bean 扩展 100 次。以这个类定义为例:
/** 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
. 所以我必须创建两个类:一个定义字段的基类,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
仅使用样板代码才能使其具有请求范围。有没有办法setState()
在扩展中覆盖AbstractSingletonBean
并向spring指示它应该动态创建一个新的请求范围bean并将其注入这里?所以我的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 创建新类的情况下完成此操作?