วันอาทิตย์ที่ 13 เมษายน พ.ศ. 2557

คึกอยากจะทบทวน Spring Framework part 4

: Sample Project กับ Model, Repository และ Service

ถาม : จาก part 3 ที่ผ่านไป อยากให้จำลองการทำงานแบบใช้ concept ของ model, repository และ service ด้วยกลไกของภาษาจาวาแบบไม่ซับซ้อน
ตอบ : ถ้าอย่างนั้นสร้าง project ใหม่ แล้วลองทำตามข้าพเจ้า
- สร้าง project ใหม่ชื่อ spring_sample
- สร้าง package ชื่อ com.sample.model สำหรับจำลอง model
- สร้าง package ชื่อ com.sample.repository สำหรับจำลอง repository
- สร้าง package ชื่อ com.sample.service สำหรับจำลอง service
- สร้าง package ชื่อ com.sample.server สำหรับจำลอง server (คลาสทดสอบพร้อม main เมธอด)


- สร้าง class ชื่อ Customer ให้เป็น bean ใน model ดังนี้

package com.sample.model;

public class Customer {
     private String firstName;
     private String lastName;

     public Customer() { }

     public String getFirstName() {
          return firstName;
     }

     public String getLastName() {
          return lastName;
     }

     public void setFirstName(String firstName) {
          this.firstName = firstName;
     }

     public void setLastName(String lastName) {
          this.lastName = lastName;
     }
}


- สร้าง interface ชื่อ CustomerRepository เก็บไว้ใน repository บังคับกติกา findAll (สมมติว่าสามารถดึงข้อมูลทั้งหมดจาก database) ดังนี้

package com.sample.repository;
import java.util.List;
import com.sample.model.Customer;

public interface CustomerRepository {
     List<Customer> findAll();
}


- เมื่อมี interface (เจ้า spring จะทำงานกับ interface เป็นสำคัญนะ) ก็ต้องมีการ implementation ไปใช้งาน ดังนั้นสร้าง class ชื่อ HibernateCustomerRepositoryImpl เพื่อรับเอากติกาดังกล่าวไปใช้ (ชื่อยาวไปนิด แต่เป็นข้อแนะนำที่ดีในการตั้งชื่อให้สื่อความหมายนะครับ ในที่นี้ใช้คำว่า Hibernate ด้วย คือจะสื่อสมมติว่าใช้ Hibernate เป็นตัวจัดการข้อมูลระหว่างโปรแกรมนี้กับ database นั่นเอง)

package com.sample.repository;
import java.util.ArrayList;
import java.util.List;
import com.sample.model.Customer;

public class HibernateCustomerRepositoryImpl implements CustomerRepository {
     public List<Customer> findAll() {
          List<Customer> customers = new ArrayList<Customer>();
          Customer customer = new Customer();
          customer.setFirstName("Phai");
          customer.setLastName("ProSbeginner");
          customers.add(customer);
          return customers;
     }
}

ในที่นี้เราก็ให้ว่าเมธอด findAll เมื่อถูกเรียกให้ทำงานจะไปค้นหาข้อมูลใน database มา คือเอามาใส่ไว้ใน List สมมติว่าได้ข้อมูลดังข้างต้น


- ทีนี้ก็ service เริ่มโดยสร้าง interface ชื่อ CustomerService บังคับให้มี findAll (เพื่อในอนาคตจะให้ไปเรียก repository) ดังนี้

package com.sample.service;
import java.util.List;
import com.sample.model.Customer;

public interface CustomerService {
     List<Customer> findAll();
}


- แล้วจึง implementation มันในชื่อ CustomerServiceImpl การทำงานให้สร้าง object ของ repository ที่จะไปดึงข้อมูลมาให้ ดังนี้

package com.sample.service;
import java.util.List;
import com.sample.model.Customer;
import com.sample.repository.CustomerRepository;
import com.sample.repository.HibernateCustomerRepositoryImpl;

public class CustomerServiceImpl implements CustomerService {
     private CustomerRepository customerRepository = new HibernateCustomerRepositoryImpl();
     public List<Customer> findAll() {
          return customerRepository.findAll();
     }
}


- สุดท้ายแล้วก็สร้าง class ทดสอบชื่อ Application เรียกไปที่ service แล้วถามหา findAll ในที่นี้มีข้อมุลเดียวก็เลยเรียกไปที่ get(0) ก็จะได้ชื่อออกมาครับ

package com.sample.server;
import com.sample.service.CustomerService;
import com.sample.service.CustomerServiceImpl;

public class Application {
     public static void main(String[] args) {
          CustomerService service = new CustomerServiceImpl();
          System.out.println(service.findAll().get(0).getFirstName());
     }
}


ผมอยากให้สังเกตการเรียกใช้งานที่เราจะมุ่งไปยัง interface เป็นสำคัญ ลองทำความเข้าใจไปทีละน้อย ส่วน part หน้า เราจะมาควบคุมการเรียกลักษณะคล้ายกันนี้ด้วย xml ครับ

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