Mengapa kita tidak bisa memasang otomatis bidang statis di musim semi?

96

Mengapa kita tidak dapat melakukan autowire variabel instance statis di kacang Spring. Saya tahu ada cara lain untuk mencapai ini tetapi hanya ingin tahu mengapa kita tidak bisa melakukannya dengan cara di bawah ini.

misalnya

@Autowired
public static Test test;
Ashu
sumber
dapatkah Anda menjelaskan beberapa cara alternatif yang Anda maksud.
samshers
Anda dapat melakukan autowire melalui konstruktor atau menggunakan @PostConstuct
gagarwa

Jawaban:

69

Karena menggunakan bidang statis mendorong penggunaan metode statis. Dan metode statis itu jahat. Tujuan utama injeksi ketergantungan adalah membiarkan container membuat objek untuk Anda dan menyambungkannya. Juga membuat pengujian lebih mudah.

Setelah Anda mulai menggunakan metode statis, Anda tidak perlu lagi membuat instance objek dan pengujian jauh lebih sulit. Anda juga tidak dapat membuat beberapa instance dari kelas tertentu, masing-masing dengan ketergantungan yang berbeda sedang dimasukkan (karena bidang tersebut secara implisit dibagikan dan menciptakan keadaan global - juga jahat).

Tomasz Nurkiewicz
sumber
11
Satu-satunya peringatan untuk hal ini yang saya temui adalah selama pengujian. Jika Anda ingin menggunakan @BeforeClassSpringJUnit4ClassRunner, dan memiliki metode akses kacang @Autowireddalam pengujian .. Anda pada dasarnya tidak bisa. Itu menyebalkan.
Jason Polites
4
Jawaban ini menjelaskan mengapa tidak seharusnya. Tetapi motif sebenarnya adalah bahwa ketika kerangka mencoba untuk menyambungkan kelas statis ke dalam kacang, mungkin belum dimuat oleh pemuat kelas.
Andrea T
51
Jawaban ini sama sekali tidak masuk akal. Musim semi tidak memaksakan strategi pengujian Anda. Jawabannya adalah bahwa belum ada library Spring yang dimuat saat Class statis dibuat oleh class loader.
Andrea T
7
Jawaban oleh @AndreaT harus menjadi jawaban yang diterima.
Chirag Agrawal
3
Metode statis LEBIH MUDAH diuji, bukan lebih sulit. Memiliki pegas yang secara otomatis menyuntikkan ketergantungan tampaknya bagus tetapi itu sebenarnya rute yang lebih sulit untuk pengujian. Mock, stubs, dan test doubles adalah code bau, bukan metode statis.
mttdbrd
150

Karena saat class loader memuat nilai statis, konteks Spring belum tentu dimuat. Jadi pemuat kelas tidak akan menyuntikkan bidang statis dengan benar dalam kacang dan akan gagal.

Andrea T
sumber
47
Terima kasih atas jawaban yang tampaknya benar-benar menjawab pertanyaan daripada hanya menyuarakan pendapat bahwa setengah dari bahasa Jawa adalah ide yang buruk.
Warren Dew
1
"kelas statis"?
Arun Raaj
Ini sepertinya tidak benar, karena Mockito dapat memasukkan objek ke dalam bidang statis, mirip dengan cara pegas melakukan pemasangan otomatis ... meskipun saya tidak tahu apakah implementasinya sama. Butuh info lebih lanjut.
gagarwa
Mockito tidak dapat mengejek metode statis. Anda perlu menggunakan Powermock untuk meniru metode statis
Jaison Varghese
17

Menurut konsep OOP, akan menjadi desain yang buruk jika variabel statis di-autowired.

Variabel statis bukanlah properti Objek, tetapi merupakan properti Kelas. Pengkabelan otomatis pegas dilakukan pada objek, dan itu membuat desainnya bersih menurut saya. Anda dapat menerapkan objek kacang kabel otomatis sebagai tunggal, dan mencapai hal yang sama dengan mendefinisikannya sebagai statis.

Subin Sebastian
sumber
15

Dengan solusi ini, Anda dapat mengaktifkan medan statis secara otomatis di musim semi.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}
Parth Solanki
sumber
4
Bugfinder akan mengeluh tentang pengaturan bidang statis dari metode non-statis.
Neftanic
@Neftanic mereferensikan anggota statis dari non-statis berfungsi, sebaliknya tidak
younes zeboudj