>> ก่อนจะต่อกันที่เรื่องนี้ขอเพิ่มข้อสังเกตจากที่ได้ลองผิดลองถูกกับโปรเจ็กค์มานะครับ
- ถามว่า @ComponentScan ใช้เมื่อไร? เอ้ ชื่อของมันก็สื่ออยู่แล้วคือไว้สแกน component ต่างๆในโปรเจ็กค์ ได้แก่ @Component, @Service และ @Repository เป็นต้น
- ถามว่า @ComponentScan สำคัญอย่างไรกับ @Autowired จากที่ได้สังเกตหากโปรเจ็กค์ไม่ได้ใช้ @Component, @Service และ @Repository มันก็ไม่มีความหมายอะไรเลย คือไม่ต้องเขียนก็ได้ โดยที่ @Autowired ยังคงทำงานฉีดบีนได้ตามปกติ แต่มีข้อแม้ว่าเราต้อง config บีนให้ครบถ้วนนะครับ (จบแล้ว)
>> Bean Scopes หรือก็คือขอบเขตของน้องถั่ว (ดำ) haha ขออภัยครับ ผมหมายถึง scope ของจาวาบีน เท่าที่ทราบตอนนี้มี 5 ขอบเขต ได้แก่
- Singleton (ค่านี้เป็น default)
- Prototype
- Request
- Session
- Global
*** สามขอบเขตหลัง Request, Session, Global ใช้กับ spring web เท่านั้นครับ ตัวอย่างเช่น spring mvc
>> Singleton scope ค่านี้คือ default ขอบเขตของบีน หมายความว่า
- จะมีออบเจ็กต์บีนเกิดขึ้นภายใน spring container หรือใน context เพียง 1 ออบเจ็กต์เท่านั้น, จะเรียก new กี่ครั้งมันก็จะมีแค่ 1 ออบเจ็กต์
- เมื่อเรียกใช้ singleton scope หรือ @Scope("singleton") สำหรับวิธี configuration ด้วยจาวาจำต้องเพิ่มจาร์ AOP เข้ามาด้วยนะครับ (ซึ่งเราเอาเข้ามาแล้วเรียบร้อย spring-aop-4.2.4.RELEASE.jar)
- แต่ถ้าเรียกใช้ singleton scope หรือ scope="singleton" สำหรับวิธี configuration ด้วย XML ไม่จำเป็นต้องเพิ่มจาร์ AOP
>> ตัวอย่างต่อไปนี้แสดงให้เห็นว่า แม้กำหนดหรือไม่กำหนด singleton scope และเราขอออบเจ็กต์ service จาก spring มาถึงสามครั้ง ออบเจ็กต์ที่ได้คือออบเจ็กต์ตัวเดียวกันทั้งหมดครับ (สังเกตจากหมายเลข address เดียวกัน)
- แบบที่ไม่ระบุ singleton scope
- แบบที่ระบุ singleton scope
สรุปได้ว่าทั้งสองผลลัพธ์เหมือนกัน เพราะว่า singleton scope คือค่าโดยปริยาย (default) นั่นเองครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น