2009-07-20 16 views
6

'da yöntem enjeksiyonu yerine getBean kullanımı Birden çok ekrana sahip bir uygulama var ve her ekran bir düğme ile seçiliyor. Her ekran oldukça ağır bileşenlere sahiptir, bu nedenle sadece aktif ekranın bellekte kalması önemlidir - tüm diğerleri çöp toplama için kullanılabilir olmalıdır.İlkbaharda

uygulama yapıştırıcı Spring kullanır ve şu anda() getBean kullanılarak ekranlar geçer:

//event handler for a specific button 
public void actionPerformed(Event e) { 
    setScreen((Screen) applicationContext.getBean("screen1")); 
} 

"Ekran1" tuşuna basıldığında oluşturulur, böylece bir prototip fasulye, yeni bir ekran örneğidir. Ayrıca, setScreen(), uygulamada Ekrana referansın tutulduğu tek yerdir, böylece daha önce aktif olan ekran çöp toplama için kullanılabilir olacaktır. Bunu henüz test etmedim ama iyi çalışacağını umuyorum - burada roket bilimi yok!

Sorun şu ki: getBean() 'ın neden hatalı kabul edildiği konusunda this page okunduktan sonra - getBean() üzerindeki bağımlılığı kaldırırken aynı sonuçları elde etmek için daha idiomatik bir yol olup olmadığını merak ediyorum.

Metot enjeksiyonuna baktım ve az fayda ile karmaşıklığı tanıtmamı bekliyor. Başka bir kavram öğrenmek, daha fazla sihir, CGLIB'a bağımlılık eklemek, vb. İlkbaharda bağımlılığı gerçekten kaldırmak istiyorsam, getBean() yöntemini ortaya çıkaran bir arabirimi sunabilirim.

GetBean() yöntemini ve yöntem enjeksiyonu benim durumumda mı yoksa bir şey mi kaçırdım?

Ve eğer öyleyse, getBean() gerçekten çok mu kötü?

cevap

0

Fabrika yaklaşımını düşündünüz mü?

<bean id="screenFactory" class="com.myclass.ScreenFactory"/> 

<bean id="myapp" class="..."> 
    <property name="screen1" ref="screenFactory"/> 
</bean> 

yapabilirsiniz kurs otomatik tel yukarıda:

public interface ComponentFactory<T> { 
    T create(); 
} 

public class ScreenFactory implements ComponentFactory<Screen> { 
    @Override 
    Screen create() { ... } 
} 

public class MyApp { 
    private ComponentFactory<Screen> screen1; 

    public void actionPerformed(Event e) { 
    setScreen(screen1.create()); 
    } 

    public void setScreen1(ComponentFactory<Screen> screen1) { 
    this.screen1 = screen1; 
    } 

    private void setScreen(Screen screen) { ... } 
} 

ile birleştirdi.

Yaptığınız şeyle ilgili sorun, uygulamanızın çekirdeğini kodlamanızı ve uygulamanızı ApplicationContext'e bağlamanızdır. Uygulamalarınızı/bileşenlerinizi alay etmek ve/veya üniteyi test etmeniz gerekiyorsa, bu sizin hayatınızı inanılmaz derecede zorlaştıracaktır. Yukarıdaki fabrika çözümü bunu önemsiz kılacaktır.

+0

Çözümünüzde, getbean() fabrika create() yönteminde çağrılır, değil mi? –

+0

Tam olarak değil. Bu, bir fabrika yöntemiyle değiştirilir, ancak yukarıdaki arabirimi bir uygulama bağlamıyla karşılaştırmaktan çok daha kolaydır. Ayrıca takılabilir. Sonuçta, Spring'in yöntem enjeksiyonu http://static.springsource.org/spring/docs/2.5'in biraz daha basit bir uygulamasıdır.x/reference/beans.html # fasulye-fabrika-arama-yöntem-enjeksiyon – cletus

+0

Görüyorum, ancak factory() yöntemi onun Screen örneğini nereden alıyor? –

3

Setter enjeksiyonu, özellik enjeksiyonu ya da yapıcı enjeksiyonu, alay yoluyla test edilmesi çok daha kolay olan gevşek birleştirilmiş bir uygulama oluşturur. Ayrıca, sınıflarınızın herhangi birinin Bahar (veya diğer IoC konteynırı) sınıflarında doğrudan bağımlılıklara sahip olmasını önler. GetBean() işlevini manuel olarak çağırmanız gerekmediğinde, yalnızca daha temiz bir genel çözüm olmaktan çıkıyor.

Yapılandırma bağımlılıkları kavramıyla rahat olmanız gerektiğini düşünüyorum. "Büyü" aslında hiç de sihir değildir ve kullandığınız gibi rahat edeceğiniz bir şeydir.

+0

IMO'nun "standart" Bağımlılık Enjeksiyonundan farklı olduğu arama yöntemi etiketini kullanarak yöntem enjeksiyonuna atıfta bulunuyoruz - bu ayrı bir özelliktir ve AOP'ye (ve dolayısıyla CGLIB'ye) dayanan bir özelliktir ve size bir fabrika üzerinden ne verir? cletus göstermiş mi?) –

+0

Fabrika, Bağımlılığınızı ilkbaharda yalıtıracak, ancak benim düşünmem gereken şey gereksiz hale geldi. AOP ile ilgili sorun nedir? AOP, Spring'in DI nasıl yapıldığının sadece bir uygulamasıdır. – geofflane

0

Sadece getBean'dan kurtulmak istiyorsanız, bir ServiceLocatorFactoryBean kullanmayı düşünün. Ancak bu sizin için ne kadar iyi çalışıyor, uygulamanızda "screen1" dizesinin nereden geldiğine bağlı olabilir.

İlgili konular