เมื่อใส่คำอธิบายประกอบชั้นเรียนด้วย @Component หมายความว่าเป็น Spring Bean และ Singleton หรือไม่


111

ฉันค่อนข้างใหม่สำหรับ Spring ฉันมีคำถามเกี่ยวกับการใส่คำอธิบายประกอบชั้นเรียน เมื่อใส่คำอธิบายประกอบคลาสด้วย@Componentหมายความว่าคลาสนี้จะเป็น Spring Bean และโดยค่าเริ่มต้นเป็นซิงเกิลตันหรือไม่

คำตอบ:


130

ใช่ถูกต้อง@Componentคือ Spring bean และ Singleton

หากชั้นเรียนเป็นของชั้นบริการคุณอาจต้องการใส่คำอธิบายประกอบด้วย @Serviceแทน

แต่โปรดทราบว่าเพื่อให้ตรวจพบคำอธิบายประกอบเหล่านี้คุณต้องวางบรรทัดนี้ไว้ในapplicationContext.xml:

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

เกี่ยวกับเสื้อกล้าม - ถั่วสปริงล้วนอยู่ในขอบเขตซิงเกิลตันตามค่าเริ่มต้น สิ่งเดียวที่คุณต้องจำไว้คือคุณไม่ควรเก็บ state ไว้ในตัวแปรฟิลด์ (ควรมีการอ้างอิงเท่านั้น) ดังนั้นแอปพลิเคชันของคุณจะปลอดภัยต่อเธรดและคุณไม่ต้องการอินสแตนซ์ใหม่ของถั่วทุกครั้ง กล่าวอีกนัยหนึ่งถั่วของคุณไร้สัญชาติ


1
เมื่อใช้คำอธิบายประกอบ @Component และหรือ @Service เป็นต้นหมายความว่าฉันกำลังสร้าง Singletons ฉันจะไม่ประสบปัญหาการทำงานพร้อมกันหรือไม่ สำหรับไอเดียมือใหม่ของฉันมันจะส่งผลให้เกิด bean ที่ใช้ตลอด ApplicationContext ดังนั้นผู้ใช้ที่ทำงานพร้อมกันจะได้รับการอ้างอิงถึง bean เดียว หรือฉันขาดอะไรไป?
Marco

3
@Marco หากคุณไม่มีสถานะใด ๆ (ตัวแปรอินสแตนซ์ที่แตกต่างจากถั่วสปริง) จะไม่มีปัญหาการทำงานพร้อมกันเกิดขึ้น
Bozho

คุณ "ต้องการ" ต้องการอินสแตนซ์ใหม่ของถั่วทุกครั้งหรือคุณ "เคยชิน" ต้องการอินสแตนซ์ใหม่ของถั่วทุกครั้ง?
Harshana

@Bozho คุณหมายถึงอะไร: "และคุณจะไม่ต้องการอินสแตนซ์ของถั่วใหม่ทุกครั้ง"? หมายความว่า Spring ไม่ต้องสร้างอินสแตนซ์ใหม่หรือคุณในฐานะนักพัฒนาไม่จำเป็นต้องสร้างอินสแตนซ์ใหม่
user1766169

25

โดยค่าเริ่มต้น - ใช่

อย่างไรก็ตามคุณสามารถลบล้างพฤติกรรมนี้ได้โดยใช้@Scopeคำอธิบายประกอบ ตัวอย่างเช่น:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.