2013-02-14 32 views
5

这里是我现在所拥有的工作正常在一个singleton bean生成原型对象用。它所做的是一个市场类返回项目对象的数组:HOWTO使用的Spring Java配置

我有类市场

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

类项目的简单类的getter和setter的名称和值

这里是如何我的配置文件如下:

@Configuration 
public class MarketConfig { 

    @Bean 
    public Market market() { 
     return new Market(); 
    } 
} 

我如何想改变我的代码:(原因:我不想

Item item = new Item(); 

在随后方法。我希望春将它注入市场)我知道原型范围将给我新的bean每次我打电话item(); 现在我想为createItems方法的for循环中的每个迭代创建新的bean。我怎么告诉春天给我。我知道

一种方式是做

applicationContext context = new AnnotationConfigApplicationContext(); 
context.getBean(Item.class); 

但是有没有让我的工作做任何其他方式。 感谢

回答

19

是的,你可以使用查找方法

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> 

现在,所有你需要为了用它做的是Autow IRE任何bean中:

,并呼吁YOUT查找方法:

@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(); 
      } 
     }; 
    } 
} 
+0

我会看看是否有人可以使用@configuration来给出解决方案。否则我会接受它。我将在网上查询如何使用基于java的弹簧配置查找方法 – javaMan 2013-02-14 19:04:16

+1

@ravi,请看我的更新诀窍是简单的:) – 2013-02-14 19:58:10

+0

谢谢刚才我发现这个链接。我在这里找到了类似的解http://static.springsource.org/spring/docs/3.0.0.RC3/reference/html/ch03s11.html。 – javaMan 2013-02-14 20:46:53

4

它可以,如果你使用的是Java 8

@Configuration 
public class Config { 

    @Bean 
    @Scope(value = "prototype") 
    public Item item() { 
     return new Item(); 
    } 

    @Bean 
    public Supplier<Item> itemSupplier() { 
     return this::item; 
    } 
} 

,并简化后,你可以在你的市场类使用该供应商创建原型项目bean。

@Component 
public class Market { 

    private final Supplier<Item> itemSupplier; 

    @Autowired 
    public Market(Supplier<Item> itemSupplier) { 
     this.itemSupplier = itemSupplier; 
    } 

    private Item createItem() { 
     return itemSupplier.get(); 
    } 

} 

非常简单,并且不需要额外的工厂bean或接口。

相关问题