2010-03-04 8 views
5

मैं आमतौर पर बस वसंत वस्तुओं में @Autowire चीजें। लेकिन मुझे ऐसी स्थिति का सामना करना पड़ा है जहां मुझे गतिशील रूप से कुछ ऑब्जेक्ट्स बनाने की आवश्यकता है जिसके लिए मूल्यों की आवश्यकता होती है जिन्हें स्वचालित किया जा सकता है।वसंत में, क्या मैं एक ऑटोवायर बीन के अंदर से नए सेमों को स्वचालित कर सकता हूं?

मुझे क्या करना चाहिए? मैं क्या कर सकता था बस ऑटोवॉयर वैल्यू को मैन्युअल रूप से नई ऑब्जेक्ट्स के कन्स्ट्रक्टर में पास कर देता है। मैं जो करना चाहता हूं वह सिर्फ नए ऑब्जेक्ट को ऑटोवायर करता है जैसा कि मैंने इसे बनाया है।

@Service 
public class Foo { 
    @Autowired private Bar bar; 

    /** This creates Blah objects and passes in the autowired value. */ 
    public void manuallyPassValues() { 
     List<Blah> blahs = new LinkedList<Blah>(); 
     for(int i=0; i<5; ++i) { 
      Blah blah = new Blah(bar); 
      blahs.add(blah); 
     } 
     // ... 
    } 

    /** This creates Blah objects and autowires them. */ 
    public void useAutowire() { 
     List<Blah> blahs = new LinkedList<Blah>(); 
     for(int i=0; i<5; ++i) { 
      // How do I implement the createAutowiredObject method? 
      Blah blah = createAutowiredObject(Blah.class); 
      blahs.add(blah); 
     } 
     // ... 
    } 
} 

आदर्श रूप से मेरे पास इस बीन में कोई कॉन्फ़िगरेशन जानकारी नहीं होगी। यह autowired है, इसलिए किसी भी वस्तुओं यह उन में autowiring द्वारा नए सेम के autowiring करने के लिए यह करने के लिए उपलब्ध होना चाहिए की जरूरत है

उत्तर

10

आप AutowireCapableBeanFactory उपयोग कर सकते हैं:।

@Service 
public class Foo { 
    @Autowired private AutowireCapableBeanFactory factory; 

    private <T> T createAutowiredObject(Class<T> c) { 
     return factory.createBean(c); 
    } 
    ... 
} 
संबंधित मुद्दे