Sunday, August 07, 2005

Spring AOP

ภาพรวม

เรื่องราวเกี่ยวกับ เอโอพี แท้ที่จริงแล้วเป็นที่ได้รับความสนใจจากชุมชนผู้ใช้จาวามาเป็นเวลาสองถึงสามปีแล้วโดยถ้าติดตามแมกกาซีนหรือเวบไซต์ต่างๆเกี่ยวกับจาวา
ก็จะเห็นเรื่องราวเกี่นวกับเอโอพีมากมายนอกจากนี้ เอโอพี ยังใช้งานได้ง่ายมากขึ้นในปัจจุบันด้วยเนื่องมาจากเฟรมเวิร์กต่างๆได้สนับสนุนเรื่องเอโอพีมากขึ้น


เนื่องจากจาวาเป็นภาษาเชิงวัตถุซึ่งมึคุณสมบัติเด่นในเรื่องของการลดความซ้ำซ้อนของโค้ดด้วยการสร้างแอพพลิเคชั่นและอบบเจคต่างๆด้วยแนวคิดเรื่องรวบ
รวมความซ้ำซ้อนไว้ที่คลาสที่อยู่สูงกว่าในสาแหรกเดียวกันไฮราคี่อย่างไรก็ตามแนวคิดนี้ยังคงไม่สามารถแก้ปัญหาเรื่องของความซ้ำซ้อนของคลาสที่ไม่ได้อยู่
ในสาแหรกเดียวกันได้ บทนี้จะเป็นการนำเสนอเรื่องของการใช้เอโอพีในการพัฒนา MyUser เพื่อช่วยในเรื่องของการทำ logging, caching, transaction และ email


โดยทั่วไปแล้วแอพพลิเคชั่นสามารถแบ่งออกเป็นสองส่วนคือ คอร์คอนเซิร์นซึ่งมีความสัมพันธ์กับฟังก์ชั่นของแอพพลิเคชั่นโดยตรงและ ครอสคัททิง คอนเซิร์น ไม่ได้มีความสัมพันธ์กับคลาสหรือโมดูลใดๆโดยตรงแต่จะเกี่ยวข้องกับระบบโดยกว้างๆไปทั้งระบบซึ่งโมดูลต่างๆที่ถูกสร้างขึ้นเพื่อควบคุมครอสคัททิงคอนเซิร์น
ทั้งหลายเรียกว่า แอสเป็ก ซึ่งก็คือที่มาของคำว่า แอสเป็กโอเรียนเท็ท


เอโอพีเป็นวิธีที่ใช้จัดการเรื่องครอสคัททิงคอนเซิร์นที่เรียบง่ายเพื่อดึงเอาสิ่งเหล่านี้ออกจากคลาสและดึงเอามาเป็นคอนเซิร์นระดับแอพพลิเคชั่นเช่น Logging, transaction และเอโอพีก็ถือเป็นจุดเด่นของสปริงอีกหนึ่งข้อคือ สปริง ได้เตรียมการใช้งานเอโอพีไว้ใหแล้ว

ในมุมมองของสปริงเรื่องเอโอพีจะถูกกำหนดให้ทำงานเป็นตัวดักจับ (Interceptor) เพื่อจับตาการเรียกใช้งานเมธอดต่างๆในโปรแกรมและตลอดช่วงของการเฝ้าดูนั้นตัวดักจับสามารถทำงานได้หลายๆอย่างเช่น Logging , ทำการดัดแปลงออบเจคที่จะถูกรีเทิร์นหรือการส่งสัญญาณต่างๆไปที่คลาสอื่นๆ อีกตัวอย่างของเอโอพีในสปริงคือ เซิร์ฟเล็ทฟิวเตอร์ ที่สามารถที่จะทำงานทั้งก่อนและหลังการทำงานของเซิร์ฟเล็ทเป้าหมายในขณะที่ถูกเรียกใช้

ในกลุ่มคนใช้จาวาได้ให้คำนิยามสั้นๆเกี่ยวกับหัวใจของเอโอพีว่า ปัจจัยต่างๆที่จะถูกใส่ลงไปในเอพีก็คือสิ่งที่สามารถตัดออกไปได้โดยที่แอพพลิเคชั่นยังสามารถอยู่ได้ หรืออีกนัยหนึ่งก็คือในเมธอดใดๆก็ตามในแอพพลิเคชั่นควรจะบรรจุไว้เฉพาะสิ่งที่ควรจะมีอยู่เท่านั้นเช่นการคำนวณทางธุรกิจ และสิ่งต่างๆที่ถูกตัดออกไปก็ไม่ได้ถูกซ่อนไว้อย่างเล้นลับยากแก่การค้นหาเพราะค่าต่างๆเหล่านั้นจะถูกอธิบายไว้ใน เอ็กซ์เอ็มแอล ไฟล์เหมือนกับการเก็บแผนภาพการทำงานของระบบที่มีเอโอพีเพื่อให้ใครก็ตามที่ไม่รู้หหรือเพิ่งมีส่วนร่วมในโปรเจคสามารถติดตามหารทำงานได้อย่างถูกต้อง

เอโอพีช่วยการทำงานในส่วนของการซ่อนหรือจัดลำดับของการมองเห็นว่าสิ่งใดควรเห็นหรือสิ่งใดไม่ควรเห็นเช่นเรื่องของการจัดการทรานแซคชั่นที่ควรถูกจัดการโดย
สปริงแทนที่จะถูกฝังไว้อย่างกระจัดกระจายในแอพพลิเคชั่นเพื่อให้ทุกๆคนมองเห็น เพื่อให้เกิดประโยชน์ในหลายๆด้านเช่นการซ่อนส่วนที่ยุ่งยากในการเข้าใจไม่ให้นักพัฒนามือใหม่มองเห็นในโค้ดเพื่อให้เกิดความง่ายในการเรียนรู้


เริ่มต้น

ในบทนี้การเรียนรู้จะเหมือนกับบทก่อนๆคือการเรียนจาการลงมือทำโดยจะทารปรับปรุงโค้ดจากบทก่อนด้วยการประสานรวมกับเอโอพีโดยจะเริ่มจาก
การทำล็อกกิ้งเป็นเรื่องแรก


ตัวอย่างการทำล๊อกกิ้ง

บทความต่างๆเกี่ยวกับเอโอพีมักจะเริ่มจากการยกตัวอย่างการใช้เอโอพีในการทำล็อกกิ้งเพื่อทำการดีบักโปรแกรมเพื่อการดูข้อความล็อกทั้งก่อนและหลังการเรียกใช้เมธอด ซึ่งสปริงสามารถทำเรื่องนี้ได้ง่ายมากโดยเพียงแค่เขียนเอ็กเอ็มแอลเพิ่มเท่านั้นเอง

โน๊ต

การที่จะทำการเพิ่มอินเตอร์เซ็บเตอร์เข้าไปในบีนใดๆก็ตามบีนนั้นจะต้องถูกดัดแปลงให้เป็น พร๊อกซี่ คลาสเสียก่อน ซึ่งเจดีเคไดนามิกพรอกซี่สามารถสร้างการทำรายละเอียดอินเตอร์เฟส(implement interface)ได้ขณะทำงาน ซึ่งในส่วนด้านล่างจะคลอบคลุมการใช้งานเอโอพีในหลายๆแบบภายหลังเรื่องล็อกกิ้ง

สปริงถูกปล่อยออกมาพร้อมกับ แทรซอินเตอร์เซ็บเตอร์ (TraceInterceptor) ซึ่งสามารถถูกเพิ่มเข้าไปในพรอกซี่บีนตัวใดๆก็ได้ ซึ่งในแอพพลิเคชั่น MyUser คลาส userManager นั้นเป็นพรอกซี่อยู่แล้วการเพิ่มอินเตอร์เซ็บเตอร์จึงเป็นเรื่องง่ายๆดังนี้

1. เปิดไฟล์ applicationContext.xml ในไดเรคทอรี่ web/WEB-INF และเพิ่ม loggingInterceptor บีนดังนี้

2. เพิ่ม preInterceptors ให้กับ userManager บีน

3. เพิ่ม logger ให้กับ /web/WEB-INF/classes/log4j.xml เพื่อแสดงผลที่ได้จาก TraceInterceptor

4. เรียก ant test –Dtestcase=UserManagerTest ซึ่งผลที่ได้จะได้ดังนี้

คลาส TraceInterceptor ยังมีอินเตอร์เซบเตอร์ตัวอื่นๆอีกโดยจะบรรจุอยู่ที่ org.springframwqork.aop.interceptor และตัวอย่างข้างบนถือเป็นตัวอย่างอย่างง่ายก่อนจะก้าวไปสู่ตัวอย่างที่ซับซ้อนมากขึ้นแต่ก่อนอื่นต้องเข้าใจถึงรากฐานของเอโอพีเสียก่อน

เอโอพีเหมือนๆกับภาษาการเขียนโปรแกรมอื่นๆที่ต้องมีมาตรฐานการเขียนเป็นของตัวเองตารางด้านล่างจะแสดงถึงคำและวลีที่จำเป็นในการทำงานกับเอโอพี
Comments: Post a Comment

Subscribe to Post Comments [Atom]





<< Home

This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]