>> ทบทวนกันสักเล็กน้อยว่าเราเดินทางมาถึงไหนแล้ว
- เรามีจาวาโค้ดที่คุยกันผ่าน 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 หน้านะครับ ฝันดีๆ
ทำไม spring tool ของผมมันไม่รู้จักอะไรเลย
ตอบลบอ๋อ เป็นที่ workspace
ตอบลบlib โหลดยังไงครับ ค้นหาด้วยคำไหน ผมยังไม่ค่อยเข้าใจ
ตอบลบlib ก็คือ folder ที่เราตั้งขึ้นมาเพื่อใช้บรรจุจาวาจาร์ที่โปรเจ็กต์จำเป็นต้องใช้ครับ (แท้จริงตั้งชื่อว่าอะไรก็ได้ หรือไม่ต้องสร้าง folder นี้ก็ได้) ส่วนวิธีการนำจาวาจาร์เข้ามาในโปรเจ็กต์เรียกว่าการ build path ซึ่งเพื่อนสามารถทำได้หลายวิธี ดังนี้ครับ
ลบhttp://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-(Java)
ส่วนการโหลดจาวาจาร์นั้น สามารถทำได้สองทางใหญ่ๆ คือ โหลดเอง กับใช้เครื่องมือช่วยโหลดให้ ใช้เครื่องมือช่วยโหลดก็เช่น maven, ivy, grape เป็นต้น ซึ่งต้องค้น google ต่อไปว่าจะทำอย่างไรให้โปรเจ็กต์ของเราสามารถเข้าใจและใช้เครื่องมือพวกนี้ได้
ลบโหลดเอง ผมมักโหลดจาก http://mvnrepository.com/ ครัน โดยใช้วิธีค้นจาก google ว่าต้องการจาร์ชื่อนี้ชื่อนั้น แล้วหาลิงค์ที่มุ่งไปยังเว็บดังกล่าว มองหาเวอร์ชันที่ต้องการ แล้วก็กดปุ่ม download jar ครับ วิธีการนี้ต้องทำทีล่ะจาร์ซึ่งใช้ทั้งเวลาและความยุ่งยากหากว่าจาร์ที่โหลดมานั้นมี dependencie ต่อจาร์ตัวอื่นๆอีก ก็ต้องไปตามโหลดมาให้ครบ มันมีข้อดีตรงที่ว่าเราได้รู้ว่า error แบบไหนต้องแก้ด้วยจาร์อะไร ผมจึงชอบวิธีนี้ครับ
มั่วจนได้ละครับ แต่ผมหา p.jar ไม่เจอครับ
ตอบลบไม่ได้ครับ T T โหลดมาผิดอันหรือยังไงก็ไม่ทราบ
ตอบลบผมติดที่ตรงนี้ครับ "ดังนั้นจงไปดาวน์โหลดจาร์ทั้งหมดนี้มาใส่ใน folder" ไม่รู้ว่าต้องไปโหลดอะไรที่ไหนครับ รบกวนด้วยครับ ขออภับ
ได้ละครับ ผมไปเอาจาร์จากตอน 5 มาใส่
ตอบลบยอดเยี่ยมเลยครับที่มีความพยายาม :)
ลบ