[SPRING] ตรวจสอบข้อมูลก่อน Save ด้วย hibernate validator ครับ

หลังจาก Blog ตอนที่แล้วผมได้ลองทำ CRUD โดยใช้ Spring Boot ในเรื่องการการจัดการข้อมูล Person ไปแล้วนะครับ แต่ Blog ตอนล่าสุดของผมยังทิ้งท้ายอยู่นะครับ ว่ามันควรจะมีเรื่องของการ Validate ข้อมูลครับ คราวนี้ ผมเขียนตัว Validate ให้มันสมบูรณ์ครับ ซึ่ง Package ที่ผมใช้ hibernate validator ซึ่งเข้าตัวนี้มันเข้ามากับตอนที่เราใส่ Dependency Spring JPA แล้วครับ มาทำเลยดีกว่า

สิ่งที่ต้องมี

  • สร้างเว็บของตัวเองที่มี CRUD กันก่อนครับ
  • หรือ ของผมใช้จาก Blog ตอนที่แล้วครับ

มาลุยกันเลยครับ

  • ชั้น Entity ที่เก็บ POJO Class – ตัว Data Class ของเราแหละครับ เตรียม Annotation ที่เกี่ยวกับการ Validate ข้อมูลครับ อย่างตอนนี้ผมใช้ตัว  @NotNull  กับ  @Size  ครับ
  • ชั้น Controller สำหรับ Parameter ต้องการ Validate ข้อมูลนั้น
    • ใช้ Annotation  @Valid  ที่อยู่ใน Pacakge  javax.validation  เติมนำหน้า Parameter ของ Function ครับ
    • เพิ่ม  BindingResult  สำหรับเก็บผลการ Validate ไว้ครับ โดยเก็บไว้ในตัวแปรชื่อ result
    • จากนั้นเติมเงื่อนไขดักการ Validate ข้อมูลครับ โดยใช้  result.hasErrors()  ครับ
    • มาดู Code สมบูรณ์ของ Method savePerson() ครับ
  • ชั้น View อันนี้ตัว Thymeleaf ได้มีตัวช่วยแล้วครับ โดยถ้ามี Error มันถูก Inject เข้ามาในตัวแปร  #fields ครับ
    • แสดง Error โดยดูจาก Property  hasErrors('ชื่อ Property ใน Enrity[POJO Class])  เช่น  ${#fields.hasErrors('Firstname')  ครับ เวลาใช้งานก็ดัก Error ที่ส่งมาจาก Controller ผ่าน  th:if  แล้วค่อยแสดงผลครับ Code ตามนี้ครับ
    • มาดู Code ที่ผมได้แก้ไขในไฟล์  editPerson.html  ครับ ใช้ได้ทั้ง Model New / Edit ครับ

ลองมาทดสอบกันดูครับ

  • เมื่อมี Error ระบบแสดง Message ดังนี้ครับ

สำหรับ Blog หน้า ผมคงลอง Custom Error Message ดูครับ 😀 แต่ถึงแม้ว่าชั้น Entiry และ Controller มีกลไกในการดัก Validate ข้อมูลแล้ว แต่ฝั่ง Front-End ต้องดักด้วยนะครับ

[SPRING] มาใช้จัด Layout ให้กับ UI (Thymeleaf) ครับ

จาก Blog ตอนที่ที่ได้สร้างเว็บที่มี CRUD ต่อกับฐานข้อมูลแล้ว แต่ยังพบปัญหาว่ามันยังมี Code ที่ซ้ำซ้อนในส่วนของ UI เช่น

  • ไฟล์  index.html ครับ
  • และไฟล์  editPerson.html  เป็นต้น

พระเอกที่จะมาช่วยเราในครั้งนี้ คือ thymeleaf-layout-dialect

  • ถ้าใครเคยเรียน Design Pattern มาสิ่งที่ thymeleaf ทำ คือ View แต่ละอันทำหน้าที่ของตัวเองพอ แสดง Content ในส่วนที่รับผิดชอบ ส่วนการจัดการพวกเมนู และอื่นๆ จะถูกเพิ่มความสามารถ(Declorate) เข้าไปจากตัว Layout ครับ
  • ตัว Design Pattern ที่ผมหมายถึง คือ Decorator pattern ครับ

มาดูโจทย์กันก่อน

  • เว็บจาก Blog ตอนที่แล้วครับ ที่ผมชี้จุดไปว่าเห้ยมันมี Code ซ้ำ
  • ผมแยก 2 ส่วนนะครับ Header, Content และเพิ่ม Footer ตามรูปครับ

สิ่งที่ต้องมี

  • เว็บตัวอย่างแหละ ปกติผมจะอ้างอิงจาก Blog ตอนก่อน แต่จะสร้างใหม่ก็ได้นะ
  • ตรวจสอบ Dependency ให้ดีต้องมี
    • thymeleaf
    • thymeleaf-layout-dialect

Let’s Refactoring

  • สร้างโพลเดอร์ layouts ใน ก่อนครับ วางโครงสร้างไว้ก่อน เช่น แยก Layout ของหน้าจอ User กับ Admin ครับ
  • สร้างไฟล์ในโพลเดอร์ layouts ชื่อ  mainLayout.html  ครับ

    • สังเกตุดีๆครับ ว่าในแท๊ก  <html>  ต้องมีการอ้างถึง  xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"  ครับ เพื่อให้ Engine ของ Thymeleaf รู้ครับ
    • ตรงแท๊ก  <head>  มีกำหนด header ไว้ครับ โดยจะอ้างอิงไฟล์ใน  fragments/header  ครับ
    • ส่วนแท๊ก <div layout:fragment="content"> เป็นช่องว่างๆครับ เอาไว้นำ html จากหน้าจออื่นๆ เช่น มาเสียบแทนครับ
    • ตรงแท๊ก  <div>  มีกำหนด footer ไว้ครับ โดยจะอ้างอิงไฟล์ใน  fragments/footer  ครับ
  • โครงสร้าง ณ ตอนนี้ครับ
  • มาแก้ไขไฟล์อื่นๆครับ ยกตัวอย่างเฉพาะของ
    • header อันนี้มีการเพิ่ม  th:fragment="header"  เพื่อบอก Script ภายใต้แท๊กที่สนใจถูกเอาไปแทนในไฟล์  mainLayout.html ครับ ในส่วน header
    • footer อันนี้มีการเพิ่ม  th:fragment="footer"  เพื่อบอก Script ภายใต้แท๊กที่สนใจถูกเอาไปแทนในไฟล์  mainLayout.html ครับ ในส่วน footer
    • editPerson มีการเพิ่ม  layout:fragment="content"  เพื่อบอก Script ภายใต้แท๊กที่สนใจถูกเอาไปแทนในไฟล์  mainLayout.html ครับ ในส่วน content

ไฟล์ที่ทำเสร็จแล้วครับ

  • สามารถ Download ไปทดสองได้เลย ^__^

 

[SPRING] ลองต่อฐานข้อมูลกันหน่อย

จาก Blog ที่แล้วไปลองใช้ Thymeleaf ไปแล้วกับการแสดงผลให้สวยงานครับ แต่อันนั้นข้อมูลที่ได้เกิดจากการ Mock จากชั้น Service ครับ สำหรับ Blog ตอนนี้มีเป้าหมาย

  • CRUD ได้
  • ต่อ Database ได้ โดยในที่นี้ผมใช้ MySQL ครับ

สิ่งที่ต้องเตรียม

  • ต่อ Database ต้องมีการเพิ่ม Dependency เพิ่มครับ
    • JPA / Hibernate
    • MySQL – เรื่อง Version ยังไงต้องตรวจดูด้วยนะครับ

มาลุยกันเลยครับ

  • ถ้าเพิ่มข้อมูลเกี่ยวกับ Person ก็ต้องมีหน้าจอ 2 จอ
    • หน้าจอ Main
    • หน้าจอสำหรับ List รายการ
    • หน้าจอสำหรับจัดการข้อมูล Person ครับ
    • หน้าจอดู Owner ครับ (เอามาจาก Blog ตอนก่อน 55)
  • แก้ไขไฟล์  application.properties  สำหรับการเชื่อมต่อฐานข้อมูล persondb ครับ

    • spring.datasource.driverClassName อันนี้ก็ใช้ของ MySQL ครับ
    • spring.jpa.database-platform  ก็เช่นกันครับ กำหนดให้ถูกนะครับ ถ้าลืม อาจจะเจอ Exception แบบนี้

      org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when ‘hibernate.dialect’ not set

    • createDatabaseIfNotExist=true  สำหรับ เอาไว้กำหนดว่า ถ้าไม่เจอ Database ก็ให้สร้างใหม่เลยครับ
    • ตอน Run อย่าลืม เปิด Service ของ MySQL ตาม Config ที่กำหนดไว้นะครับ ไม่งั้นจะเจอ Error

      com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

  • อย่าลืมไปเอา  exclude = {DataSourceAutoConfiguration.class}  ออกจาก  @SpringBootApplication  ที่ไฟล์ [ชื่อ Project]Application.java  ด้วยนะครับ เดี๋ยวจะต่อ DB ไม่ได้เอา บางที่ Spring Intializer มัน Generate มาให้ครับ
  • แก้ไข Entity ครับ ให้เหมาะกับ Table ครับ โดยผมเพิ่ม Column Id เข้าไปครับ และใส่ Annotation ของ Hibernate เข้าไป ซึ่งมีทั้งพวก Validate ข้อมูล และระบุ Column ครับ
  • เพิ่มชั้น Repositories เข้ามาครับ โดยตัวนี้จะช่วยให้การติดต่อฐานข้อมูลง่ายขึ้นครับ
    • สร้าง Folder Repositories ครับ
    • สร้างไฟล์  PersonRepository.java  ครับ โดยผมใช้ JPARepository ครับ เนื่องจาก Feature เยอะว่าครับ ถ้าลอง Search หลายๆเว็บจะใช้ CrudRepository ครับ JPARepository  มาจาก CrudRepository, PagingAndSortingRepository, QueryByExampleExecutor และ Repository ครับ
    • มาดูไฟล์  PersonRepository.java  สมบูรณ์ครับ เนื่องจากไม่มี Cusotmize อะไรเลย ยุ่งกับ Table 1 ต่อ 1 ครับ
  • แก้ไข Service  โดยหลักจะเป็นการเตรียม Method สำหรับ List รายการ / เพิ่ม / ลบ / แก้ไข / เรียกดูข้อมูล ครับ แต่ในส่วนของ Service อันนี้ผมจะแยกเป็น Interface กับ Implement ครับ
    • Interface กำหนด Spec ที่ไฟล์  PersonService.java ครับ
    • Implement ใส่การทำงานจริงครับ ที่ไฟล์  PersonServiceImpl.java ครับ
  • แก้ไข Controller โดยต้องเพิ่ม 2 ไฟล์
    • ไฟล์  IndexController.java  เอาไว้จัดการกับทุก Request ที่เข้ามาครับ โดยใช้งานคู่กับ ไฟล์  index.html  ครับ
    • ไฟล์  PersonController.java เอาไว้จัดการกับทุก Request ที่เกี่ยวกับ [basepath]/persons (หน้า List) และ  [basepath]/person  ครับ
  • หลังจากได้ Controller แล้วมาดูหน้าจอ View ครับ (อันนี้สำหรับผมแล้วเสียเวลาไปวันเต็มๆเลย)
    • สำหรับ Default Path ของ Thymeleaf จะถูก Map พวกไฟล์ View และผองเพื่อน (พวก CSS – ผมใช้ Bootstrap 4, /JS/ Image) ไว้ที่  [CLASS PATH]/resources/static/ ครับ โดยมีโครงสร้างคร่าวๆ ดังนี้
    • สำหรับ View มีข้อควรระวังของ Thymeleaf
      • การอ้างอิงไฟล์  CSS ใน Tag  <link>  ให้มีการระบุ Path ผ่าน  th:href="@{/css/bootstrap.min.css}"  ครับ โดยมันจะไปอ้างอิงตาม Default Path ของ Thymeleaf ครับ
      • การอ้างอิงไฟล์ JS ใน Tag  <script>  ให้มีการระบุ Path ผ่าน  th:src="@{/js/bootstrap.min.js}"  ครับ โดยมันจะไปอ้างอิงตาม Default Path ของ Thymeleaf ครับ
      • สำหรับการ Include ไฟล์อื่นเข้าไป อย่างเช่น ผมต้องการ Include ไฟล์  header.html  เข้าไปครับ โดยใช้  <th:block th:include=  ครับ
    • ตัวอย่าง Code ของแต่ละไฟล์ เอาแค่บางส่วนนะครับ เดี๋ยว Blog จะยาวไป
      • ไฟล์  index.html  ครับ
      • ไฟล์ persons.html ครับ แสดงรายการของ Person ทั้งหมดครับ
      • ไฟล์  editPerson.html  ครับ สำหรับ New / Edit Person ครับ

ทดสอบกันครับ

  • เข้าเว็บเล่นกันครับ ผ่าน  http://localhost:8080  ครับ
  • ลองสร้าง Person
  • เข้ามาดูหน้า List Person
  • View รายการ 1 รายการ

Code ที่เสร็จแล้ว

  • Download ไปลองเล่นกันได้ครับ

สำหรับ Blog ตอนแรกคิดว่าใช้เวลาทำ 2 ชั่วโมง แต่ติดปัญหาด้าน UI จนยาวมาวันครึ่งแทนครับ ใน Blog ตอนนี้ ผมคง Focus เรื่องขา Views (UI) เพราะยังได้กลิ่นของ Code ที่ซ้ำอยู่ครับ และยังขาดในส่วนของการ Validate ข้อมูลครับ

[SPRING] ทำความรู้จักกับ Thymeleaf

จาก Blog ตอนที่แล้วที่ได้ทดสอบ สวัสดีชาวโลก บน Spring Framework กันไปแล้วครับ แต่เว็บของเรามันไม่ได้มีหน้าตาอะไรเลย มีแต่ข้อความอย่างเดียวครับ วันนี้ผมจะมาเพิ่มหน้าจอในส่วนของ View นะครับ

สิ่งที่ต้องเตรียม

  • งานจาก Blog ตอนก่อนครับ
  • ถ้าไม่มีสามารถเพิ่ม Dependency ลงในไฟล์  pom.xml ได้ครับ
  • หรือจะใช้ Spring Initializr ก็ได้ครับ

รู้จักกับ Thymeleaf กันก่อนครับ

  • เป็น Template Engine โดยหลักเราเขียน View ด้วย HTML แหละครับ แต่มี Tag บาง Tag ช่วยให้จัดการกับข้อมูลได้ง่ายขึ้นครับ
  • ถ้าลองเปิดไฟล์ของ Thymeleaf โดยไม่ผ่าน Sping มันจะแสดงผลเหมือน HTML ทั่วๆไปครับ

มาทำกันเลย

  • มาดูที่โครงสร้างกันก่อนครับ
  • ตอนนี้เรามายุ่งกับไฟล์ application.properties ครับ เพื่อให้ Spring รู้จักว่า Thymeleaf เราอยู่ที่ไหนครับ
  • จากนั้นสร้างโพลเดอร์
    • controller – เอาไว้จัดการกับ Flow ที่ได้มาจากหน้าจอ และเรียก Service ที่เกี่ยวข้องครับ
    • service – จัดการกับ Busines Logic
    • ต่อ Database – จัดการกับพวกข้อมูล Data Source ทั้งหลายครับ (ตอนนี้ยังไม่ได้ใช้ครับ) มี 2 Pattern ที่เป็นไปได้ครับ DAO / Repository ครับ
    • entity – พวก Data Class จะทำเป็น POJO Class ครับ
  • ตอนนี้มาเพิ่ม Java Class กันครับ
    • สร้าง Person.java ในโพลเดอร์ Entity ครับ
    • สร้าง PersonService.java ในโพลเดอร์ Service ครับ
    • สร้าง PersonController.java ในโพลเดอร์ Controller ครับ
  • ในส่วนของ UI ต้องสร้างให้ล้อกับที่ Method index ใน กำหนดไว้ด้วยครับ  คือ
    • นั้นหมายความว่าต้องสร้าง View ที่ basePath  src/main/resource/templates/  ต่อด้วยค่าที่ค่าที่ Return Method index  person/index.html ในClass  PersonController.java  ครับ
  • มาดู Structure ได้ครับ
  • หลังจากเข้าใจ Path ที่ต้องสร้าง View แล้ว มาสร้าง View ดีกว่า
    • ไฟล์ view   index.html  ใน  templates/person/ ครับ
    • ไฟล์ css  person.css  ใน  static/css/ ครับ
  • มา Run ด้วยคำสั่ง  ./mvnw spring-boot:run  เพื่อดูผลลัพธ์ผ่าน url http://localhost:8080/person/ ครับ
  • สำหรับ Source Code สามารถ Download ได้จากที่นี่ครับ ปล. ชื่อ package อาจจะตั้งแปลกนะ ตอนแรกตั้งใจว่าจะทำไปเลย แต่ไปๆมาๆของฝึกก่อนดีกว่า ^__^

Blog ตอนต่อไป ผมทำ CRUD แล้วครับ โดยมีการเล่นกับส่วนของ Data Source / Database ครับ

 

[SPRING] สวัสดีชาวโลก

หลังจาก Blog ตอนที่แล้ว ผมได้เขียนเกี่ยวกับเขียน Spring โดยใช้ VSCode ครับ ซึ่งจาก Blog ตอนก่อน ยังติดปัญหาอยู่ที่ว่าเว็บทำงานแล้ว แต่ไม่มีการแสดงผลอะไรทั้งนั้นเลย ซึ่งใน Blog ตอนนี้ผมจะมาทำ Hello world ครับ

สิ่งที่ต้องเตรียม

  • งานที่ทำจาก Blog ตอนก่อนหน้าครับ
  • ถ้าไม่ได้เริ่มมาจาก Blog ผม ก็สามารถเพิ่ม Dependency ไปที่ไฟล์  pom.xml  ดังนี้

ลุยยเลยครับ

  • มาดูโครงสร้างของ Project กันก่อนครับ
  • สิ่งที่ผมเพิ่มเข้าไป คือ โพลเดอร์ hello ทั้งใน main และส่วนของ test ครับ
  • เพิ่มไฟล์  HelloController.java  เข้าไปที่ Path  /java/main/com/cu/thesis/WeMuBPMN/hello/  ครับ
  • เริ่ม Code กันเลยครับ โดยผมต้องการว่า ถ้ามี Request เข้ามาที่ url  http://localhost:8080/hello  ให้ระบบแสดงคำว่า

    สวัสดีชาวโลก

  • มาดูที่ Code กันครับ ซึ่งมีสิ่งที่ต้องสนใจ ดังนี้

    • @RestController  เป็นสิ่งที่ทำใหเ Class helloController  เป็น WebService แล้วครับ
    • จากนั้นลองมาดูที่ Method Index ครับ สิ่งที่ผมทำ คือ ถ้ามี Request  /hello  มา ตัว  @RequestMapping  จะดักไว้ครับ เอาง่ายๆ ถ้ามีอะไร /hello เข้ามา Method Index ทำงานครับ
  • มาทดสอบผ่านหน้าเว็บกันครับ
  • บอกไปว่ามันเป็น WebService งั้นลองผ่าน Postman กันดีกว่า
  • และสุดท้าย ถ้าต้องการให้มันดูมีมูลค่า เรามาทำ Unit Test กันครับ
    • สร้างไฟล์  HelloControllerTest.java  ตาม Path /java/main/com/cu/thesis/WeMuBPMN/hello/ เลยครับ
    • จากนั้นเขียน Code ตามนี้เลยครับ โดยใช้ SpingMVCTest สำหรับช่วย Test ครับ

      • @SpringBootTest  เป็นตัวที่บอกว่าเราใช้ Framework การ Test ของ SpringBoot
      • @AutoConfigureMockMvc  เป็นตัวบอกว่า MockMVC ใช้ค่าตั้งต้นครับ ไม่ต้องอ่าน Config จาก xml ที่ไหนอีก และตัวแปร mvc จะถูกยิง MockMVC Class เข้าไป เพราะได้กำหนด  @Autowired  ไว้ครับ
      • @Test  เป็นตัวบอกว่า Method เป็น Test Case อันหนึ่งของเราครับ โดยใช้ตัว MVCMock เข้ามาช่วยในการดีงค่า และทดสอบผลลัพธ์ที่ได้ครับ โดยทำการดึงค่า
        • Status = isOK (Http Response Code 200)
        • Content มีค่าเท่ากับ “สวัสดีชาวโลก” ครับ
    • ลองมารัน Test ครับ สังเกตุดีว่าจะมีเครื่องหมายถูกสีเขียวด้วย
    • ถ้ามือบอนทำ Fail หละ ผลที่ได้จะเป็นไปตามนี้ครับ

Blog ตอนต่อไปจะเป็น สวัสดีชาวโลก แบบที่มี View แล้ว จะได้มีความสวยงาม ^__^

 

 

[SPRING] ใช้ VSCode ในการเขียน Spring Boot กัน

มาลองใช้งาน Spring Boot โดยใช้ VSCode กันครับ สำหรับ Blog นี้ เนื่องจากหลายๆงานในปัจจุบันหันมาใช้ VSCode กันติดแล้ว เพราะมันเร็ว ง่าย และไม่ซับซ้อนครับ โดยวันนี้ผมลองมาฟื้นฟูทักษะ Java ด้วย หายไปกับ .Net Framework กับ Power Shell หลายปีครับ

สิ่งที่ต้องเตรียม

ลุยกันเลย

  • มาที่ VSCode เปิดมาแล้ว ให้ทำการติดตั้ง Java Extension Pack สำหรับ Extension นี้พัฒนาโดย Microsoft ครับ ซึ่ง Extension นี้ช่วยสำหรับ

    • Java Code HintIntegrated Terminal
    • Debugger
    • Test Runner
    • MAVEN Project
  • ลองสร้าง Project เริ่มต้นจากเว็บ Spring Initializr กันก่อนครับ

    • ตัว Tools ตัวช่วยสร้างโครงสร้าง Project ให้เหมาะกับ MAVEN หรือ Grail ผมเลือก MAVEN ไปครับ
    • ภาษาที่ใช้ ผมใช้ Java
    • เลือกเวอร์ชันของ Sping Boot
    • กำหนด Dependency ที่จำเป็น พิมพ์ได้เลยครับ ในที่นี้ผมเลือก Web / JPA (พวกจัดการ DB) ครับ
    • กำหนดชื่อ Package ครับ
    • ** ถ้ายังเห็นว่า Config ไม่เพียงพอ อยากกำหนดเองทั้งหมด สามารถกดที่ Swithch to the full version ได้ครับ
  • มาดูโครงสร้างข้างในกันครับ
  • เนื่องจากผมยังไม่ได้ Config พวก DataSource ที่ Class WeMuBpmnApplication ต้องแก้ไขก่อนครับ ไม่งั้นตอน Run ไปจะเกิด Error

    Failed to auto-configure a DataSource: ….

    • แก้ไขส่วนของ Anotation จาก  @SpringBootApplication  ครับ
    • ไปเป็น  @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})  ครับ ถ้าเติมแล้วจะเจอขีดแดงๆ มันจะให้ Reference ครับ
    • สังเกตุดีๆครับ VSCode ช่วย Hint แล้วครับ ^__^
    • เสร็จแล้วครับ
  • เข้าที่ VSCode ครับ ลอง Run ครับ ด้วยคำสั่ง  ./mvnw spring-boot:run  โดย Run จาก Integrated Terminal ถ้าไม่เจอ ให้ไปที่เมนู View > Integrated Terminal ครับ
  • ลองเข้า localhost:8080 ดูครับ
  • เจอแล้วอย่าตกใจครับ เพราะ เราเพิ่งเริ่มต้นเอง ยังไม่มีหน้าจอ หรือสั่งให้มัน Map Request อะไรเลย

Blog ตอนต่อไปจะลองพวก HelloWorld แล้วครับ ^__^

Inversion of Control (IoC)

Inversion of Control หรือ IoC มันเป็นจุดขายของตัว Spring Framework จนหลายๆเจ้าเอาไปปรับใช้เข้ากับ Product ของตัวเองครับ (Microsoft ASP.NET MVC ก็ใช้นะ) ก่อนจะไปใช้กัน เรามารู้กัดีกว่า เจ้าตัว Inversion of Control หรือ IoC มัน คือ อะไรครับ

Inversion of Control หรือ IoC คือ อะไร มีประโยชน์อย่างไร

  • มันมีมาเพิ่มลดความผูกแน่นติดกันของ Object ครับ ตาม Quote นี้เลย
    Do not call us we will call you
  • ใช้ฉีด Object เข้าไปในตอน Runtime ครับ ไม่ต้องมาวุ่นวายกับการจัดการ Obeject ครับ ถ้าใช้มันถูกฉีดเข้ามาเอง
  • ช่วยเพิ่มความสามารถในการ Test ได้มากขึ้น เพราะ มันไม่ผูกติดกันแล้ว
  • Re-used Code ในส่วนของ Business Logic ครับ

แล้ว Inversion of Control (IoC) กับ Dependency Injection เกี่ยวกันยังไง

  • มองง่ายๆครับ Inversion of Control (IoC) มัน คือ แนวคิด เรามี Idea ว่าจะทำให้ Code มัน Maintain ง่าย Test ง่ายๆ และไม่ต้องมาวุ่นวายจัดการ Object
  • Dependency Injection จาก Inversion of Control (IoC) มาสู้การลงมือทำจริงครับ ถ้าในแง่ของ Developer อาจจะพูดได้ว่า
    • Inversion of Control (IoC) = Interface
    • Dependency Injection = Implement
  • ว่าแต่ ทำไมผมถึงมองมันว่าเป็น Interface กับ Implement เพราะ Inversion of Control (IoC) มันเอาไปลงมือทำจริงได้หลากหลายแบบครับ ขอยกบางส่วนมาจาก Wiki ครับ
    • Factory Pattern
    • Service Locator Pattern – ที่วางโครงไว้ใน Framework ของ .NET ที่ บริษัทผมใช้ตัวนี้นะครับ
    • Dependency Injection
    • Template method design pattern

กลับมาที่ Spring ดีกว่าตัว Spring ใช้ Dependency Injection ในการจัดการ Inversion of Control ตัวภาษาของ Java ที่เป็น OOP มีตัว Interface มาช่วยลดการผูดติดกันของ Code มาให้อยู่แล้วครับ

[Spring 4.x] Overview กันสักหน่อย

จาก Blog ในตอนที่แล้ว เราได้ใช้ Spring ไปแล้ว หลายคนอาจจะใช้แบบไม่รู้ตัวก็ได้ครับ ที่นี้เรามาดูภาพรวมของ Spring ดีกว่า ว่ามันมีอะไรบ้างครับ

spring-overview

Spring ไม่ได้เกิดมาเพื่อทำเว็บอย่างเดียวนะครับ โดยที่เรารู้จักกันเยอะเป็น Spring MVC กลับมาที่ Spring ดีกว่าครับ Spring มันเป็น Framework  ที่เกิดจากความโหดร้ายของ EJB ใน J2EE ครับ อาทิ เช่น

  • ไม่ต้องการ App Server ตัวใหญ่ๆ
  • การ Implement ที่ต้องเขียน Code เยอะแยะ
  • Code ผูกกับตัว EJB มาเกินไป
  • และอื่นๆ

โดยคุณ Rod Johnson ได้สร้าง Framework ที่ Lightweight  ซึงนำเสนอพร้อมกับหนังสือ Expert One-on-One J2EE Design and Development ครับ โดยมีแนวคิดคร่าวๆ ดังนี้

  • Container
  • Invasion of Control(IoC) โดยใช้แนวคิด Dependency Injection(Di)
  • POJO (Plain Old Java Object)

แก่นหลักที่คุณ คุณ Rod Johnson  คือ ตัว Spring Core (Blog ตอนก่อนหน้าเราก็ใช่เท่านี้ครับ) ที่พัฒนาออกมาในช่วงแรกครับ โดยมีชุมชนพัฒนา-เติมส่วนเสริม (Extension) ตามที่ระบบเราต้องการได้ครับ ไม่จำเป็นต้องใช้ทั้งหมด นี่แหละ Lightweight

Spring Core มันมีสิ่งที่เราต้องรู้จัก ดังนี้

  • POJO (Plain Old Java Object)
  • Container
  • Dependency Injection(Di) หรือ Invasion of Control(IoC)

[Spring 4.x] Hello World in Console

หลังจาก Blog ตอนแรกที่เตรียม Tools กันไปแล้ว คราวนี้มาลองสิ่งที่ Developer ทุกคนต้องเจอกัน Hello World ครับ โดยผมมาพาทำในรูปแบบ Console Application ครับ

หาาาา Spring มันทำเว็บนี้ มันต้องมีคนอุทานแน่ๆ แต่จริงๆ Spring มันเป็น Platform นึงครับ ส่วนของเว็บของ MVC เป้น SubSet ใน Spring ครับ

เริ่มกันเลยดีกว่า

  • ขั้นแรกสร้าง Maven Project ขึ้นมาครับ ให้มันเตรียมพวกไฟล์ Pom.xml และ Lib ที่จำเป็นมาให้
  • เข้าเว็บ Google หา Spring Latest Version หรือไม่ก็เข้าไปลิงค์ที่ผมให้มาครับ
  • สิงที่เราต้องการ คือ พวก Dependency เอาไปแปะในไฟล์ Pom.xml เลยครับ
  • แปะแล้ว Save File ครับ เดี๋ยวตัว IDE มันจะไปดึง Lib ที่เกี่ยวข้องมาให้ครับ
  • ตอนนี้แล้วเรามาดูโครงสร้าง Project กันดีกว่าครับ
    2016-05-22_122011
  • มาเจาะลงทีละไฟล์ครับ
    • สร้าง POJO Interface และ Class กันครับ
      • Interface
      • Implement
    • สร้าง Bean หรือถ้าใน Spring Version ใหม่ๆจะเป็น Configuration Class เป็น Java ของเดิมเป็น XML ครับ
        • Java Style
        • XML Style
    • สร้าง Main เพื่อ run as Java Application
      • @Annotation Style
      • XML Config Style
  • ทดสอบ Run ครับ
    2016-05-22_121900-vert

จบแล้วครับ โดย Code ผมแปะไว้ใน Git ครับ (ได้มีโอกาสใช้สักที 555) หลายคนอาจจะงงว่า แต่ละอันที่ผมใช้ มัน คือ อะไร เดี๋ยวบทความตอนหน้า ผมอธิบายถึงแก่นของ Spring เท่าที่รู้ครับ