我知道有可能在Spring中将请求范围的bean注入到singleton 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的bean。因此,我必须创建两个类:在SampleState中定义字段的基类,然后是请求范围的Bean定义。这是因为AbstractSingletonBean的每个扩展都需要它自己的状态字段的请求范围实例。

这里可能是基类:

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


这是这个傻豆的定义:

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


让我感到困扰的是,如果我有100个AbstractSingletonBean扩展名,我将需要100个SampleStateBean扩展名以及仅样板代码才能使其成为请求范围的对象。有没有一种方法可以在setState()的扩展名中覆盖AbstractSingletonBean并指出要立即创建一个新的请求范围的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创建新的类?

最佳答案

Spring也可以注入抽象类。因此,如果每个SampleState后代只需要一个AbstractSingletonBean(如您的示例),则可以将SampleState的注入移动到抽象类。

07-28 13:50