Sunday, May 06, 2007

Aspect Oriented Programming with Spring

จุดมุ่งหมาย
เพื่อทำงานทดแทน sevices ต่างใน EJB เช่น Trancsaction
ให้ผู้ใช้สามารถสร้าง aspect ของตัวเองเพื่อเติมเต็มความเป็น OOP ด้วย AOP

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 และตัวอย่างข้างบนถือเป็นตัวอย่างอย่างง่ายก่อนจะก้าวไปสู่ตัวอย่างที่ซับซ้อนมากขึ้นแต่ก่อนอื่นต้องเข้าใจถึงรากฐานของเอโอพีเสียก่อน

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

Wednesday, April 20, 2005

มาลองใช้ตามเค้า

เพิ่งมีบล๊อกเป็นของตัวเองครับ
เมื่อหลายปีก่อนการพัฒนาเวบแอพพลิเคชั่นด้วย Servlet/JSP อาจเป็นเรื่องที่ยุ่งยากเพราะเฟรมเวิร์คต่างๆยังไม่มีให้ใช้งานมากนักเท่าที่มีในขณะนั้นก็ยังไม่มีความสามารถพิเศษใดๆเหนือไปกว่าเฟรมเวิร์คปกติ ดังนั้นปรัชญาในการทำงานของนักพัฒนาจึงเอนเอียงไปในทางของ "ทำยังไงก็ได้ให้เสร็จทันเวลา" โดยที่เขาเหล่านั้นลืมเรื่องของ "การทำให้ถูกต้องไป" แต่ปัจจุบันนี้เฟรมเวิร์คต่างๆเหล่านั้นได้ถกพัฒนาจนมีความสามารถที่ช่วยให้พัฒนาแอพพลิเคชั่นได้ง่ายขึ้นเช่น การอำนวยความสะดวกเรื่องการตกแต่งความสวยงาม การทำมีกลไกการทำการตรวจสอบข้อมูล การตรวจจับข้อผิดพลาด การอัพโหลดไฟล์ หรือแม้กระทั่งการการดักจับรีเควสในขณะทำงาน
สปริงหนึ่งในเวบเฟรมเวิร์คสนับสนุนคุณสมบัติทุกอย่างที่กล่าวมาข้างต้นโดยเนื้อหาในบทนี้จะกล่าวถึงการประยุกต์ใช้คุณสมบัติเหล่านี้ไม่ว่าจะเป็นการตรวจสอบข้อมูลด้วย Struts Validation เฟรมเวิร์คหรือ Common Validation การตบแต่งแอพพลิเคชั่นด้วย SiteMesh และ Tile และเนื้อหายังครอบครุมเรื่องการตรวจสอบข้อผิดพลาดการอัพโหลดไฟล์ การส่งอีเมล์ และการดักจับรีเควส
ซึ่งเหมือนกับว่าเนื้อหาในบทนี้มีมากเหลือเกินแต่ด้วยแนวคิดเรื่องการทำให้ทุกอย่างดูเรียบง่ายและง่ายต่อการเข้าใจและเนื้อหาของทุกๆคุณสมบัติยังคงอิงกับแอพพลิเคชั่น MyUser

SiteMesh
ไซท์เมสเป็นเครื่องมือในการตบแต่งเวบไซท์ของฟรีจากโปรเจคOpen Symphony โดยไซท์เมสนี้ถูกสร้างขึ้นเมื่อห้าปีก่อนโดย Joe Walnes โดยเกิดจากการดึงเอาส่วนที่ซ้ำกันบางส่วนของการพัฒนาแอพพลิเคชั่นด้วย Servlet มารวมกันเป็นเฟรมเวิร์คนี้ซึ่งลักษณะการทำงานโดยรวมจะเหมือนกับการทำสกินให้กับเวบแอพพลิเคชั่นซึ่งประโยชน์ของการทำสกินก็คือถ้าต้องการเปลี่ยนแปลงลักษณธของไซท์ก็สามารถทำได้ด้วยการเปลี่ยนที่ไฟล์สองถึงสามไฟล์ลักษณธทั้งหมดก็จะเปลี่ยนไปทั้งหมด
Installation
ตัวอย่างจากบทที่สี่ได้ใช้งาน sitemesh อยู่เรียบร้อยแล้วแต่ถ้าต้องการเริ่มต้นใช้งานตั้งแต่แรกก็ให้ดาวน์โหลดตัวอย่างจากบทที่ห้าซึ่งจะเป็นตัวอย่างที่แยกเอาลูกเล่นและความสามารถที่จะกล่าวถึงในบทนี้ออกไปหมด
โน๊ต
ผู้ใช้อาจต้องคัดลอก myusers-ch5 ไปยัง myusers-tiles เมื่อทำการติดตั้งและปรับแต่ง Tiles

หลังจากได้แอพพลิเคชั่นมาแล้วให้ทำการเรียก ant remove , ant clean และ ant install ในขณะที่ทอมแคทยังคงทำงานอยู่ และผลที่ได้จะแสดงดังรูปเมื่อทำการเรียก http://localhost:8080/myusers จะเห็นได้ว่าผลที่ได้จะแตกต่างกับบทที่ผ่านๆมา

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

Subscribe to Posts [Atom]