วันอาทิตย์ที่ 17 มกราคม พ.ศ. 2559

Spring part 8-1 Spring Annotation Configuration with XML

>> ทบทวนกันสักเล็กน้อยว่าเราเดินทางมาถึงไหนแล้ว

- เรามีจาวาโค้ดที่คุยกันผ่าน 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 หน้านะครับ ฝันดีๆ

9 ความคิดเห็น:

  1. ทำไม spring tool ของผมมันไม่รู้จักอะไรเลย

    ตอบลบ
  2. lib โหลดยังไงครับ ค้นหาด้วยคำไหน ผมยังไม่ค่อยเข้าใจ

    ตอบลบ
    คำตอบ
    1. lib ก็คือ folder ที่เราตั้งขึ้นมาเพื่อใช้บรรจุจาวาจาร์ที่โปรเจ็กต์จำเป็นต้องใช้ครับ (แท้จริงตั้งชื่อว่าอะไรก็ได้ หรือไม่ต้องสร้าง folder นี้ก็ได้) ส่วนวิธีการนำจาวาจาร์เข้ามาในโปรเจ็กต์เรียกว่าการ build path ซึ่งเพื่อนสามารถทำได้หลายวิธี ดังนี้ครับ

      http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-(Java)

      ลบ
    2. ส่วนการโหลดจาวาจาร์นั้น สามารถทำได้สองทางใหญ่ๆ คือ โหลดเอง กับใช้เครื่องมือช่วยโหลดให้ ใช้เครื่องมือช่วยโหลดก็เช่น maven, ivy, grape เป็นต้น ซึ่งต้องค้น google ต่อไปว่าจะทำอย่างไรให้โปรเจ็กต์ของเราสามารถเข้าใจและใช้เครื่องมือพวกนี้ได้



      โหลดเอง ผมมักโหลดจาก http://mvnrepository.com/ ครัน โดยใช้วิธีค้นจาก google ว่าต้องการจาร์ชื่อนี้ชื่อนั้น แล้วหาลิงค์ที่มุ่งไปยังเว็บดังกล่าว มองหาเวอร์ชันที่ต้องการ แล้วก็กดปุ่ม download jar ครับ วิธีการนี้ต้องทำทีล่ะจาร์ซึ่งใช้ทั้งเวลาและความยุ่งยากหากว่าจาร์ที่โหลดมานั้นมี dependencie ต่อจาร์ตัวอื่นๆอีก ก็ต้องไปตามโหลดมาให้ครบ มันมีข้อดีตรงที่ว่าเราได้รู้ว่า error แบบไหนต้องแก้ด้วยจาร์อะไร ผมจึงชอบวิธีนี้ครับ

      ลบ
  3. มั่วจนได้ละครับ แต่ผมหา p.jar ไม่เจอครับ

    ตอบลบ
  4. ไม่ได้ครับ T T โหลดมาผิดอันหรือยังไงก็ไม่ทราบ

    ผมติดที่ตรงนี้ครับ "ดังนั้นจงไปดาวน์โหลดจาร์ทั้งหมดนี้มาใส่ใน folder" ไม่รู้ว่าต้องไปโหลดอะไรที่ไหนครับ รบกวนด้วยครับ ขออภับ

    ตอบลบ
  5. ได้ละครับ ผมไปเอาจาร์จากตอน 5 มาใส่

    ตอบลบ
    คำตอบ
    1. ยอดเยี่ยมเลยครับที่มีความพยายาม :)

      ลบ