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;
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;
Yanıtlar:
Çü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).
@BeforeClass
Bir SpringJUnit4ClassRunner'da kullanmak istiyorsanız ve bu yönteme testte Bean'e erişmek @Autowired
istiyorsanız, temelde yapamazsınız. Hangi can sıkıcı.
Çü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.
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.
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;
}
}