Posts Tagged ‘spring’

I’m EJB3

April 10th, 2010

ไม่มี ejbs66 เลยต้องเอามาลง Spring66 ในฐานะที่เป็นคู่แข่งกันทั้งทางตรงและทางอ้อมครับ สำหรับ Spring และ EJBs

หลังจาก EJB 3.0 ออกมาให้ใช้งานและเป็นส่วนหนึ่งของ JavaEE 5 เมื่อปี 2006 เมื่อปลายปีที่แล้ว (2009) EJB 3.1 ได้ออก Final specification โดยที่เป้าหมายหลักของ EJB 3.1 ทำให้การใช้งาน EJBs นั้นทำได้ง่ายขึ้นเท่าที่จะทำได้ และได้เพิ่มความสามารถที่หน้าสนใจเข้าหมายหลายอย่างเช่น
» Read more: I’m EJB3

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

July 30th, 2009

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

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

มาดูกันว่า Spring สร้างอะไรให้บ้าง ถ้าเทียบกับการเขียน XML ก็ตามนี้เลย ไปแกะ BeanDefinitionParser ออกมา

 <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 แทน

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

July 28th, 2009

เริ่มแรกดูการคอนฟิก 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" />

ข้อดีของการใช้งานสปริงในมุมมองของการทำ ORM

June 1st, 2009

แปลมากจากเอกสาร Spring Ref Manual

ข้อดีของการใช้งานสปริงในมุมมองของการทำ ORM คือ

ทดสอบได้ง่ายมาก: เนื่องจากด้วยแนวคิดพื้นฐานเรื่อง IoC ทำให้เราสามาระสลับการเข้าถึงฐานข้อมูลได้ง่ายมากระหว่างระบบที่ใช้ทดสอบและระบบที่ใช้งานจริงเช่นเราสามารถสลับคอนฟิกของ Hibernate SessionFatory, JDBC DataSource, Transaction Manager และแมปปิ้งออบเจค ได้งายมากๆ สิ่งนี้ทำให้เราสามารถแยกสภาพแวดล้อมการทำงานได้อย่างเด็ดขาดระหว่างการทดสอบและการใช้งานจริง

 

จัดการเรื่อง Exception ต่างๆ(ORM แต่ละตัวจะมีกระบวนการเรียงร้อยและการจัดการกับ error ที่ต่างกัน)ให้อยู่ภายใต้กลุ่มที่ชื่อ DataAccessException ทำให้เราไม่ต้องเสียเวลานั่งจัดการเรื่อง Exception ต่างๆที่จะเกิดขึ้นและสามารถจับเออร์เร่อร์ได้อย่างมีประสิทธิภาพและทำได้ที่จุดที่ถูกต้องเสมอ นอกจากนี้ JDBC exception(dialect จำเพาะเจาะจงต่างของ Database) ต่างๆนั้นก็ถูกจัดให้อยู่ภายในระบบโครงสร้างเดียวกันด้วยทำให้เราสามารถทำงานบางอย่างผ่าน JDBC ด้วยโมเดลการเขียนโปรแกรมที่ถูกและดีอย่างที่ควรจะเป็น

 

การจัดการเรื่องทรัพยากรต่างๆ โดยที่ Spring Application Context สามารถจัดการกับ Instance ของ Hibernate SessionFactory, JDBC DataSource นอกจากนี้ยังรวมไปถึง IBatis SQL Maps และทรัพยากรณ์ต่างๆที่เกี่ยวข้องอีกด้วยยกตัวอย่างเช่น ในกรณีที่โค้ดในแอพพลิเคชั่นของเราต้องใช้ Hibernate Session ร่วมกันเพื่อประสิทธิภาพในการทำงานและการจัดการ Transaction อย่างเป็นระบบซึ่ง Spring เองจะเข้ามาช่วยเราได้ด้วยการซ่อนงานที่ซับซ้อนในการสร้างและวาง Session ลงบน Thread ปัจจุบันให้กับเราด้วยการใช้ Template ที่ระดับ Java โค้ดหรือด้วยการ Expose ตัว Session ปัจจุบันผ่าน Hibernate SessionFactory (สำหรับ DAO ที่ทำงานบน Hibernate API) ดังนั้นจะเห็นได้ว่า Spring นั้นได้เข้ามาช่วยเราเรื่อง

 

การทำงานร่วมกับ Transaction Menagement ที่หลากหลายได้อย่างลงตัว เนื่องจากเราสามารถ wrap โค้ดของเราด้วยการใช้ AOP interceptor ที่ระดับเมธอดหรือการใช้ template wraper ในระดับคลาสซึ่งการกำหนดทั้งสองแบบนี้จะส่งผลให้ระบบของเราสามารถใช้งาน transaction ได้อย่างถูกต้อง(มีการทำ rollback)เมื่อเกิดเออร์เรอร์ขึ้นในจังหวะใดๆของการทำงานกับ Database และอย่างที่รู้กันว่าตัวจัดการ Transaction ใน  Java นั้นมีให้เลือกใช้หลายตัวมากตามความเหมาะสม และอีกครั้งที่ Spring สามารถช่วให้เราสามารถเปลี่ยนหรือสลับการใช้งานตัวจัดการ Transaction ได้อย่างสะดวกสบายยกตัวอย่างเช่นระหว่าง Local Transaction และ JTA นอกจากนี้ประโยชน์อีกอย่างคือโค้ดส่วนต่างๆที่เกี่ยวข้องกับ JDBC นั้นสามารถทำงานร่วมกับ Transaction ที่เราใช้สำหรับ ORM ได้ด้วยเช่นกันซึ่งสิ่งนี้จะเป็นประโยชน์มากในกรณีที่เราจำเห็นต้องทำงานบางอย่างที่ไม่เหมาะกับ O/R เช่น Batch Process, Streaming ของ BLOB