Untuk waktu yang lama saya percaya bahwa ada nilai dalam memiliki "konfigurasi terpusat, deklaratif," seperti file xml yang kita semua gunakan. Kemudian saya menyadari bahwa sebagian besar hal dalam file bukan konfigurasi - tidak pernah berubah di mana pun setelah pengembangan, tidak pernah. Kemudian saya menyadari bahwa "terpusat" hanya memiliki nilai dalam sistem yang cukup kecil - hanya dalam sistem kecil Anda akan pernah dapat melakukan grok file konfigurasi secara keseluruhan . Dan apa sebenarnya nilai memahami perkabelan secara keseluruhan, ketika "wirings" yang sama sebagian besar diduplikasi oleh dependensi dalam kode? Jadi satu-satunya yang saya simpan adalah meta-data (anotasi), yang masih semacam deklaratif. Ini tidak pernah berubah saat runtime dan mereka tidak pernah "konfigurasi" data yang akan diubah seseorang dengan cepat - jadi saya pikir menyimpannya dalam kode itu bagus.
Saya menggunakan kabel-otomatis penuh sebanyak yang saya bisa. Aku menyukainya. Saya tidak akan kembali ke musim semi gaya lama kecuali mengancam di titik senjata. Alasan saya untuk lebih memilih sepenuhnya @Autowired
telah berubah seiring waktu.
Saat ini saya pikir alasan paling penting untuk menggunakan autowiring adalah karena ada satu abstraksi yang kurang dalam sistem Anda untuk melacak. "Nama kacang" secara efektif hilang. Ternyata nama kacang hanya ada karena xml. Jadi lapisan penuh tipuan abstrak (di mana Anda akan memasukkan nama "foo" menjadi "bar" kacang) hilang. Sekarang saya menghubungkan antarmuka "Foo" ke dalam kacang saya secara langsung, dan implementasi dipilih oleh profil run-time. Ini memungkinkan saya untuk bekerja dengan kode ketika melacak dependensi dan implementasi. Ketika saya melihat ketergantungan autowired dalam kode saya, saya hanya bisa menekan tombol "pergi ke implementasi" di IDE saya dan kemudian muncul daftar implementasi yang dikenal. Dalam kebanyakan kasus hanya ada satu implementasi dan saya langsung ke kelas. Bisa' implementasi apa yang sedang digunakan (saya mengklaim bahwa kebalikannya lebih dekat dengan kebenaran dengan kabel xml - lucu bagaimana perspektif Anda berubah!)
Sekarang Anda dapat mengatakan bahwa itu hanya lapisan yang sangat sederhana, tetapi setiap lapisan abstraksi yang kami tambahkan ke sistem kami menambah kompleksitas. Saya benar-benar tidak berpikir xml pernah menambahkan nilai nyata ke sistem apa pun yang pernah saya gunakan.
Sebagian besar sistem yang pernah saya gunakan hanya memiliki satu konfigurasi lingkungan runtime produksi. Mungkin ada konfigurasi lain untuk pengujian dan sebagainya.
Saya akan mengatakan bahwa autowiring penuh adalah ruby-on-rails of spring: Ini mencakup gagasan bahwa ada pola penggunaan normal dan umum yang mengikuti kebanyakan kasus penggunaan. Dengan konfigurasi XML Anda mengizinkan banyak penggunaan konfigurasi konsisten / tidak konsisten yang mungkin / mungkin tidak dimaksudkan. Saya telah melihat begitu banyak konfigurasi xml berlebihan dengan ketidakkonsistenan - apakah itu bisa di refactored bersama dengan kode? Saya pikir tidak. Apakah variasi itu ada karena suatu alasan? Biasanya tidak.
Kami hampir tidak menggunakan kualifikasi dalam konfigurasi kami, dan menemukan cara lain untuk menyelesaikan situasi ini. Ini adalah "kerugian" jelas yang kami temui: Kami telah sedikit mengubah cara kode kami agar berinteraksi lebih lancar dengan autowiring: Repositori pelanggan tidak lagi mengimplementasikan Repository<Customer>
antarmuka umum tetapi kami membuat antarmuka CustomerRepository
yang diperluas Repository<Customer>
. Terkadang ada juga satu atau dua trik dalam hal subclassing. Tapi itu biasanya hanya mengarahkan kita ke arah pengetikan yang lebih kuat, yang saya temukan hampir selalu merupakan solusi yang lebih baik.
Tapi ya, Anda mengikat gaya DI tertentu yang kebanyakan dilakukan musim semi. Kami bahkan tidak membuat setter publik untuk dependensi lagi (Jadi Anda bisa berargumen bahwa kami +1 di departemen enkapsulasi / informasi) Kami masih memiliki beberapa xml dalam sistem kami, tetapi xml pada dasarnya hanya berisi anomali. Autowiring penuh terintegrasi dengan baik dengan xml.
Satu-satunya hal yang kita butuhkan sekarang adalah untuk @Component
, @Autowired
dan sisanya untuk dimasukkan dalam JSR (seperti JSR-250 ), jadi kita tidak harus mengikat dengan musim semi. Ini adalah cara terjadinya hal-hal di masa lalu ( java.util.concurrent
hal - hal muncul dalam pikiran), jadi saya tidak akan sepenuhnya terkejut jika ini terjadi lagi.