Saya membaca di beberapa posting tentang Spring MVC dan Portlet bahwa injeksi lapangan tidak disarankan. Seperti yang saya pahami, injeksi lapangan adalah saat Anda menyuntikkan Bean dengan @Autowired
seperti ini:
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
Selama penelitian saya, saya juga membaca tentang injeksi konstruktor :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
Apa keuntungan dan kerugian dari kedua jenis suntikan ini?
EDIT 1: Karena pertanyaan ini ditandai sebagai duplikat dari pertanyaan ini, saya memeriksanya. Karena tidak ada contoh kode apa pun baik dalam pertanyaan maupun jawaban, tidak jelas bagi saya apakah saya benar dengan tebakan saya jenis injeksi yang saya gunakan.
Date(int,int,int)
ada.Jawaban:
Jenis injeksi
Ada tiga pilihan bagaimana dependensi dapat disuntikkan ke dalam bean:
Anda menggunakan opsi 3. Itulah yang terjadi saat Anda menggunakan
@Autowired
langsung di bidang Anda.Pedoman injeksi
Panduan umum, yang direkomendasikan oleh Spring (lihat bagian DI berbasis Konstruktor atau DI berbasis Setter ) adalah sebagai berikut:
Kelemahan injeksi lapangan
Alasan mengapa injeksi lapangan tidak disukai adalah sebagai berikut:
Kesimpulan
Bergantung pada kebutuhan Anda, Anda harus menggunakan injeksi konstruktor atau campuran injeksi konstruktor dan penyetel. Injeksi lapangan memiliki banyak kekurangan dan harus dihindari. Satu-satunya keuntungan dari injeksi lapangan adalah lebih nyaman untuk menulis, yang tidak melebihi semua kekurangannya.
Bacaan lebih lanjut
Saya menulis artikel blog tentang mengapa injeksi lapangan biasanya tidak disarankan: Injeksi Ketergantungan Lapangan Dianggap Berbahaya .
sumber
Ini adalah salah satu diskusi yang tidak pernah berakhir dalam pengembangan perangkat lunak, tetapi pemberi pengaruh utama dalam industri ini semakin banyak berpendapat tentang topik tersebut dan mulai menyarankan injeksi konstruktor sebagai opsi yang lebih baik.
Injeksi konstruktor
Kelebihan:
Kekurangan:
Pada dasarnya, injeksi lapangan adalah kebalikannya.
sumber
Masalah rasa. Itu keputusanmu.
Tapi saya bisa menjelaskan, mengapa saya tidak pernah menggunakan injeksi konstruktor .
Saya tidak ingin menerapkan konstruktor untuk semua my
@Service
,@Repository
and@Controller
beans. Maksud saya, ada sekitar 40-50 biji kopi atau lebih. Setiap kali jika saya menambahkan bidang baru, saya harus memperluas konstruktor. Tidak, aku tidak menginginkannya dan aku tidak perlu.Bagaimana jika Bean Anda (Layanan atau Pengontrol) membutuhkan banyak biji lain untuk disuntikkan? Sebuah konstruktor dengan 4+ parameter sangat jelek.
Jika saya menggunakan CDI, konstruktor bukan urusan saya.
EDIT # 1 : Vojtech Ruzicka mengatakan:
Iya. Teori dan realitas. Berikut adalah contoh en:
DashboardController
dipetakan ke jalur tunggal*:8080/dashboard
.Saya
DashboardController
mengumpulkan banyak informasi dari layanan lain untuk ditampilkan di halaman ikhtisar dasbor / sistem. Saya butuh pengontrol tunggal ini. Jadi saya harus mengamankan hanya satu jalur ini (auth dasar atau filter peran pengguna).EDIT # 2 : Karena semua orang fokus pada 8 parameter dalam konstruktor ... Ini adalah contoh dunia nyata - kode warisan pelanggan. Saya telah mengubah itu. Argumentasi yang sama berlaku untuk saya untuk 4+ parameter.
Ini semua tentang injeksi kode, bukan konstruksi instance.
sumber
Satu komentar lagi - Vojtech Ruzicka menyatakan bahwa Spring menyuntikkan kacang dalam tiga cara (jawaban dengan jumlah poin terbesar):
Jawaban ini SALAH - karena UNTUK SETIAP JENIS INJEKSI SPRING MENGGUNAKAN REFLEKSI! Gunakan IDE, setel breakpoint pada penyetel / konstruktor, dan periksa.
Ini bisa jadi soal selera tapi bisa juga soal KASUS. @dieter memberikan kasus yang sangat baik saat injeksi lapangan lebih baik. Jika Anda menggunakan injeksi bidang dalam pengujian integrasi yang menyiapkan konteks Spring - argumen dengan kemampuan untuk diuji kelas juga tidak valid - kecuali Anda ingin menulis nanti pada pengujian untuk pengujian integrasi Anda;)
sumber