>> ทบทวนกันสักเล็กน้อยว่าเราเดินทางมาถึงไหนแล้ว
- เรามีจาวาโค้ดที่คุยกันผ่าน interface, ด้วย interface คือกติกาหรือข้อกำหนดพฤติกรรมที่คลาส implement ทุกตัวจะต้องรับเอาไปเขียนให้เกิดการทำงานจริงๆ
- เราแบ่ง layer ของโปรแกรมออกเป็น server, service และ repository โดยกำหนดว่า
- server layer คือ back-end ที่จะถูกเรียกให้ทำงานเป็นอันดับแรกก่อน service layer และ repository layer
- service layer คือ บริการ ที่ทำหน้าที่ทาง business logic หรืองานจริงๆที่จะเกิดขึ้น
- repository layer คือ ชั้นที่ถูกแบ่งออกมาเพื่อกระทำกับข้อมูลที่ยังไม่เข้าข่าย business logic เช่น ติดต่อกับ database หรือ web-service เป็นต้น
- และยังมี model layer ที่กล่าวได้ว่าเป็น shared model ให้กับประดา layer ต่างๆข้างต้นเรียกไปใช้ โดยเน้นย้ำว่า model นี้จะต้องใช้จาวาคลาสอย่างธรรมดาที่สุดมาอธิบายความเป็นออบเจ็กต์ใดๆซึ่งเราเรียกว่า POJO
- ในงานจริงๆ ออบเจ็กต์จะถูกสร้างขึ้นจำนวนมาก ถูกกำหนดค่าให้ผ่านทาง constructor ก็ได้ ผ่านทาง setter method ก็ได้ ซึ่งงานลักษณะนี้ไม่ใช่ business อย่างแท้จริง
- จึงให้ spring framework ทำงาน configuration ดังข้างต้นผ่านทาง XML โดยให้มันจัดเตรียมออบเจ็กต์ที่ต้องการพร้อมกับกำหนดค่าให้ออบเจ็กต์
- และเมื่อถึงเวลาที่จาวาโค้ดทำงาน, spring จึงมีหน้าที่ฉีดออบเจ็กต์ที่ได้จัดเตรียมไว้นี้เพื่อทำงาน business นั่นเองครับ
- อย่างที่ได้เข้าใจกัน สสารไม่หายไปไหน เมื่อนำโค้ดฝั่งจาวาส่วนที่เป็นการจัดเตรียมออบเจ็กต์ออกไป ก็จะเพิ่มโค้ดฝั่ง XML เป็นเงาตามตัว เรียกได้ว่ายิ่งโค้ดฝั่งจาวาสะอาดเท่าไร โค้ดฝั่ง XML ก็จะสกปรกมากขึ้นเท่านั้น (คือเยอะขึ้น)
- และหากจะให้โค้ดฝั่ง XML สะอาดบ้าง หรือแตะ XML ให้น้อยที่สุด แน่นอนก็ต้องกลับมาเขียนโค้ดฝั่งจาวาเพิ่ม แต่จะเป็นการเพิ่มเพียงเล็กน้อยที่ยังดูสบายตา ทั้งยังบริหารจัดการง่ายดาย สิ่งนี้ในหัวข้อนี้ก็คือ Spring Annotation ครับ
>> Spring Annotation Configuration ผ่านทาง XML
- ยังคงต้องมี applicationContext.xml เช่นเดิม เพื่อประกาศ bean หรือจัดเตรียมออบเจ็กต์ใดๆที่รอฉีดให้แก่จาวาโค้ด (bean ก็คือ POJO ที่มีข้อกำหนดเพิ่มเติมเพียงแค่นิดหน่อย)
- เราจะเพิ่ม annotation scanner เข้ามาด้วย เพื่อให้ context สามารถตามหาคลาสใดๆ (ที่เป็น @Component, @Service, @Repository และอื่นๆ) ผ่านทาง namespace หรือก็คือ package ที่กำหนด
- นอกจากนี้เรายังประกาศข้อกำหนดของ context ซึ่งก็คือแท็ก beans โดยผมแนะนำให้ใช้ IDE ที่ชื่อ spring-tool-suite แทน eclipse ธรรมดาครับ
- ดาวน์โหลด spring-tool-suit เวอร์ชันล่าสุดได้จาก https://spring.io/tools ครับ



- นั่นก็เพราะว่าเครื่องมือนี้รู้จัก spring framework ไม่ว่าจะเป็นเรื่อง XML จาวาโค้ดหรือแม้แต่ annotation ทุกตัวที่เกี่ยวข้องกับมัน
>> มาเริ่มต้นกันใหม่อีกครั้ง
- วางโครงสร้างกันก่อน ก็คล้ายกับโครงสร้างเดิมครับ คือมี server, service, repository และ model พร้อม folder ชื่อ libs ดังนี้

- ทีนี้มาลองให้ spring-tool-suit สร้าง applicationContext.xml ให้ (เพราะมันคือไฟล์สำคัญที่ spring จะมาอ่าน)



- อย่างที่ได้กล่าวไป เราต้องการเพิ่ม context namespace เข้าไปใน applicationContext.xml, จงสลับจากแท็บ Source เป็น Namespace
- และเพราะโปรเจ็กค์ของเราใหม่เกินไปที่จะมีจาร์ใดๆในตอนนี้ มันจึงค่อยข้างว่างเปล่า

- ดังนั้นจงไปดาวน์โหลดจาร์ทั้งหมดนี้มาใส่ใน folder ชื่อ libs แล้ว add to build path เสียเรียบร้อย, เข้าใจว่าเดี๋ยวรายการต่างๆจะปรากฏขึ้นมาให้เลือก
*** หากว่าใส่จาร์เข้าไปแล้วไม่เห็นผลใดๆ (คือหน้าต่างดังข้างต้นยังว่างอยู่) ให้ลองคลิกขวาที่โปรเจ็กค์แล้วเลือก Close Project ก่อนจะดับเบิลคลิกเปิดโปรเจ็กค์นี้ใหม่ จึงจะเห็นเหมือนรูปด้านล่าง

- ให้คลิกเพิ่ม context เข้าไปครับ มันบอกว่าจะเกิดการแก้ไขนะ ก็โอเคไป แล้วจึงสลับแท็บจาก Namespace เป็น Source


- ใช้ปุ่ม Ctrl + Spacebar เขียนสองแท็กต่อไปนี้ โดยกำหนดให้ component-scan รู้จัก base-package ของคลาสทั้งหมดของเราที่จะใช้ทำงาน สำหรับตัวอย่างนี้ก็เพื่อให้เข้าถึง server, service, repository และ model ได้ จึงกำหนดเป็น com.pros.example ครับผม

- ผมขออนุญาตใช้ตัวอย่างใหม่ที่ต่างจาก part ที่ผ่านมา โดยกำหนดให้คลาส Book เป็น model

- แต่ยังคงมี repository interface ในการค้นหาหนังสือทั้งหมด

- มี BookRepositoryImpl เป็นคลาสที่ implement เจ้า interface ข้างต้น

*** รายละเอียดของหนังสือตัวอย่างนำมาจาก https://www.packtpub.com
- แต่ยังคงมี service interface ในการค้นหาหนังสือทั้งหมด

- มี BookServiceImpl เป็นคลาสที่ implement เจ้า interface ข้างต้น

- และก็คลาส main ครับ

>> Stereotype Annotations
- ง่ายๆเลยนะครับ หลักๆที่จะใช้มีสามตัวได้แก่ @Component, @Service และ @Repository
- โดย @Service และ @Repository สืบทอดมาจากหรือขยายมาจาก @Component
- @Component ใช้กับ bean หรือ POJO ใดๆ
- @Service ใช้กับคลาสที่เกี่ยวข้องกับ business logic ถ้าอย่างใน spring mvc นั้นเราจะไม่เขียน business logic ไว้ใน controller หรอก แต่เราจะนำมาเขียนไว้ใน service แทนครับ
- @Repository ใช้กับคลาสที่เกี่ยวข้องกับ data ดังที่ได้เคยกล่าวไป เช่น เป็นชั้นของ dao หรือที่เรียกว่า database interaction layer เป็นต้น
>> ตอนนี้ดึกมากแล้ว และผมกำลังจะหลับ...zZ ไว้ต่อ part หน้านะครับ ฝันดีๆ