เค้าเปรียบการพัฒนาการของ EJB ได้ว่า แมลงสวย --> ช้าง --> วัว (EJB3)
ลักษณะทั่วไป
- EJB ให้มองว่ามันเป็น component ที่เราสามารถนำมันมา reuse ได้ เช่นทั้ง 2 app สามารถใช้ component เดียวกันได้ คำว่า component ถ้ามองในเทคโนโลยีอื่นๆ เช่น Microsoft COM+, CORBA
- เราสามารถเขียน EJB โดยที่ไม่ต้องเขียนจัดการกับความซับซ้อนของ error-prone code, transaction, security access control เพราะทาง EJB Container เตรียมความสามารถเหล่านี้ไว้แล้ว เราเพียงแค่ใช้ metadata (Annotation Java5+) ในการประกาศว่าจะใช้ความสามารถเหล่านี้ ดังนั้น code ที่เราเขียนจึงมีไม่มากสามารถพัฒนาได้อย่างรวดเร็ว และเราสนใจเพียงแค่ business logic ไม่ต้องมองถึง infra structure code มากนัก
- Pojo + Annotation = EJB ใน annotation เป็นการเขียน program แบบประกาศว่าเราต้องการ service อะไรให้ EJB เราบ้าง หรือใช้ระบุประเภทของ EJB ก็ได้
- Entity bean ใน EJB3 รองรับ concept OO เช่น Inheritance, Polymophism มันเป็นสิ่งสำคัญมากที่ให้เราสามารถเพิ่ม business logic ใน Entity bean ของเรา ดังนั้นการ implement rich domain object ก็เป็นเรื่องที่ง่าย แต่มีบางคนที่ไม่ชอบ (Martin Fowler) ที่จะยัดความซับซ้อนลงใน domain object (EJB2 ทำได้ยากนัก) โดยเสนอให้สร้าง service/application layer ที่ทำหน้าที่ business logic ไว้ต่างหาก (service layer มันก็เหมือนกับ business layer แต่มันแค่บางกว่า) ดังนั้นจึงไม่น่าแปลกใจที่จะเห็นการเอา Session bean มาทำหน้าที่เป็น service layer
- Presentation Layer --> [Service Layer] Business Layer --> Persistance Layer --> Database Layer
- Domain-driven design
- Session Bean เป็นที่เก็บ business logic ต่างๆ โดยแบ่งออกเป็น 2 ประเภทคือ
- Stateless ที่จะไม่เก็บสถานะของ client ไว้ข้าม request ควรนำมาใช้งานเช่น ตรวจสอบวงเงิน หรือตรวจสอบว่าลูกค้าเคยซื้ออะไรแล้วบ้าง
- Stateful จะเก็บสถานะของ client ข้าม request ได้เลยจนกว่า client จะ disconnection กับทาง web app เราเช่น transaction ของการซื้อสินค้า online ที่ต้องผ่านหลายหน้ากว่าจะเสร็จ 1 transaction
- Message - Driven beans (MDB) คล้ายกับ session bean ที่เก็บ business เหมือนกันแตกต่างตรงที่ client เรียก MDB ไม่ได้แต่ MDB จะดักจับข้อมูลไปหา MDB Server (i.e. IBM Websphere MQ, Sonic MQ, Oracle Advanced Queueing, TIBCO) โดย MDB จะใช้กับระบบที่เชื่อมต่อกันหรือต้องการทำงานแบบ asynchronous process เช่นส่งรายการสินค้าที่ได้ใหม่ไปที่ระบบ automated retail หรือใช้ในระบบ supply chain management
- Entities and Java Persistence API เป็น feature ที่น่าสนใจของ EJB3 ในส่วนของการจัดการ persistence
- Persistence เป้นความสามารถในการเอาข้อมูลที่อยู่ใน relational database ออกมาเป็น Java Object ใน persistance ของ EJB3 จะจัดการโดยใช้ JPA โดยมันจะใช้เทคนิคที่เรียกว่า ORM การใช้เทคนิคดังกล่าวอาจต้องมีการ config เล็กน้อยเพื่อให้รู้ว่า field ใด map เข้ากับ attribute ใดโดยเราไม่ต้องสนใจว่าจะเขียน code ติดต่อกับ database อย่างไรเพราะ JPA จะจัดการส่วนนี้ให้ ช่วยทำให้ลดเวลา coding และช่วยลดความน่าเบื่อได้
- Framework ที่มีความสามารถของ ORM แบบนี้ไม่ได้เป็น concept ใหม่แต่มันมีมานานแล้วเช่น Oracle Toplink, JBoss Hibernate
- ใน EJB3 ในส่วน Persistence จะใช้ JPA ซึ่งมันมีการกำหนดมาตรฐานดังนี้
- เขียน ORM config metadata เมื่อ mapping กับ relational database
- EntityManager API เป็น API มาตรฐาน ที่เอาไว้ทำ CRUD ให้กับ Entity bean
- Java Persistence Query Language (JPQL) ใช้ค้นหาและส่ง persistence app data
- ตั้งแต่ Java มีการกำหนดมาตราฐาน JPA เพื่อให้เป็นมาตราฐานของ ORM Framework มันทำให้เราสามารถ plugin ORM product อื่นๆ เช่น JBoss Hibernate, Oracle Toplink, BEA Kodo ฯลฯ ภายใต้ JPA ได้
- Entity ถ้าใช้ JPA ในการสร้าง persistence logic เราต้องใช้ entity bean
- ถ้าเรามอง session bean เป็น verb ตัว entity เปรียบได้กับ noun
- EntityManager มันเป็น interface โดยมันจัดเตรียมบริการต่างๆ ให้กับ persistence (CRUD) โดยมันจะอ่าน ORM metadata จาก entity และจัดเตรียมการทำงานต่างๆ ภายใต้ DB ให้ (CRUD) (เพิ่มเติม ข้างใน JPA มีการจัดเตรียมความสามารถในการจัดการ Lifecycle, Performance Turning, Caching และจัดการ Transaction)
- Java Persistence Query Language เป็นสิ่งที JPA จัดเตรียม Query Language ไว้ทำหน้าที่คล้ายกับ SQL ปกติ
เมื่อเราสร้าง Java class มันต้องรันผ่าน JVM นี่ก็เหมือนกันใน EJB session bean, mdb ทำงานอยู่บน ejb container ส่วน entity bean ทำงานบน persistence provider (จริงๆ EJB Container ก็คือ JVM แต่เพิ่มความสามารถเข้าไปเช่น transaction management, security management, remoting, webservice)
- Web Container (deploy: jsp, jsf) สามารถเข้าถึง session bean, entity bean ได้
- EJB Container (deploy: session bean, mdb) สามารถเข้าถึง entity bean ได้
- Persistence provider (deploy: entity bean)
No comments:
Post a Comment