บทสรุปบทความนี้จะหารือกับคุณถึงวิธีการรวมพลังของคำอธิบายประกอบและแง่มุมต่าง ๆ เพื่อให้บริการที่เปิดเผยแก่องค์กรในวิธีที่เข้ากันได้กับ EJB 3.0 ในขณะที่ยังคงให้ความเป็นอิสระของภาชนะ
1. บทนำ
ในการแสวงหาวิธีการร่วมกันของเราเพื่อปรับปรุงประสิทธิภาพการผลิตของการพัฒนาซอฟต์แวร์เรา - ในฐานะสมาชิกของชุมชน Java - โดยทั่วไปหันไปหา J2EE เพื่อให้ปัญหาทางเทคนิคที่ท้าทายมากขึ้นในการพัฒนาองค์กรเช่นการจัดการธุรกรรมแบบกระจาย อุดมการณ์แนวทางที่อยู่เบื้องหลัง - บริการองค์กรที่ซับซ้อนเหล่านี้สามารถนำไปใช้งานได้โดยผู้ขายแอปพลิเคชันเซิร์ฟเวอร์และมีความสมดุลโดยนักพัฒนาเชิงพาณิชย์ - เป็นความคิดที่ดี J2EE โดยเฉพาะ EJB ได้จัดทำแพลตฟอร์มที่แอปพลิเคชัน Java ขององค์กรได้สำเร็จ
ส่วนหนึ่งของความสำเร็จนี้เกิดจากความสามารถในการดำเนินการเขียนโปรแกรมที่ประกาศ - วิธีการพัฒนาโปรแกรม - ซึ่งคุณสามารถประกาศบริการโครงสร้างพื้นฐานแทนการเข้ารหัสอย่างชัดเจนด้วยตรรกะทางธุรกิจเพื่อให้รหัสแพร่กระจายไปทุกหนทุกแห่ง EJB ได้พิสูจน์คุณค่าของวิธีการเขียนโปรแกรมนี้ - โดยการอนุญาตให้มีปัญหาระดับองค์กรเช่นการทำธุรกรรมและความปลอดภัยที่จะประกาศด้วยตัวบ่งชี้การเผยแพร่และจัดการโดยคอนเทนเนอร์
อย่างไรก็ตามในช่วงหลายปีที่ผ่านมานักพัฒนาซอฟต์แวร์จำนวนมากขึ้นได้ตระหนักว่า EJB นำความท้าทายใหม่ ๆ มาใช้ในการผลิตของทีม - แต่ละ EJB จะต้องมาพร้อมกับหลายอินเทอร์เฟซพร้อมคำอธิบายคำอธิบายการเผยแพร่ที่เข้าถึงได้ผ่าน JNDI ฯลฯ การทดสอบหน่วยบน EJB นอกคอนเทนเนอร์ยังนำมาซึ่งความยากลำบากเพิ่มเติม
โปรดทราบว่าในการอ่านบทความนี้คุณต้องมีเครื่องมือต่อไปนี้:
· Java 2 SDK 1.5
· Maven 2.0 Beta 2
เป้าหมายของ EJB 3.0 คือการทำให้การพัฒนาองค์กรง่ายขึ้นในด้านต่อไปนี้:
·ใช้คำขอที่ประกาศสำหรับบริการระดับองค์กรโดยการแนะนำคำอธิบายประกอบข้อมูลเมตา
·ใช้การพึ่งพา/การฉีดทรัพยากรผ่านคำอธิบายประกอบ
·ใช้ decoupling ของ Enterprise Beans และอินเตอร์เฟสเฉพาะ EJB
·การทำให้การจัดเก็บอย่างต่อเนื่องง่ายขึ้นผ่านการทำแผนที่ความสัมพันธ์ของวัตถุที่มีน้ำหนักเบา
นี่เป็นเหมือนสายลมฤดูใบไม้ผลิสำหรับนักพัฒนา EJB - พวกเขาทำงานอย่างหนักเพื่อพัฒนาทดสอบและบำรุงรักษา EJB ตอนนี้เป็นเรื่องง่ายที่จะเขียนถั่วองค์กรโดยใช้ EJB 3.0 เช่นเดียวกับการสร้าง Pojo (วัตถุ Java ดั้งเดิม) ที่มีคำอธิบายประกอบเฉพาะเพื่อทำเครื่องหมายว่าเป็น EJB และขอบริการระดับองค์กร นี่คือตัวอย่างจาก EJB ใน EJB 3.0 Public Draft:
@stateful
Cartbean คลาสสาธารณะใช้ช้อปปิ้งคาร์ท
-
ทั้งหมดลอยตัวทั้งหมด;
รหัสผลิตภัณฑ์เวกเตอร์เอกชน
สาธารณะ someshoppingmethod () {... };
-
-
คำแถลง EJB 3.0 ระบุว่าสิ่งที่นักพัฒนาต้องการไม่ใช่เฮฟวี่เวท ด้วยเหตุนี้หนึ่งในวิธีที่สำคัญที่สุดที่จัดทำโดย EJB 3.0 คือการแยกถั่วและ EJB APIs และโซลูชันนี้ยังนำมาซึ่งอนุพันธ์ที่น่าสนใจ - EJB สามารถทำงานได้ไม่เพียง แต่ในคอนเทนเนอร์ EJB ที่แตกต่างกัน แต่ยังอยู่ในกรอบแอปพลิเคชันใด ๆ - กรอบเหล่านี้จะต้องสามารถรับรู้ EJB 3.0 (JSR 220) และคำอธิบายประกอบปกติสำหรับการประกาศบริการ Enterprise (JSR 250)) .
บทความนี้ไม่ได้ให้การสำรวจเชิงลึกเกี่ยวกับการเขียนโปรแกรมที่ประกาศ, EJBS, แง่มุมหรือคำอธิบายประกอบ เพียงแค่วิเคราะห์ความสัมพันธ์ระหว่างเทคโนโลยีเหล่านี้และหารือเกี่ยวกับวิธีการรวมเข้าด้วยกันในวิธีใหม่เพื่อลดความซับซ้อนของการพัฒนาแอปพลิเคชัน
ในบทความนี้คุณจะได้เรียนรู้วิธีการเขียนถั่วที่เข้ากันได้กับ EJB 3.0 และสร้างแง่มุมง่าย ๆ หลายประการเพื่อให้การจัดการธุรกรรมการรักษาความปลอดภัยและการฉีดทรัพยากร ฉันหวังว่าคุณจะได้รับประโยชน์จากแบบฝึกหัดนี้:
·แอพพลิเคชั่นที่ใช้งานได้จริงสามประการในการเรียนรู้ (การฉีดพึ่งพาการรักษาความปลอดภัยและธุรกรรม)
·คุ้นเคยกับ EJB 3.0 และแนวคิดที่อยู่เบื้องหลัง
รับรู้วิธีการใช้ decoupling ของ EJB จาก APIs เฉพาะเพื่อให้บริการที่เข้ากันได้กับ EJB 3.0 สามารถนำไปใช้งานได้ที่น้ำหนักเบาแทนที่จะจัดทำโดย EJB เท่านั้น
2. ตัวอย่างการสั่งซื้อแอปพลิเคชัน
ตลอดการสนทนาคุณจะได้เรียนรู้เกี่ยวกับการใช้ระบบการสั่งซื้อเที่ยวบิน - ซึ่งใช้แง่มุมและคำอธิบายประกอบเพื่อใช้การฉีดพึ่งพาการรักษาความปลอดภัยและการจัดการธุรกรรม แอพดำเนินการเพียงสองฟังก์ชั่น: ช่วยให้ผู้ใช้สามารถค้นหาเที่ยวบิน (รูปที่ 1) จากนั้นสั่งการเดินทาง (รูปที่ 2) การดำเนินการทั้งสองจะถูกประมวลผลอย่างปลอดภัยเพื่อให้ผู้ใช้ที่ระบุเฉพาะสามารถดำเนินการได้ นอกจากนี้เนื่องจากการดำเนินการ "สั่งซื้อ" เกี่ยวข้องกับการสั่งซื้อเที่ยวบินสองเที่ยวบิน (ออกจากเที่ยวบินกลับ) การดำเนินการจะต้องถูกสร้างขึ้นเป็นธุรกรรม - ตัวอย่างเช่นคำสั่งซื้อทั้งสองจะประสบความสำเร็จหรือล้มเหลวในฐานะหน่วยงาน
รูปที่ 1. การค้นหาเที่ยวบิน: ก่อนอื่นผู้ใช้มองหาเที่ยวบินที่ตรงตามเกณฑ์ที่ระบุ
รูปที่ 2. การสั่งซื้อเที่ยวบิน: ถัดไปผู้ใช้สั่งเที่ยวบินขาออกและเที่ยวบินกลับ คำสั่งซื้อทั้งสองประสบความสำเร็จหรือล้มเหลว
เว็บแอปพลิเคชันที่เรียบง่ายนี้มี servlets หลายรูปแบบบริการและเลเยอร์ DAO (ดูรูปที่ 3)
ข้อกังวลเกี่ยวกับการตัดข้ามเช่นการกำหนดค่าทรัพยากรการจัดการความปลอดภัยและการจัดการธุรกรรมจะได้รับการจัดเตรียมโดยด้าน (นำไปใช้กับ APISIONSJ 1.5 M3) เพื่อใช้พฤติกรรมการฉีดที่ประกาศไว้ในคำอธิบายประกอบ Java 5
รูปที่ 3. สถาปัตยกรรมระบบการสั่งซื้อเที่ยวบิน: ระบบการสั่งซื้อเที่ยวบินนี้ประกอบด้วยสามองค์ประกอบหลัก - พวกเขาเข้าร่วมเพื่อขอคำขอของผู้ใช้ 3. การฉีดทรัพยากร
การประกาศร่าง EJB 3.0 อนุญาตให้มีการประกาศทรัพยากรผ่านคำอธิบายประกอบ @Resource (การตัดสินใจนี้กำหนดไว้ในการประกาศคำอธิบายประกอบสามัญฉบับร่าง) และฉีดเข้าไปใน EJB ของคุณโดยคอนเทนเนอร์ การฉีดขึ้นอยู่กับการพึ่งพาเป็นเทคนิค - การใช้เทคนิคนี้เอนทิตีนอกวัตถุแทนที่จะเป็นเอนทิตีที่สร้างขึ้นอย่างชัดเจนสำหรับวัตถุนั้นสามารถให้ (ฉีด) การพึ่งพาของวัตถุ บางครั้งมันถูกอธิบายว่าเป็นหลักการฮอลลีวูด - เรื่องตลกเช่น "อย่าโทรหาเราเราจะโทรหาคุณ"
นำคลาส TravelAgenCyServiceImpl เป็นตัวอย่าง - เพื่อจัดเก็บข้อมูลบางอย่างอย่างต่อเนื่องคลาสนี้จำเป็นต้องค้นหาการใช้งานอินเตอร์เฟส IFLIGHTDAO ตามเนื้อผ้าสิ่งนี้สามารถทำได้ผ่านโรงงาน, ซิงเกิลตัน, ตัวระบุตำแหน่งบริการหรือโซลูชันที่กำหนดเองอื่น ๆ ในหมู่พวกเขาวิธีแก้ปัญหาที่เป็นไปได้อย่างนี้มีลักษณะเช่นนี้:
Public Class Travelagencyserviceimpl ใช้ ittravelagencyservice
-
สาธารณะ iflightdao Flightdao;
Public Travelagencyserviceimpl ()
{Flightdao = FlightDaofactory.getInstance (). getflightdao ();
Public Void Booktrip (Long Outboundflightid, Long Returnflightid, Int Seats)
โยน conalidseatsexception
-
เขตสงวน (outboundflightid, ที่นั่ง);
เงินสำรอง (returnflightid, ที่นั่ง);
-
-
คุณได้เห็นแล้วว่าการใช้งานนี้เกี่ยวข้องกับการสร้างคลาสโรงงานที่เฉพาะเจาะจง - มีแนวโน้มที่จะอ่านข้อมูลการกำหนดค่าที่เก็บไว้ที่ใดที่หนึ่งเพื่อทำความเข้าใจว่าการใช้งานเพื่อสร้าง iflightdao จะถูกสร้างขึ้นอย่างไร หากบริการไม่ได้สร้างการพึ่งพาของคอนเทนเนอร์อย่างชัดเจนรายละเอียดการกำหนดค่าและการสร้างวัตถุจะถูกส่งไปยังคอนเทนเนอร์ สิ่งนี้ช่วยให้ส่วนประกอบในแอปพลิเคชันเชื่อมต่อได้อย่างง่ายดายด้วยการกำหนดค่าที่แตกต่างกันและกำจัดซิงเกิลและรหัสโรงงานที่ล้าสมัยจำนวนมาก
การใช้งานชั้นเรียน - ซึ่งอาศัยการใช้งาน iFlightdao ที่ประกาศด้วยคำอธิบายประกอบทรัพยากร JSR 250 - อาจมีลักษณะเช่นนี้:
Public Class Travelagencyserviceimpl ใช้ ittravelagencyservice
-
@Resource (name = "Flightdao")
สาธารณะ iflightdao Flightdao;
Public Void Booktrip (Long Outboundflightid, Long Returnflightid, Int Seats)
โยน conalidseatsexception
-
เขตสงวน (outboundflightid, ที่นั่ง);
เงินสำรอง (returnflightid, ที่นั่ง);
-
-
ในกรณีนี้คอนเทนเนอร์จะให้การใช้งานที่ถูกต้องของทรัพยากรที่ชื่อว่า "Flightdao" ไปยังคลาสบริการ แต่ถ้าคุณต้องการใช้ประโยชน์จากการฉีดทรัพยากรตอนนี้แทนที่จะรอการเปิดตัว EJB 3.0 ตกลงคุณสามารถใช้ภาชนะที่มีน้ำหนักเบา - สามารถให้การฉีดพึ่งพาได้เช่นสปริงหรือคอนเทนเนอร์ PICO อย่างไรก็ตามฉันไม่เข้าใจว่ามีคอนเทนเนอร์ที่มีน้ำหนักเบา - มันสามารถใช้คำอธิบายประกอบทรัพยากร JSR 250 เพื่อระบุข้อกำหนดการฉีด (แม้ว่าฉันจะรอคอยบางอย่างในเรื่องนี้)
ทางออกหนึ่งคือการใช้แง่มุมต่าง ๆ เพื่อใช้การฉีดพึ่งพา หากคุณใช้คำอธิบายประกอบ @Resource สำหรับสิ่งนี้การใช้งานของคุณจะสอดคล้องกับวิธี EJB 3.0 และเข้ากันได้กับการใช้งาน EJB 3.0 - และนั่นไม่ใช่เรื่องยากที่จะนำไปใช้ รายการต่อไปนี้แสดงแง่มุมที่สร้างขึ้นด้วย APISICEJ - มันฉีดฟิลด์ที่มีคำอธิบายประกอบด้วยคำอธิบายประกอบ @Resource:
@ด้าน
การฉีดเข้าชั้นเรียนสาธารณะ
-
Private PredencyManager Manager = New PredencyManager ();
@Before ("รับ (@Resource * *. *)")
โมฆะสาธารณะก่อนหน้านี้
โยน islendalargumentException, unglecalaraccessexception
-
Signature Fieldsignature = (FieldSignature) นี่ joinpoint.getSignature ();
หัวฉีดทรัพยากร = signature.getField (). getannotation (resource.class);
การพึ่งพาวัตถุ = manager.resolve การพึ่งพา (Signature.getFieldType (), injectannotation.name ());
Signature.getField (). set (thisJoinPoint.This (), การพึ่งพา);
-
-
แง่มุมง่าย ๆ ทั้งหมดนี้คือการสืบค้นคลาสการใช้งานจากไฟล์คุณสมบัติ (ตรรกะนี้ถูกห่อหุ้มในวัตถุพึ่งพาแมนเกอร์) และฉีดเข้าไปในฟิลด์ที่มีคำอธิบายประกอบด้วยคำอธิบายประกอบ @Resource ก่อนที่จะเข้าถึงฟิลด์ เห็นได้ชัดว่าการใช้งานนี้ยังไม่สมบูรณ์ แต่มันแสดงให้เห็นว่าคุณสามารถให้การฉีดทรัพยากรในวิธี JSR 250 ที่เข้ากันได้โดยไม่ต้อง EJB
4. ความปลอดภัย
นอกเหนือจากการฉีดทรัพยากรแล้ว JSR 250 และ EJB 3.0 ยังให้การเป็นตัวแทนที่ปลอดภัยของข้อมูลเมตาผ่านคำอธิบายประกอบ Javax.annotation.Security Package กำหนดคำอธิบายประกอบห้ารายการ - Runas, Rolesallowed, Permitall, Denyall และ Rolesreferenced - ทั้งหมดนี้สามารถนำไปใช้กับวิธีการเพื่อกำหนดข้อกำหนดด้านความปลอดภัย ตัวอย่างเช่นหากคุณต้องการประกาศว่าวิธีการ Bookflight ที่ระบุไว้ข้างต้นสามารถดำเนินการได้โดยผู้โทรด้วยบทบาท "ผู้ใช้" คุณสามารถใส่หมายเหตุวิธีนี้ด้วยข้อ จำกัด ด้านความปลอดภัยต่อไปนี้:
Public Class Travelagencyserviceimpl ใช้ ittravelagencyservice
-
@Resource (name = "Flightdao")
สาธารณะ iflightdao Flightdao;
@Rolesallowed ("ผู้ใช้")
Public Void Booktrip (Long Outboundflightid, Long Returnflightid, Int Seats)
โยน conalidseatsexception
-
เขตสงวน (outboundflightid, ที่นั่ง);
เงินสำรอง (returnflightid, ที่นั่ง);
-
-
คำอธิบายประกอบนี้จะระบุว่าคอนเทนเนอร์มีหน้าที่รับผิดชอบในการตรวจสอบให้แน่ใจว่ามีเพียงผู้โทรของบทบาทที่ระบุเท่านั้นที่สามารถดำเนินการวิธีนี้ได้ ดังนั้นตอนนี้ฉันจะแสดงอีกแง่มุมหนึ่ง - มันจะเสริมสร้างข้อ จำกัด ด้านความปลอดภัยในแอปพลิเคชัน:
@ด้าน
ความปลอดภัยระดับสาธารณะ
-
@Around ("Execution (@javax.annotation.security.Rolesallowed * *. *(.. ))")
วัตถุสาธารณะรอบ ๆ วิธีการ (ดำเนินการ joinpoint joinpoint)
โยนทิ้งได้
-
บูลีน callerauthorized = false;
Rolesallowed Rolesallowed = RolesallowedForJoinPoint (joinpoint);
สำหรับ (บทบาทสตริง: rolesallowed.value ())
-
if (callerinrole (บทบาท))
{callerauthorized = true;
-
ถ้า (callerauthorized)
{return thisjoinpoint.proceed ();
อื่น
-
โยน runtimeException ใหม่ ("ผู้โทรไม่ได้รับอนุญาตให้ทำฟังก์ชั่นที่ระบุ");
-
-
บทบาทส่วนตัวบทบาทที่อนุญาต
-
MethodSignature MethodSignature = (MethodSignature) thisjoinpoint.getSignature ();
Method TargetMethod = methodSignature.getMethod ();
Return TargetMethod.getAnnotation (rolesallowed.class);
-
CallerInrole บูลีนส่วนตัว (บทบาทสตริง)
-
-
แง่มุมนี้รวมถึงการดำเนินการของวิธีการทั้งหมด - โดยการตรวจสอบว่าผู้โทรเป็นหนึ่งในบทบาทที่ระบุไว้ในคำอธิบายประกอบคำอธิบายประกอบด้วยคำอธิบายประกอบ @Rolesallowed และทำให้มั่นใจว่าผู้โทรได้รับอนุญาตให้เรียกวิธีการ แน่นอนว่าคุณสามารถใช้อัลกอริทึมใด ๆ ที่คุณต้องการอนุญาตให้ผู้ใช้และดึงบทบาทของเขา/เธอเช่น JAAS หรือโซลูชันที่กำหนดเอง ในโปรแกรมตัวอย่างนี้เพื่อความสะดวกฉันเลือกพร็อกซีไปยังคอนเทนเนอร์ Servlet
V. กิจการ
การทำธุรกรรมกลายเป็นส่วนสำคัญของการพัฒนาองค์กร - เพราะพวกเขาอำนวยความสะดวกในการรวมข้อมูลในสภาพแวดล้อมที่เกิดขึ้นพร้อมกัน จากระดับสูงการทำธุรกรรมสามารถรับรองสิ่งนี้ผ่านการดำเนินการหลายอย่างหรือไม่สมบูรณ์หรือไม่สมบูรณ์
ซึ่งแตกต่างจากคำอธิบายประกอบสำหรับการฉีดทรัพยากรและความปลอดภัยคำอธิบายประกอบสำหรับการทำธุรกรรมนั้นมีความเฉพาะเจาะจงกับ EJB 3.0 และไม่ได้กำหนดไว้ในคำอธิบายประกอบปกติของ JSR 250 EJB 3.0 กำหนดสองคำอธิบายประกอบที่เกี่ยวข้องกับการทำธุรกรรม: TransactionManagement และ TransactionAttribute TransactionManager Annotation ระบุว่าการทำธุรกรรมได้รับการจัดการโดยคอนเทนเนอร์หรือโดยถั่ว ใน EJB 3 หากไม่ได้ระบุคำอธิบายประกอบนี้ธุรกรรมที่จัดการโดยคอนเทนเนอร์จะถูกนำมาใช้ TransactionAttribute Annotation ใช้เพื่อระบุระดับการแพร่กระจายการทำธุรกรรมของวิธีการ ค่าที่ถูกต้อง - รวมถึงบังคับ, จำเป็น, จำเป็น, ใหม่, สนับสนุน, ไม่ได้รับการสนับสนุนและไม่เคยรองรับ - ถูกนำมาใช้เพื่อกำหนดว่าจำเป็นต้องมีการทำธุรกรรมที่มีอยู่หรือไม่หรือการทำธุรกรรมใหม่จะเริ่มขึ้น ฯลฯ
เนื่องจากการดำเนินการของ Bookflight ประกอบด้วยสองขั้นตอน - สั่งเที่ยวบินขาออกและเที่ยวบินกลับโดยการบรรจุลงในการทำธุรกรรมคุณสามารถมั่นใจได้ว่าการดำเนินการที่สอดคล้องกัน โดยใช้คำอธิบายประกอบการทำธุรกรรม EJB 3.0 สิ่งนี้จะมีลักษณะเช่นนี้:
Public Class Travelagencyserviceimpl ใช้ ittravelagencyservice
-
@Resource (name = "Flightdao")
สาธารณะ iflightdao Flightdao;
@Rolesallowed ("ผู้ใช้")
@TransActionAttribute (TransactionAtTributeType.Required)
Public Void Booktrip (Long Outboundflightid, Long Returnflightid, Int Seats)
โยน conalidseatsexception
-
เขตสงวน (outboundflightid, ที่นั่ง);
เงินสำรอง (returnflightid, ที่นั่ง);
-
-
และคุณสามารถใช้แง่มุมที่ง่ายในการกำหนดขอบเขตการทำธุรกรรมโดยอัตโนมัติ:
@ด้าน
การทำธุรกรรมระดับสาธารณะ
-
@PointCut ("Execution (@javax.ejb.TransactionAttribute * *. *(.. ))")
โมฆะสาธารณะ TransactionalMethods () {}
@Before ("TransactionalMethods ()")
โมฆะสาธารณะ beforetransactionalMethods ()
{hibernateutil.beginTransaction ();
@afterreturning ("TransactionalMethods ()")
โมฆะสาธารณะ AfterreturningTransactionalMethods ()
{Hibernateutil.CommitTransaction ();
@afterthrowing ("TransactionalMethods ()")
โมฆะสาธารณะหลังจาก ThrowingTransactionalMethods ()
{hibernateutil.rollbacktransaction ();
-
การใช้งานนี้ขึ้นอยู่กับข้อสันนิษฐานว่ารูปแบบการจำศีลและรูปแบบเธรดท้องถิ่นที่แพร่หลายใช้ในการจัดการเซสชันไฮเบอร์เนตและวัตถุธุรกรรม
6. สรุป
ด้วยการใช้ชุดคำอธิบายประกอบ EJB 3.0 และ JSR 250 บทความนี้แสดงให้เห็นว่าข้อกังวลข้ามการตัดเช่นการจัดการทรัพยากรความปลอดภัยและการทำธุรกรรมนั้นถูกนำไปใช้เป็นแง่มุมอย่างไร แน่นอนว่ามีเนื้อหาอื่น ๆ อีกมากมายที่เราต้องเรียนรู้เพิ่มเติม สิ่งแรกที่ต้องเรียนรู้คือพิมพ์เขียวที่จัดทำโดยข้อกังวลข้ามการตัดแบบแยกส่วนโดยการใช้ตัวอย่างตัวอย่างเหล่านี้โดยใช้ AspectJ ประการที่สองเราได้เห็นแนวคิดและแนวคิดใหม่ ๆ ที่อยู่เบื้องหลังคำสั่ง EJB 3.0 ที่กำลังเกิดขึ้นในขณะนี้ ในที่สุดเราก็เห็นด้วยวิธีที่น่าทึ่งอิสระที่จะต้องจัดเตรียมไว้เพื่อแยกวัตถุธุรกิจของเราจาก EJB API ณ จุดนี้สิ่งที่คุณต้องการทำให้ TravelAgenCyServiceImpl เซสชันไร้สัญชาติคือการเพิ่มหมายเหตุสุดท้าย:
@stateful
Public Class Travelagencyserviceimpl ใช้ ittravelagencyservice
-
ในที่สุดฉันหวังว่าวิธีการฟรีนี้ในการให้บริการองค์กรจะนำการแข่งขันและนวัตกรรมในอุตสาหกรรมเฟรมเวิร์ก/คอนเทนเนอร์