Spring Framework เป็นหนึ่งในเฟรมเวิร์คยอดนิยมสำหรับการพัฒนาแอปพลิเคชัน Java ซึ่งมีความยืดหยุ่นสูง สามารถใช้สร้างแอปพลิเคชันตั้งแต่ระดับเล็กไปจนถึงระดับองค์กรขนาดใหญ่ หนึ่งในความสามารถที่สำคัญของ Spring คือการจัดการ Dependency Injection (DI) โดยอัตโนมัติ ซึ่งช่วยให้การเขียนโค้ดสะดวกและมีความเป็นโมดูลมากขึ้น ในบทความนี้เราจะมาพูดถึงความแตกต่างระหว่าง @Autowired และ @Resource ซึ่งเป็นสอง Annotation ที่ใช้ในการจัดการ DI ใน Spring
#### ความเข้าใจเบื้องต้นเกี่ยวกับ Dependency Injection
Dependency Injection คือการออกแบบที่เน้นให้ส่วนประกอบของโปรแกรมสามารถเชื่อมโยงและพึ่งพาอาศัยกันได้โดยที่ไม่จำเป็นต้องประกาศว่าต้องใช้ส่วนไหนบ้างในโค้ดโดยตรง ช่วยเพิ่มความยืดหยุ่นและลดการพึ่งพาระหว่างส่วนประกอบ ตัวอย่างเช่น ถ้าเรามีคลาส A ที่ต้องใช้คลาส B เราจะไม่ต้องสร้างอินสแตนซ์ของ B ใน Aโดยตรง แต่ใช้ DI แทน
#### @Autowired ใน Spring Framework
`@Autowired` เป็น Annotation ที่มาจาก Spring Framework ซึ่งใช้สำหรับการ Inject bean โดยอัตโนมัติจาก Spring Application Context โดยเมื่อ Spring เจอ @Autowired จะค้นหาคลาสที่เป็นไปได้จาก Application Context มา Inject ให้
ตัวอย่างการใช้งาน @Autowired:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CarService {
@Autowired
private Engine engine;
// methods here
}
ในตัวอย่างนี้ Spring จะทำการ Inject bean ของ `Engine` เข้ามาใน `CarService` โดยอัตโนมัติ
#### @Resource ใน Java
ในทางตรงกันข้าม `@Resource` เป็น Annotation ที่มาจาก Java EE (ปัจจุบันคือ Jakarta EE) ซึ่งทำหน้าที่คล้ายกับ @Autowired แต่มีข้อแตกต่างด้านการกำหนดค่าและการทำงาน เรื่องนี้ยังรวมถึงการทำงานร่วมกับ JNDI สำหรับ resource ที่อยู่นอก Spring bean ด้วย
ตัวอย่างการใช้งาน @Resource:
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class CarService {
@Resource(name = "engine")
private Engine engine;
// methods here
}
ในกรณีนี้ `@Resource` จะพยายามค้นหา bean ที่มี `name` ตรงตามที่กำหนดใน `name` attribute และทำการ Inject นั่นเอง
#### ความแตกต่างที่สำคัญระหว่าง @Autowired และ @Resource
1. การกำหนดค่าตาม Type และ Name:- `@Autowired` จะทำงานโดยพื้นฐานคือกำหนดค่า DI ตาม `Type` ของ Object หากมีหลาย bean ที่มี type เดียวกันสามารถใช้ `@Qualifier` เพื่อระบุชื่อเฉพาะ
- `@Resource` มักจะถูกใช้งานตาม `Name` ก่อน หากไม่ระบุ name แต่วัตถุมีชื่อเดียวกับ field จะทำการ inject โดยชื่อของ field
2. ความยืดหยุ่น:- `@Autowired` มีความสามารถระดับสูงในการทำงานร่วมกับ Spring Context มากกว่า และสามารถทำการ `Autowire by Constructor` หรือ `Autowire by Method` ได้
- `@Resource` นั้นมีประโยชน์เมื่อทำงานร่วมกับ Java EE components และ JNDI
3. การจัดการ Dependencies:- `@Autowired` สนับสนุนการทำงานกับความเป็นโมดูลของ Spring และมี option ในการจัดการกับ Singleton หรือ Prototype beans
- `@Resource` ส่วนใหญ่เน้นการจัดการ resource ซึ่งเหมาะสำหรับ use-case บางประเภท
#### Use Cases ที่เหมาะสม
- หากเคสที่คุณทำงานในแอปพลิเคชันที่ใช้ Spring อย่างเดียวและมีการตั้งค่าเลียนแบบตาม Type แนะนำให้ใช้ `@Autowired`
- หากคุณต้องการทำงานร่วมกับ Legacy Systems ที่ใช้ JNDI หรือ Java EE แนะนำให้ใช้ `@Resource`
การเลือกใช้ annotation ที่เหมาะสมสามารถเพิ่มประสิทธิภาพและความเข้าใจได้ในระดับสูงสุดในโค้ดของคุณ ไม่เพียงแต่จะทำให้โค้ดสะอาดและลดความยุ่งยากในเรื่อง dependencies, แต่ยังช่วยให้ maintainability ดีขึ้นในอนาคต
สำหรับผู้ที่สนใจเรียนรู้เพิ่มเติมเกี่ยวกับ Spring และหลักการของ Dependency Injection เพื่อพัฒนาทักษะและความรู้ในสายงานพัฒนาซอฟต์แวร์ อย่าลืมพิจารณาสมัครเรียนที่โรงเรียนของเรา EPT ซึ่งมีคอร์สหลากหลายครอบคลุมทั้งการใช้งาน Spring และเทคนิคอื่น ๆ ในการพัฒนาซอฟต์แวร์ที่ทันสมัย พบกับครูและผู้เชี่ยวชาญที่พร้อมให้คำแนะนำและการเรียนการสอนที่เข้าใจง่ายในทุกระดับ!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
Tag ที่น่าสนใจ: java c# vb.net python c c++ machine_learning web database oop cloud aws ios android
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM