当前位置: 首页 > 知识库问答 >
问题:

Spring将单例bean注入到原型bean中导致单例重新创建

姜博
2023-03-14

我目前有一个简单的singletonbean作为pojo,我正在将其注入到工作线程中,工作线程是用@scope(“prototype”)定义的。

我发现singletonbean被正确地注入到原型中,singleton被重新初始化,并且所有的值都返回null

下面是注入单例的代码:

@Component("filterWorkerPaired")
@Scope("prototype")
public class FilteringWorkerPaired implements FilteringWorker {


private RangeFilteringParams rangeFilteringParams;


@Inject
@Named("rangeFilteringParams")
public void setRangeFilteringParams(RangeFilteringParams rangeFilteringParams) {
    this.rangeFilteringParams = rangeFilteringParams;
}

POJO:

@Component("rangeFilteringParams")
public class RangeFilteringParams {

private Footprint footprint;
private SpanLength spanLength;
private WindowLength windowLength;
private boolean isPaired;
private List<MappingStrandSE> mappingStrandsSE;
private List<MappingTypeSE> mappingTypesSE;
private List<MappingStrandPE> mappingStrandsPE;
private List<MappingTypePE> mappingTypesPE;
private String suffix;
private boolean isLastStream = false; //default

@PostConstruct
public void init(){
    System.out.println("init filtering ");
}

@PreDestroy
public void destory(){
    System.out.println("destoryed");
}

public boolean isLastStream() {
    return isLastStream;
}

public void setLastStream(boolean lastStream) {
    isLastStream = lastStream;
}

public Footprint getFootprint() {
    return footprint;
}

public void setFootprint(Footprint footprint) {
    this.footprint = footprint;
}

public String getSuffix() {
    return suffix;
}

public void setSuffix(String suffix) {
    this.suffix = suffix;
}

public SpanLength getSpanLength() {
    return spanLength;
}

public void setSpanLength(SpanLength spanLength) {
    this.spanLength = spanLength;
}

public WindowLength getWindowLength() {
    return windowLength;
}

public void setWindowLength(WindowLength windowLength) {
    this.windowLength = windowLength;
}

public boolean isPaired() {
    return isPaired;
}

public void setPaired(boolean paired) {
    isPaired = paired;
}

public List<MappingStrandSE> getMappingStrandsSE() {
    return mappingStrandsSE;
}

public void setMappingStrandsSE(List<MappingStrandSE> mappingStrandsSE) {
    this.mappingStrandsSE = mappingStrandsSE;
}

public List<MappingTypeSE> getMappingTypesSE() {
    return mappingTypesSE;
}

public void setMappingTypesSE(List<MappingTypeSE> mappingTypesSE) {
    this.mappingTypesSE = mappingTypesSE;
}

public List<MappingStrandPE> getMappingStrandsPE() {
    return mappingStrandsPE;
}

public void setMappingStrandsPE(List<MappingStrandPE> mappingStrandsPE) {
    this.mappingStrandsPE = mappingStrandsPE;
}

public List<MappingTypePE> getMappingTypesPE() {
    return mappingTypesPE;
}

public void setMappingTypesPE(List<MappingTypePE> mappingTypesPE) {
    this.mappingTypesPE = mappingTypesPE;
}

}

我知道rangeFileringParamsbean正在重新创建,因为调试器中的ID发生了变化,并且init filtering被打印到控制台。

用这种方式将单例注入到原型中有什么问题吗?

多谢了。

共有1个答案

尹赞
2023-03-14

就像你说的,它已经解决了,但无论如何。如果您正在创建一个具有初始状态的bean,我建议您使用configuration而不是@component注释,然后您就可以在一个地方创建bean并初始化字段。例如:

@Configuration
public class RangeFilteringParamsConfiguration {

    @Bean
    public RangeFilteringParams rangeFilteringParams() {
        RangeFilteringParams params = new RangeFilteringParams();
        //set the fields here...
        return params;
    }
}
 类似资料:
  • 我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方

  • Spring具有bean类型/作用域,如 -singleton bean(每个应用程序上下文只有一个bean), -prototype bean(每个请求一个新bean) 现在,如果在单例bean中有对原型bean的引用,是否有办法在对单例bean的每个请求中获得一个新的原型bean(在单例bean中)。< br >如果是,配置会是什么样的?

  • 通常在Spring上下文中,如果原型bean被注入到单例bean中,父类的属性将重写原型bean作用域。但是,如果在原型bean作用域中注入一个单例作用域bean会发生什么。仍然使用内部bean的get bean会返回内部bean的新实例吗?

  • 我有一个用于原型bean的FactoryBean,如下所示: 我希望在控制器中自动连接它,并且每当我尝试访问属性时(通过,从获得一个新的原型实例: 但是,这从来不会调用getObject()。如果我注入ApplicationContext一个直接访问bean,它就会工作,提供一个全新的属性bean: 如何直接使用@autowired注入来实现?

  • 假设有两个类ClassA和ClassB。假设ClassB依赖于ClassA。在配置文件中,如果我们将ClassA的作用域定义为singleton,而将ClassB的作用域定义为Prototype,那么每次创建ClassA的bean实例时ClassB的实例会发生什么?每次返回ClassA实例时,会返回相同的ClassB实例还是创建新实例? 谢谢!!!

  • 当使用Spring Framework时,我怀疑在下面提到的场景中会创建多少实例: bean配置如下 默认情况下,bean“a”具有。因此,有一个单例bean引用了一个具有会话范围或原型范围的bean。 在这种情况下,如果有2个对应用程序的同时请求,那么将创建多少个A实例和多少个B实例? 如果有人能解释这是如何工作的,那将是非常有帮助的。 谢了达薇亚