Wednesday, November 09, 2005

Spring 's Configuration file with Jacn

ปัจจุบันผมใช้ Spring framework
เป็น container หลักในการพัฒนา Application
แต่มีปัญหาหนึ่งที่กวนใจอยู่บ้าง
ก็คือ configuration file ของ spring
ซึ่งประเด็นปัญหาที่กวนใจก็คือ
  • การอ่าน xml file
    ถ้าใครเคยเปิด config file ที่ตัวใหญ่ๆดู
    จะรู้ว่ามันลายตาขนาดไหน มีแต่คำว่า bean เต็มไปหมด
  • การ edit xml file
    เรื่องสะกดผิด เป็นเรื่องปกติ
    ซึ่งต้อง run ก่อนจึงจะเห็น stack trace ที่เกิดขึ้น


ใน post นี้จะพูดถึงกรณีที่ 2 เพียงอย่างเดียวก่อน
solution ที่มักใช้กันสำหรับปัญหานี้ก็คือ
Spring IDE
ซึ่งก็ใช้ได้ดีที่เดียว เพียงแต่มีข้อจำกัดว่า project เราต้องใช้ Eclipse ในการพัฒนา

solution อีกอันหนึ่งสำหรับประเด็นปัญหานี้ก็คือ
Jacn (ไม่รู้ย่อมาจากอะไร)
ซึ่งเปลี่ยนจากการ config ด้วย xml file
ไปเป็นการ config ด้วย java file แทน

ลองดูตัวอย่าง config file
กรณีใช้ xml file
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="messageSvr" class="test.MessageImpl"/>

<bean id="greeting" class="test.Greeting">
<property name="messageSvr" ref="messageSvr"/>
</bean>
</beans>


กรณีใช้ Jacl
package test;

import bran.spring.jacn.AbstractJacnConfigFile;

public class Beans extends AbstractJacnConfigFile {

static Greeting greeting;
static MessageImpl messageImpl;

public void wire() throws Exception {
greeting.setMessageSvr(messageImpl);
}

}


เวลาเรียกใช้งาน ApplicationContext
เราจะเรียกใช้ผ่านทาง bran.spring.jacn.JacnApplicationContext แทน
ตามตัวอย่างนี้
public class TestJacn extends TestCase {

ApplicationContext context;

protected void setUp() throws Exception {
context = new JacnApplicationContext(test.Beans.class);
}

public void test() {
Greeting greeting = (Greeting) context.getBean("greeting");
assertEquals("hello world", greeting.getMessage());
}

}


ข้อดีสำหรับ Jacn ก็คือ แทนที่จะเขียน xml โดยตรง เราก็เปลี่ยนมา
เขียน java แทน ซึ่งทำให้เราสามารถใช้ feature code completion
เข้ามาช่วยเขียน รวมทั้งใช้ javac ช่วยในการตรวจสอบ validation ได้ด้วย

การทำงานภายในของ Jacn ที่น่าสนใจก็คือ
คนเขียนเขาใช้วิธีการแปลง class file ที่เราเขียน ให้เป็น DOM
ซึ่งอยู่ในรูปแบบเดียวกับที่ spring ใช้ในอ่าน xml file
เมื่อได้ DOM มาแล้วก็ค่อยส่งต่อให้ spring เป็นผู้ resolve และทำ dependency injection ต่อไป

ส่วนวิธีการที่ใช้ implement การแปลง class file ไปเป็น DOM นั้น
เขาใช้ ASM เข้ามาช่วยทำ โดย Implement ClassVisitor ขึ้นมา

Related link from Roti

No comments: