Spring впрыскивает синглтон-бин в прототип, вызывая воссоздание синглтона - PullRequest
0 голосов
/ 09 мая 2018

В настоящее время у меня есть простой боб singleton в виде pojo, который я внедряю в рабочий поток, который определяется с помощью @scope("prototype").

Я обнаружил, что скорее бин singleton правильно внедряется в прототип, singleton реинициализируется и все значения возвращают null.

Вот код для ввода singleton:

@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;
}

}

Я знаю, что bean-компонент RangeFileringParams создается заново, так как идентификатор изменяется в отладчике, и init filtering выводится на консоль.

Что-то не так с инжектированием синглтона в прототип таким образом?

спасибо.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Вы не можете автоматически подключить одноэлементный компонент, если вы просто создаете компонент-прототип с новым оператором.

@Component
@Scope("prototype")
public class ExamplePType implements Serializable {
    @Autowired
    private transient Cache cache
}

Ниже некоторые не дадут автоматически подключаемый компонент, который вводится в классе ExamplePType.

  ExamplePType obj = new ExamplePType ();

Создание объекта с использованием контекста приложения для уведомления внедренного компонента для сохранения автоматически подключенного компонента.

@Component
public class Factory implements ApplicationContextAware {   
    private ApplicationContext ctx;
    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        this.ctx = ctx;

    }       
    public String run() {               
        ExamplePType obj = ctx.getBean(ExamplePType.class);        
    }   
}
0 голосов
/ 09 мая 2018

Как вы сказали, это решено, но в любом случае. Если вы создаете компонент с начальным состоянием, я бы рекомендовал использовать конфигурацию вместо аннотации @Component, а затем вы можете создать компонент и инициализировать поля в одном месте. Например:

@Configuration
public class RangeFilteringParamsConfiguration {

    @Bean
    public RangeFilteringParams rangeFilteringParams() {
        RangeFilteringParams params = new RangeFilteringParams();
        //set the fields here...
        return params;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...