Mainkan injeksi ketergantungan java kerangka kerja - kapan harus menggunakan lajang

Saya mencoba mencari cara menggunakan injeksi ketergantungan di Play Framework 2.4. Saya memahami prinsip-prinsip umum, tetapi tidak begitu memahami implikasinya terhadap desain. Alasan umum saya adalah, metode statis di kelas pengontrol terlalu mirip dengan penggunaan variabel global, dan itu dapat dengan mudah menyebabkan masalah dengan keamanan thread, dll., dan secara umum mendorong desain yang buruk. Jadi karena Play sekarang mendorong peralihan ke injeksi ketergantungan, saya harus beralih juga.

Yang membuat saya bingung adalah praktik apa yang baik dalam konteks ini. Saat saya membaca dokumen resmi Play, dokumen tersebut membahas secara singkat tentang injeksi ketergantungan dan kemudian segera menyebutkan anotasi @Singleton. Dan contoh yang tersedia (http://www.typesafe.com/activator/template/play-guice) juga membahas tentang kelas "WelcomeTextGenerator" tunggal.

Jadi saya bertanya-tanya, haruskah saya menggunakan objek tunggal seperti yang tersirat dalam contoh? Jika demikian, apa kelebihannya dibandingkan pendekatan metode statis yang lama? Apakah ada tipe objek tertentu (misalnya, pengontrol?) yang harus berupa objek tunggal, dan apakah ada implikasi kinerja jika tidak menandai objek sebagai objek tunggal?


person myrosia    schedule 21.07.2015    source sumber


Jawaban (1)


Jadi saya bertanya-tanya, haruskah saya menggunakan objek tunggal seperti yang tersirat dalam contoh? Jika demikian, apa kelebihannya dibandingkan pendekatan metode statis yang lama?

Injeksi ketergantungan adalah teknik untuk menyatukan suatu aplikasi. Anda menulis komponen yang tidak bergantung secara langsung satu sama lain. Sebaliknya Anda menyuntikkan komponen satu sama lain. Dengan cara ini Anda dapat dengan mudah menukar seluruh bagian aplikasi Anda tanpa menyentuh satu baris kode pun. Dependency Injection sangat berguna ketika menulis unit test.

Dibandingkan dengan metode statis, Anda dapat menggunakan semua hal OOP yang mewah. Pertanyaannya pada dasarnya adalah "apa kelemahan metode statis?"

Apakah ada tipe objek tertentu (misalnya, pengontrol?) yang harus berupa objek tunggal, dan apakah ada implikasi kinerja jika tidak menandai objek sebagai objek tunggal?

Play atau lebih khusus lagi Panduan akan membuat objek baru setiap kali ketergantungan dimasukkan secara default. Menandainya sebagai @Singleton hanya akan membuat satu objek, dan menggunakan kembali objek yang sama persis pada semua suntikan. Dengan kata lain: Lajang menyimpan beberapa pembuatan objek dan pengumpulan sampah, tetapi memerlukan sinkronisasi untuk menginisialisasi objek.

Untuk menjawab pertanyaan Anda kapan harus menggunakan @Singleton, sebagai aturan praktis (sumber):

  • objek stateful, seperti konfigurasi atau penghitung
  • objek yang mahal untuk dibuat atau dicari
  • objek yang mengikat sumber daya, seperti kumpulan koneksi database.

Omong-omong, Guice menawarkan dokumentasi yang sangat komprehensif. Saya sangat menyarankan untuk menelusuri beberapa saat.

person Roman    schedule 22.07.2015
comment
Terima kasih - itulah yang saya butuhkan. Saya menemukan halaman Cakupan yang Anda tautkan sangat berguna. Dari dokumentasi Play, tidak jelas bagi saya mengapa singleton disorot, atau ada opsi lain - ini lebih masuk akal. - person myrosia; 22.07.2015
comment
Setelah sedikit penelitian lebih lanjut, peringatan potensial: halaman Panduan Lingkup berbicara tentang Cakupan Permintaan dan Lingkup Sesi, tapi sejauh yang saya tahu, Play tidak mendukungnya, karena tidak menggunakan implementasi wadah servlet Google dan tidak menyediakan implementasinya sendiri. saat ini. Jadi dalam hal ini halaman dokumen bisa menyesatkan, karena tidak menjelaskan ketergantungan implementasi. - person myrosia; 31.07.2015