2013-02-14 29 views
5

ここに私は今すぐ正しく動作します。それがないすべての項目の配列を返し市場のクラスは、オブジェクトされています。私はクラスの市場を持っているSpring Javaのコンフィグレーションを使用してシングルトンBeanでプロトタイプオブジェクトを生成する方法

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

クラス項目は、名前と値

のためにゲッターとセッターとの単純なクラスです。ここ方法です私の設定ファイルを検索します:私は自分のコードを変更したい方法

@Configuration 
public class MarketConfig { 

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

:(理由:私は

をたくありません
Item item = new Item(); 

その時の方法。

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が必要になりました。どのように私は春に私に与えることができます。私が知っている

一つの方法は、

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

を行いますされているが、私の仕事を成し遂げるための他の方法があります。 おかげ

答えて

19

はい、あなたはルックアップ法

applicationContext.xmlをで今
public abstract class ItemFactory { 

    public abstract Item createItem(); 

} 

ただ、次のを入れて使用してオンデマンドでプロトタイプのメソッドを作成することができます。

<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あなたはItemクラスの新しく作成されたインスタンスへの参照を受け取りますcreateItem()呼び出すたびに

@Service 
public class MyService{ 

    @Autowired 
    ItemFactory itemFactory; 

    public someMethod(){ 
     Item item = itemFactrory.createItem(); 
    } 

} 

とルックアップ法のyoutを呼び出す:任意の豆内側に怒り。

P.S: xmlの代わりに@Configurationを使用していることがわかります。コンフィギュレーション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 8

@Configuration 
public class Config { 

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

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

使用している場合、それは簡単にすることができ、その後、あなたがするあなたの市場のクラスで、この業者を使用することができます

+0

@configurationを使って解を与えることができるかどうかがわかります。そうでなければ私はそれを受け入れるだろう。私はオンラインでJavaベースのスプリング設定 – javaMan

+1

@raviで検索メソッドを使用する方法をチェックします、私の更新を見てくださいトリックは簡単です:) –

+0

ちょうど今、私はこのリンクを発見しました。私はここで同様の解決策を見つけました。 http://static.springsource.org/spring/docs/3.0.0.RC3/reference/html/ch03s11.html。 – javaMan

4

プロトタイプ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やインターフェイスは不要です。

関連する問題