这是我现在可以正常使用的东西。它所做的只是一个市场类,该市场类返回项目对象的数组:
I have class market
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; } }
class Item是简单的类,具有用于名称和值的getter和setter
这是我的配置文件的外观:
@Configuration public class MarketConfig { @Bean public Market market() { return new Market(); } }
我想如何更改代码:(原因:我不想
Item item = new Item();
然后的方法。我希望Spring将其注入市场)
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()时,原型作用域都会给我新的bean。现在,我想为createItems方法的for循环中的每次迭代使用新bean。我怎么能告诉spring给我。
我知道的一种方法是
applicationContext context = new AnnotationConfigApplicationContext(); context.getBean(Item.class);
但是还有其他方法可以完成我的工作。谢谢
可以使用查找方法按需创建原型方法
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中自动装配它:
并调用你的查找方法:
@Service public class MyService{ @Autowired ItemFactory itemFactory; public someMethod(){ Item item = itemFactrory.createItem(); } }
每次调用时,·你都会收到对新创建的Item类实例的引用。
PS:我看到你使用的·是XML,而不是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(); } }; } }