这是我现在拥有的,效果很好。它所做的只是一个市场类,它返回一个项目对象数组:
我有类(class)市场
class market {
public ArrayList<Items> createItems(HashMap<String,String> map) {
ArrayList<Items> array = new ArrayList<Items>();
for (Map.Entry<String, String> m : map.entrySet()) {
Item item = new Item();
item.setName(m.key());
item.setValue(m.value());
array.add(item);
}
return array;
}
}
类 Item 是一个简单的类,带有用于名称和值的 getter 和 setter
这是我的配置文件的样子:
@Configuration
public class MarketConfig {
@Bean
public Market market() {
return new Market();
}
}
我想如何更改我的代码:( 原因:我不想
Item item = new Item();
在 then 方法中。我想让 Spring 把它注入(inject) Market)
class market {
public Item item;
//getters and setters for item
public ArrayList<Items> createItems(HashMap<String,String> map) {
ArrayList<Items> array = new ArrayList<Items>();
for (Map.Entry<String, String> m : map.entrySet()) {
item.setName(m.key());
item.setValue(m.value());
array.add(item);
}
return array;
}
}
@Configuration
public class MarketConfig {
@Bean
@Scope("prototype")
public Item item() {
return new Item();
}
@Bean
public Market market() {
Market bean = new Market();
bean.setItem(item());
}
}
我知道每次调用 item() 时原型(prototype)范围都会给我新的 bean; 现在我想在 createItems 方法的 for 循环中为每次迭代创建新的 bean。我如何告诉 Spring 给我。
我知道的一种方法是做
applicationContext context = new AnnotationConfigApplicationContext();
context.getBean(Item.class);
但是还有其他方法可以完成我的工作吗? 谢谢
最佳答案
是的,您可以使用查找方法按需创建原型(prototype)方法
public abstract class ItemFactory {
public abstract Item createItem();
}
现在在 applicationContext.xml 中放入以下内容:
<bean id="item" class="x.y.z.Item" scope="prototype" lazy-init="true"/>
并配置工厂:
<bean id="itemFactory" class="x.y.z.ItemFactory">
<lookup-method name="createItem" bean="item"/>
</bean>
现在,为了使用它,您需要做的就是在任何 bean 中 Autowiring 它:
并调用你的查找方法:
@Service
public class MyService{
@Autowired
ItemFactory itemFactory;
public someMethod(){
Item item = itemFactrory.createItem();
}
}
每次调用 createItem()
时,您都会收到对新创建的 Item 类实例的引用。
P.S: 我看到您使用的是 @Configuration
而不是 xml,您需要检查是否可以在配置 bean 中配置查找方法。
希望对您有所帮助。
更新:诀窍很简单:
@Configuration
public class BeanConfig {
@Bean
@Scope(value="prototype")
public Item item(){
return new Item();
}
@Bean
public ItemManager itemManager(){
return new ItemManager() {
@Override
public Item createItem() {
return item();
}
};
}
}
关于java - 如何使用 spring java 配置在单例 bean 中生成原型(prototype)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880847/