Saat membuat anotasi kelas dengan @Component, apakah ini berarti kelas Spring Bean dan Singleton?

111

Karena cukup baru di Spring, saya memiliki pertanyaan tentang memberi anotasi pada kelas. Saat membuat anotasi kelas dengan @Componentapakah ini berarti kelas ini akan menjadi Spring Bean dan secara default menjadi tunggal?

Marco
sumber

Jawaban:

129

Ya, itu benar, @Componentadalah kacang musim semi dan tunggal.

Jika kelas tersebut termasuk dalam lapisan layanan, Anda mungkin ingin memberi anotasi @Servicesebagai gantinya

Namun perlu diingat bahwa agar anotasi ini dapat dideteksi, Anda perlu menempatkan baris ini di applicationContext.xml:

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

Tentang lajang - kacang musim semi semuanya dalam lingkup tunggal secara default. Satu-satunya hal yang harus Anda ingat adalah Anda tidak boleh menyimpan status dalam variabel lapangan (mereka hanya boleh menyimpan dependensi). Dengan demikian, aplikasi Anda akan aman untuk thread, dan Anda tidak akan memerlukan instance bean baru setiap saat. Dengan kata lain, kacang Anda tidak memiliki kewarganegaraan.

Bozho
sumber
1
Saat menggunakan @Component dan atau @Service annotations dll .. berarti saya membuat Singletons, apakah saya tidak akan mengalami masalah konkurensi? Untuk ide pemula saya, ini akan menghasilkan kacang yang digunakan di seluruh ApplicationContext, jadi pengguna yang bersamaan akan mendapatkan referensi ke kacang tunggal. Atau apakah saya melewatkan sesuatu?
Marco
3
@Marco jika Anda tidak memiliki status apa pun (variabel instance berbeda dari spring beans), tidak akan ada masalah konkurensi.
Bozho
Anda "ingin" memerlukan turunan baru dari biji setiap kali atau Anda "tidak akan" memerlukan turunan baru dari biji setiap kali?
Harshana
@ Bozho Apa yang Anda maksud dengan: "dan Anda tidak akan memerlukan instance baru dari kacang setiap saat"? Apakah itu berarti Spring tidak perlu membuat instance baru atau Anda sebagai pengembang tidak perlu membuat instance baru?
pengguna1766169
24

Secara default - Ya.

Namun, Anda dapat mengganti perilaku ini menggunakan @Scopeanotasi. Sebagai contoh:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Lea Zus
sumber