2011-04-20 17 views
5

Sprint konusunda oldukça yeni ve uygulamam için Spring 3.x ve roo1.1.1 kullanıyorum.Bir fabrika modeli gibi uygulamayı dinamik olarak enjekte etmek için @Outowired nasıl kullanılır

Diğer farklı sınıflara otomatik olarak bağlanacak bir arabirimin çoklu uygulamasına sahibim. Sadece çalışma zamanında hangi uygulamanın gerçekleştirileceğine karar verebilirdim. Bu bir fabrika modeli ile elde edilmelidir.

public interface SomeInterface { 
    public void doSomething(); 
} 

Uygulama 1.

public class SomeOb implements SomeInterface { 
    public void doSomething() { 
     //Do something for first implementation here 
    } 
} 

Uygulama

public class SomeOtherOb implements SomeInterface { 
    public void doSomething() { 
     //Do something for first implementation here 
    } 
} 

2. Şimdi Hizmetimde i

@Service 
public class MyService { 

    @Autowired 
    SomeInterface ob; 
    //Rest of the code here 

} 

1) seçmek için mantık gibi bu Autowired gerekli olan Autow olmak için uygulama ired sadece çalışma zamanını bildiğinden, bunu kabul etmek için @Qualifier notunu kullanamıyorum. 2) Ben etiket sözü var applicationContext.xml olarak

public class SomeFactoryBean implements FactoryBean<SomeInterface> { 
@Override 
public SomeInterface getObject() throws Exception { 
    if(/*Somecondition*/) { 
     return new SomeOb(); 
    } else 
     return new SomeOtherOb(); 
} 

@Override 
public Class<? extends SomeInterface> getObjectType() { 
    if(/*Somecondition*/) { 
     return SomeOb.class; 
    } else 
     return SomeOtherOb.class; 
} 

@Override 
public boolean isSingleton() { 
    return false; 
} 
} 

gibi bir FactoryBean yaratmaya çalışmışlardır. i web sunucusu çalıştırdığınızda

i herkes bu sorunu çözmek için bana yardım edebilir

No unique bean of type [com.xxxx.xxxx.SomeInterface] is defined: expected single matching bean but found 3: [xxxx, xxxxxxx, xxxxFactory] 

gibi bir hata çalıştırın. Eğer bu hakkı yapmazsam, lütfen bunu doğru şekilde yapmak için yönlendirin. Eğer sadece uygulama

belirli bir örneği için fasulye biri uygulanmasını ihtiyaç Ama eğer

Teşekkür ve takdir herhangi bir yardım, JJK isSingleton() dan gerçek

cevap

0

dönüş senin tasarımını soru.

Bu gibi uygulamaları değiştirmek için her zaman özellik dosyalarını kullanırdım. Bir zamanlar bir site için CAPTCHA entegrasyonunu uygulamak zorunda kaldım. JCaptcah ve ReCAPTCHA API'leri ile prototip yapıyorduk. İhtiyaç duyduğumuz işlevselliği içeren yeni bir arayüz oluşturdum ve ardından her iki API için de uygulamalar oluşturdum. Spring yapılandırma dosyasında ve Maven profillerinde yer tutucuları kullanarak, uygulama sınıfını derleme zamanı veya dağıtım zamanında değiştirebiliriz, örneğin, mvn iskelesi: run -DcaptchaImpl = recaptcha veya -DcaptchaImpl = jcaptcha.

Yapmak istediğiniz görevi bilmeden, daha fazla öneri sağlamak zordur.

3

Öneriniz için teşekkürler. Bir meslektaşın yardımıyla sorunu çözebildim. Ne yapıyorum yanlış

  1. @Service ile SomeInterface uygulamasını uyguladım. Böylece bu bahar tarayıcı tarafından alındı ​​ve fasulye ekledi.
  2. Deneme ve hata sırasında @Component ek açıklamasını FactoryBean uygulamasından kaldırdım. Bu değişiklikleri yaptıktan sonra, bir çekicilik gibi çalışmıştır.
İlgili konular