一尘不染

如何使用Spring Java配置在Singleton bean中生成原型对象

spring

这是我现在可以正常使用的东西。它所做的只是一个市场类,该市场类返回项目对象的数组:

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);

但是还有其他方法可以完成我的工作。谢谢


阅读 270

收藏
2020-04-20

共1个答案

一尘不染

可以使用查找方法按需创建原型方法

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();
            }
        };
    }
}
2020-04-20