Spring - Kebingungan konfigurasi

9

Di suatu tempat saya membaca Spring menawarkan kemudahan konfigurasi. Tetapi orang-orang Spring membawa begitu banyak perubahan atas konfigurasi, sehingga saya sekarang benar-benar bingung untuk menggunakan konfigurasi xml atau anotasi.

Saya ingin siapa pun menyarankan metodologi atau aturan praktis dalam menggunakan xml dan anotasi.


Contoh di SO menunjukkan bahwa banyak pemula seperti saya semakin bingung tentang konfigurasi.

  • tautan-1

    Sepertinya saya tidak memahami fungsi di belakang <context:annotation-config>dan <context:component-scan>.

    Dari apa yang saya baca mereka tampaknya menangani anotasi yang berbeda (@Required, @Autowired dll vs @Component, @Repository, @Service dll) tetapi juga dari apa yang saya baca mereka mendaftarkan kelas prosesor postingan kacang yang sama.

    Yang lebih membingungkan saya, ada annotation-configatribut di <context:component-scan>...

  • tautan 2

    Saya masih memiliki tag pemindaian komponen:

    <context:component-scan base-package="com.mycompany.maventestwebapp" />

    tapi saya juga punya tag lain (yang terlihat memiliki tugas serupa), yang ini:

    <annotation-driven />

    Apa perbedaan antara kedua tag ini? Hal "aneh" lainnya adalah bahwa contoh sebelumnya (yang tidak menggunakan tag yang digerakkan oleh anotasi) sangat mirip dengan proyek yang dibuat oleh STS menggunakan proyek Spring MVC Template tetapi jika saya menghapus tag yang digerakkan oleh anotasi dari konfigurasinya mengajukan proyek tidak berjalan dan beri saya kesalahan berikut: HTTP Status 404 - ...

Spring 3.2 tidak lagi membutuhkan cglib untuk proxy, tetapi versi yang lebih rendah menggunakan cglib. Kutipan dari blog sumber mata air

Untuk menghasilkan proxy seperti itu, Spring menggunakan perpustakaan pihak ketiga yang disebut cglib. Sayangnya, proyek ini tidak aktif lagi. Di Spring 3.2, sangat mungkin bahwa Spring akan menggunakan Javassist secara default.

Apakah ini cukup untuk menyarankan bahwa Spring adalah Confusion over configuration?

Komunitas
sumber
1
"Orang-orang musim semi membawa begitu banyak perubahan pada konfigurasi" - bisakah Anda memberi contoh? Itu akan membantu pembaca lebih memahami masalah Anda dan menjawab pertanyaan Anda
nyamuk
9
Pertanyaannya tidak begitu bagus, tapi judulnya lucu.
Florian Margaine
1
@gnat dalam proses mengajar diri saya sendiri pada musim semi, saya mencari-cari di Google dan menemukan hal-hal yang sama dengan berbagai cara. dokumentasi musim semi mengatakan satu cara melakukan sesuatu, beberapa tutorial mengatakan cara lain, keduanya benar, kurva belajarnya sangat tinggi. Satu-satunya pertanyaan adalah .. apakah ada dokumentasi yang jelas yang menunjukkan semua cara yang mungkin untuk melakukan satu hal di musim semi ?
1
@tanyakan pertanyaan saat Anda menyatakannya di komentar, "apakah ada dokumentasi", terdengar seperti permintaan sumber daya. Permintaan sumber daya tidak diterima di Programmer . Sejauh yang saya mengerti, seseorang lebih suka menyajikan masalah yang mendasarinya (sejauh yang saya bisa lihat, Anda melakukan hal itu dalam teks pertanyaan, "semakin bingung menggunakan") - masalah yang dimaksudkan untuk diselesaikan dengan sumber daya tertentu yang diminta
nyamuk
2
@tito Saya pikir masalah Anda adalah mencampur tutorial lama dengan dokumentasi baru. Spring telah menjadi "convention over configuration", di mana Anda tidak perlu mengekspresikan sebanyak sebelumnya. Namun, tutorial lama (terutama pra-3.1) melakukan banyak hal sekarang tidak perlu.
Matsemann

Jawaban:

5

Spring bertujuan untuk memberikan Anda kerangka kerja di mana ada "konvensi konfigurasi". Namun kenyataannya adalah bahwa aplikasi Spring memang membutuhkan sejumlah konfigurasi.

Di Spring 2.5.x dan versi sebelumnya, idiom yang umum adalah menyediakan konfigurasi ini melalui XML. Dengan Spring 3.0+, cara idiomatis adalah menggunakan anotasi (sesuatu yang juga didorong Java EE6 / 7).

Sebagai catatan, itu bisa lucu (menyedihkan?) Untuk melihat entitas JPA beranotasi, itu agak mudah untuk menambahkan 4+ penjelasan ke satu bidang ....

Martijn Verburg
sumber
tingkat konfigurasi yang dibutuhkan telah melampaui jangkauan untuk pengembang kecil seperti saya, yang harus berunding dengan sejumlah kerangka kerja untuk menyelesaikan proyek.
1
Saya punya metode dengan sepuluh anotasi, yang masing-masing melakukan hal berguna yang berbeda ...
Donal Fellows
1
Di sisi lain, dimungkinkan juga untuk memiliki entitas JPA dengan penjelasan @Entity tunggal di kelas dan tidak ada yang lain. Jika itu bukan konvensi tentang konfigurasi, saya tidak tahu apa itu. Jika Anda merasa perlu untuk membuat semuanya berjalan persis seperti yang Anda inginkan, jangan mengeluh bahwa Anda berakhir dengan banyak konfigurasi - senang bahwa itu mungkin saja.
Michael Borgwardt
2
Saya tidak mengerti mengapa 4 pengumuman membuat Anda sedih, seperti apa tampilan file xml yang setara?
NimChimpsky
Oh, XML akan jauh, jauh lebih buruk :-)
Martijn Verburg
0
<annotation-driven />

Anda harus menentukan skema XML dari mana asalnya.

Kemungkinan besar dalam konteks strategi penanganan Transaksi JPA ketika mendefinisikan Manajer Transaksi (lihat 9.5.6. Menggunakan @Transactional dalam dokumen Spring)

Ketika Anda mendefinisikan penanganan transaksi yang digerakkan oleh anotasi - Pegas AOP secara otomatis membuat aspek untuk metode Anda untuk memulai (atau memeriksa adanya transaksi) sebelum invokasi suatu metode dan kemudian melakukan (atau mengembalikan jika terjadi pengecualian) setelah metode ivokation telah berakhir.

Zilvinas
sumber
0

Saya telah menemukan bahwa pembuatan IoC / Bean berdasarkan anotasi berguna ketika Anda memiliki implementasi tunggal tetapi mungkin perlu menukarnya.

Dalam menghadapi situasi di mana Anda mungkin perlu menggunakan kembali kacang berulang kali dengan kelas / instance dependen berbeda.

Dalam kasus-kasus itu saya menyatakan kacang dalam konfigurasi dan biasanya melakukan injeksi konstruktor dari ketergantungan apa pun yang saya butuhkan. Kemudian, di kelas yang akan menggunakan kata bean (s) I @Autowiredan kemudian @Qualifier("")- begitulah seharusnya pabrik bekerja.

Singleton adalah metode pabrik yang hanya mengembalikan 1 hasil. Ketika ini tidak mudah diterapkan saat itulah Anda harus mencampurnya.

Sedangkan untuk menggunakan komponen-scan vs tidak ini benar-benar tunduk pada kriteria dan penilaian yang baik di atas. Saya biasanya sangat eksplisit tentang pemindaian komponen paket. Dengan cara itu saya dapat membuat konteks aplikasi yang berbeda untuk pengujian di mana saya dapat mengejek dependensi eksternal (seperti db) sementara masih menguji sisa pengaturan IoC saya.

Selain itu, saya tidak punya @Componentkode perpustakaan di proyek saya. Anda tidak pernah tahu kapan / bagaimana Anda perlu menggunakan kacang di sana dan jika Anda @Componentmenggunakannya, Anda mungkin secara tidak sengaja mengambilnya dalam pemindaian dan Anda membatasi penggunaannya kembali. Untuk kasus-kasus ini, saya biasanya memiliki konteks aplikasi yang didefinisikan di perpustakaan dengan beberapa standar deklarasi berguna kacang bahwa proyek utama saya BISA disertakan dengan impor ke dalam konteks aplikasi itu.

Tidak ada agama di sini. Hanya pengalaman untuk diteruskan

Christian Bongiorno
sumber
0

Spring menawarkan opsi, awalnya hanya ada kabel berbasis xml. Kemudian kabel berbasis penjelasan ditambahkan.
Sekarang mungkin (dan banyak orang melakukannya) untuk menggunakan campuran keduanya.
Ada banyak dokumentasi yang disertakan dengan Spring dan / atau dapat diunduh dari situs web springsource. Ada pelatihan profesional (tidak pernah melakukannya, tidak bisa menjaminnya), dan beberapa buku bagus (saya suka APress 'Pro Spring, pilih rilis yang tepat untuk versi Spring yang Anda pakai).

jwenting
sumber