Добавить компонент весны для перезаписи компонентов из того же типа

Вслед за весенним заводским рисунком (после этого замечательного блога) я создал фабричный класс

@Component
public interface FooFactory { Foo getFoo(String fooType);
}
public abstract class Foo { private Integer calc public Integer getCalc(){return calc} public void setCalc(Integer calc){ this.calc = calc) }
}
@Component("bar")
public class Bar extends Foo { @Overrride public void setCalc(Integer calc){ this.calc = calc*10) } @Component("bazz") public class Bazz extends Foo { @Override public void setCalc(Integer calc){this.calc = calc+10) }
}

в моем основном классе

private List<foo> createFoo(){ List<foo> fooList = ArrayList<foo>(3) Foo bar1 = fooFactory.getFoo("bar") bar1.setCalc(10) Foo bar2 = fooFactory.getFoo("bar") bar2.setCalc(20) Foo bazz1 = fooFactory.getFoo("bazz") barzz1.setCalc(30) fooList.add(bar1) fooList.add(bar2) fooList.add(bazz1) for (Foo f:fooList) System.out.println(f.getCalc());
}
</foo></foo></foo>

результат, который я получаю

200
200
40

и не так, как я ожидал

100
200
40

что означает, что первый объект в списке перезаписывается вторым из того же типа.как я могу это решить?

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

context xml:

<bean id="fooFactory"> </bean>
2 ответа

Вы должны аннотировать ваши бобы с помощью @Scope(BeanDefinition.SCOPE_PROTOTYPE)

@Component("bar")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Bar extends Foo {
@Overrride
public void setCalc(Integer calc){this.calc = calc*10)
}
@Component("bazz")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Bazz extends Foo {
@Override
public void setCalc(Integer calc){this.calc = calc+10)

}

См. Http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/ServiceLocatorFactoryBean.html.

ServiceLocatorFactoryBean... Обычно они будут использоваться для прототипов beans, то есть для заводских методов, которые должны возвращать новый экземпляр для каждого вызова.


Правильный ответ

еще несколько объяснений:

ServiceLocatorFactoryBean - это просто прокси-сервер обычной фабрики. Поэтому область прототипа/синглтона обрабатывается так же, как и для нормальной инъекции.

Поэтому, когда вы ожидаете, что будут использовать бозонные объекты прототипа (это то, что вы ожидаете (два компонента одного и того же типа с разными значениями)), вам нужно настроить, что компоненты этой области. Поэтому вам нужно добавить @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) к вашим двум компонентам.

licensed under cc by-sa 3.0 with attribution.