วันอังคารที่ 28 กรกฎาคม พ.ศ. 2552

ขอบคุณผู้เก็บมือถือผมไว้

ไม่รู้ว่าผู้มีพระคุณจะได้อ่านไหมแต่อยากบอกขอบคุณมากๆครับ

เรื่องก็มีอยู่ว่าผมขึ้นรถกระป๋องสาย 70 เข้าประชาอุทิศ ผมไปลงบ้านสวนธนอยู่แถวๆซอยพุทธบูชา 42
ลงรถมาก็เดินมาหน่อยได้ยินเสียงเหมือนของตกหันกลับไปดูก็ไม่เจออะไร คิดในใจเสียงเหมือนโทรศัพท์เราตกรึเปล่า คลำกระเป๋าดูจริงๆด้วย ส่วนเสียงที่ได้ยินก็ไม่รู้เพราะใครบรรดาลใจรึเปล่า ขอบคุณสิ่งนั้นด้วยครับ
ผมก็รีบโทรเข้าไปเลยพี่เค้ารับสายแล้วบอกจะคอยอยู่ที่ปากซอยพุทธบูชา 36 ผมคิดในใจว่าค่อยยังชั่วโชคดีจัง
หลังจากนั้นก็รีบวิ่งทั้งที่สะพายเป้ใส่โน๊ตบุคกับของอย่างอื่นสักห้าหกกิโล ไปเลยวิ่งไปเรื่อยๆไม่เหนื่อยเลยแฮะไกลอยู่เหมือนกัน(เกือบกิโล) ไปเจอพี่เค้านั่งคอยอยู่ลืมบอกไปว่าพี่เค้าเป็นผู้หญิง
หลังจากได้รับโทรศัพท์ ผมจะให้สินน้ำใจพี่เค้าไว้ แต่พี่เค้าไม่รับ ผมก็ได้แต่ขอบคุณพี่เค้า ลืมถามชื่อพี่เค้าไปด้วยเลย
ยังไงก็ขอบคุณอีกครั้งครับ เงินส่วนนั้นผมจะเอาไปทำบุญให้ครับ ผมตั้งใจจะมอบให้ครับ
กลับถึงห้องอาบน้ำเสร็จขาเกร็งนิดหน่อยเลย ดีที่ไปวิ่งตอนเย็นบ่อยๆ
ขอบคุณครับ

Transaction annotation-driven แล้ว Spring สร้างอะไรให้บ้าง

การใช้งาน @Transactional จะต้องกำหนดใน Spring Context ดังนี้

<tx:annotation-driven transaction-manager="transactionManager" />

มาดูกันว่า มันสร้างอะไรให้บ้าง

<aop:aspectj-autoproxy />
<bean id="transactionAttributeSource" class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributeSource" ref="transactionAttributeSource" />
</bean>
<bean id="org.springframework.transaction.config.internalTransactionAdvisor" class="org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor">
<property name="transactionAttributeSource" ref="transactionAttributeSource" />
<property name="adviceBeanName" value="transactionInterceptor" />
</bean>

บรรทัดแรกสั่งให้ Spring ทำ auto proxy จาก Advisor ที่มีการคอนฟิกใน Spring Context
ที่ เหลือเป็นการคอนฟิก Advisor, Interceptor(เป็น Advice) และ TransactionAttributeSource ที่ทำหน้าที่ บอกว่า method ของ class ที่ถูกเรียกนี้มี TransactionAttribute ยังไง
ตัวที่บอกรายละเอียด Transaction พวก propagation, isolation, timeout ฯลฯ อยู่ที่ TransactionAttribute นี่แหละ

อันนี้เฉพาะโหมด proxy ของ annotation-driven ยังไม่ไล่โหมด aspectj แต่มันก็คือๆกันแหละแค่เปลี่ยนการทำ proxy จากใช้ Proxy ของ JDK เป็น cglib แทน

วันเสาร์ที่ 25 กรกฎาคม พ.ศ. 2552

ดูการสร้าง Bean ของ Spring JavaConfig

เริ่มแรกดูการคอนฟิก Spring Context ก่อนจากเดิมใช้ XML เป็น Java + Annotation

@Configuration
class MyConfig {
public @Bean MyBean myBean() {
new MyBean();
}
}


เพื่อให้ง่ายต่อความเข้าใจจะใช้ XML ร่วมกับ ConfigurationPostProcessor เพื่อทำ Bootstrapping JavaConfig

<beans>
<!-- first, define your individual @Configuration classes as beans -->
<bean class="myapp.MyConfig"/>

<!-- be sure to include the JavaConfig bean post-processor -->
<bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/>
</beans>

จะเห็นได้ว่ามีการกำหนด MyConfig เป็น Spring Bean ร่วมกับใช้ ConfigurationPostProcessor ซึ่งเป็น BeanFactoryPostProcessor ชนิดหนึ่ง

การสร้าง Spring Bean แบบปกติตัวที่ทำหน้าที่สร้าง Instance Bean คือ InstantiationStrategy

Spring JavaConfig ก็ใช้หลักการเดียวกัน แต่จะใช้การสร้าง bean ผ่าน Factory Method นั่นคือ MyConfig.myBean() จะทำหน้าที่เป็น Factory Method นั่นเอง หากแปลงเป็น XML จะได้ประมาณนี้

<bean id="myconfig" class="myapp.MyConfig" />
<bean id="myBean" factory-bean="myconfig" factory-method="myBean" />


ส่วนเหตุที่มานั่งไล่ Spring JavaConfig เพราะกำลังเขียน BeanDefinitionParser อยากให้ Instance ที่สร้างใน BeanDefinitionParser ด้วยการ new Object ธรรมดานี่แหละขึ้นมาเป็น Spring Bean เลยมาดูสักหน่อยว่า Spring JavaConfig ใช้วิธีไหน

วันพุธที่ 15 กรกฎาคม พ.ศ. 2552

Distribution Spring, maven repository, and SpringIDE

You can find those on "Amazon S3 Web Frontend".
Distribution Spring at dist.springframework.org, in addition, you can find SpringIDE updatesite here too.
Spring Maven repository at maven.springframework.org.
Enjoy your spring anytime.

เคยพบกับปัญหาเหล่านี้ไหม

ทำไมถึงเลือก framework ตัวนี้ นี่ไงตัวนี้เร็วกว่า หรือจะใช้ไปทำไมมันช้า?
แต่เคยมองถึงประเด็นอื่นบ้างไหม เร็วจริงแต่เวลาเขียนนรก =="
พอดีไปเจอคำตอบที่โดนใจ จากพี่ข้าวโพดหวาน อยากทราบว่า framework ตัวไหน ทำงานได้เร็วที่สุดครับ
เฟรมเวิร์คที่ช้ากว่า มีเหตุผลที่ช้ากว่า ส่วนใหญ่จะเป็นที่มันมี layer เพิ่มเพื่อ 1) ทำให้เราเขียนโปรแกรมได้ง่ายขึ้น งานเสร็จเร็วขึ้น 2) ทำให้เราบำรุงรักษาโปรแกรมได้ง่ายขึ้น 3) มีฟีเจอร์สนับสนุนมากกว่า ไม่ต้องเขียนเอง

โดยส่วนตัวผมมองถึงเรื่อง 1 Framework ไหน develop ง่าย 2 ทำ refactor ง่ายนั่นก็คือตัว framework ออกแบบสนับสนุนให้มีการเขียนโปรแกรมแบบ loosely coupling 3 โค้ดที่เขียนขึ้นกับ framework น้อย 4 scalable อย่างหลังนี่แหละที่ช่วยเรื่อง performance 5 opensource 6 มี support หรือ community ที่ดี