วันเสาร์ที่ 23 มกราคม พ.ศ. 2559

Spring part 10-1 Bean Scopes

>> ก่อนจะต่อกันที่เรื่องนี้ขอเพิ่มข้อสังเกตจากที่ได้ลองผิดลองถูกกับโปรเจ็กค์มานะครับ
- ถามว่า @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) นั่นเองครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น