Neden ilkbaharda statik alanları otomatik olarak bağlayamıyoruz?


96

Bahar fasulyesindeki statik örnek değişkenini neden otomatik olarak bağlayamıyoruz? Bunu başarmanın başka bir yolu olduğunu biliyorum ama neden bunu aşağıdaki şekilde yapamadığımızı bilmek istiyorum.

Örneğin

@Autowired
public static Test test;

Bahsettiğiniz alternatif yoldan biraz ışık tutabilir misiniz?
samshers

Yapıcı aracılığıyla
otomatik kablolama

Yanıtlar:


69

Çünkü statik alanların kullanılması statik yöntemlerin kullanılmasını teşvik eder. Ve statik yöntemler kötüdür. Bağımlılık enjeksiyonunun temel amacı, kabın sizin için nesneler oluşturmasına ve bunları bağlamasına izin vermektir. Ayrıca testi kolaylaştırır.

Statik yöntemleri kullanmaya başladığınızda, artık bir nesne örneği oluşturmanıza gerek kalmaz ve test etmek çok daha zordur. Ayrıca, her biri enjekte edilen farklı bir bağımlılığa sahip belirli bir sınıfın birkaç örneğini oluşturamazsınız (çünkü alan dolaylı olarak paylaşılır ve küresel durum yaratır - ayrıca kötüdür).


11
Bu konuda karşılaştığım tek uyarı, test sırasında. @BeforeClassBir SpringJUnit4ClassRunner'da kullanmak istiyorsanız ve bu yönteme testte Bean'e erişmek @Autowiredistiyorsanız, temelde yapamazsınız. Hangi can sıkıcı.
Jason Polites

4
Bu cevap, neden olmaması gerektiğini açıklıyor. Ancak asıl sebep, çerçeve statik sınıfı bir çekirdeğe bağlamayı denediğinde, sınıf yükleyici tarafından henüz yüklenmemiş olabileceğidir.
Andrea T

51
Bu cevap tamamen anlamsız. Bahar, test stratejinizi dayatmaz. Cevap, statik Sınıf, sınıf yükleyici tarafından başlatıldığında henüz Spring kitaplığının yüklenmemiş olmasıdır.
Andrea T

7
@AndreaT tarafından verilen cevap, kabul edilen cevap olmalıdır.
Chirag Agrawal

3
Statik yöntemler daha zor değil, daha kolay test edilir. Otomatik olarak bağımlılık enjekte etmek için yay olması güzel görünüyor ama aslında test etmek için daha zor yoldur. Taklitler, taslaklar ve test çiftleri statik yöntemler değil, kod kokularıdır.
mttdbrd

150

Çünkü sınıf yükleyici statik değerleri yüklediğinde, Yay bağlamı henüz zorunlu olarak yüklenmez. Dolayısıyla, sınıf yükleyici, çekirdekteki statik alanları düzgün şekilde enjekte etmez ve başarısız olur.


48
Java dilinin yarısının kötü bir fikir olduğu fikrini dile getirmek yerine soruyu gerçekten yanıtlıyor gibi görünen bir yanıt için teşekkürler.
Warren Dew

1
"statik sınıf"?
Arun Raaj

Mockito, Spring'in otomatik kablolamada yaptığı gibi statik alanlara nesneleri enjekte edebildiğinden, bu doğru görünmüyor ... gerçi uygulamanın aynı olup olmadığını bilmiyorum. Daha fazla bilgiye ihtiyacınız var.
gagarwa

Mockito statik yöntemlerle alay edemez. Statik yöntemlerle dalga geçmek için Powermock kullanmanız gerekir
Jaison Varghese

17

OOP konseptine göre, statik değişkenler otomatik olarak bağlanırsa tasarım kötü olacaktır.

Statik değişken, Object'in bir özelliği değildir, ancak bir Sınıfın bir özelliğidir. Yaylı otomatik kablolama nesneler üzerinde yapılır ve bu bence tasarımı temiz kılar. Otomatik kablolu fasulye nesnesini tekil olarak dağıtabilir ve statik olarak tanımlamakla aynı şeyi elde edebilirsiniz.


15

Bu çözümle ilkbaharda statik alanları otomatik olarak bağlayabilirsiniz.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinder, statik olmayan yöntemden statik alan oluşturmaktan şikayet edecektir.
Neftanic

@Neftanic statik olmayan üyelerden statik üyelere başvuruyor, tersi çalışmıyor
younes zeboudj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.