โดยแรงบรรดาลใจจาก blog ของพี่ pok[1] และอ่าน [2] เพิ่ม. ผมก็เลยมาลอง spring-javaconfig บ้าง. (คือใช้ java code + annotation มา สร้าง configuration แทน xml.)
ตัวอย่างง่ายมากคือมี interface ชื่อ NamePrinter ซึ่งจะพิมพ์ชื่อออกมา. เป้าหมายคือจะสร้าง bean ตาม interface นี้แล้วก็ใช้ spring inject ชื่อเข้าไปให้ bean โดย bean นี้จะใช้ class ItsNamePrinter ผมว่าเป็นตัวอย่างที่ไม่ได้มีความสมเหตุสมผลอะไรเลย แต่ก็ง่ายและสั้นดี. :-P
NamePrinter:
package org.kunyit.spring21ex1;
public interface NamePrinter {
void printName();
}
ItsNamePriter:
package org.kunyit.spring21ex1;
public class ItsNamePrinter implements NamePrinter {
String name;
public void setName(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
Ex1Config เป็น configuration ที่แต่ก่อนต้องเขียนด้วย XML แบบที่ comment ไว้. ตอนนี้ก็ใช้ annotation ได้แก่ @Bean กับ @Configuration แทนได้เลย อันนี้ก็ตรงไปตรงมา.
Ex1Config:
package org.kunyit.spring21ex1;
import org.springframework.config.java.annotation.Bean;
import org.springframework.config.java.annotation.Configuration;
//<beans>
//<bean id="namePrinter" class="org.kunyit.spring21ex1.ItsNamePrinter">
// <property name="name" value="FSF"/>
//<bean>
//</beans>
@Configuration
public class Ex1Config {
@Bean
public NamePrinter namePrinter() {
ItsNamePrinter printer = new ItsNamePrinter();
printer.setName("FSF");
return printer;
}
}
ส่วนอันนี้ก็จะเรียก bean จาก context ออกมา มี class ใหม่ที่ผมพึ่งรู้จัก 1 คลาสคือ AnnotationApplicationContext ใน constructor เข้าใจว่ารับ string นะครับ อย่างตัวอย่างนี้ถ้าพิมพ์เอง คงจะเป็น org/kunyit/spring21ex1/Ex1Config.class แต่ใช้ .class.getName() ที่ลอกเขามาดีกว่า จะได้ไม่ลำบากตอน refactor
App.java:
package org.kunyit.spring21ex1;
import org.springframework.config.java.context.AnnotationApplicationContext;
import org.springframework.context.ApplicationContext;
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationApplicationContext(Ex1Config.class.getName());
NamePrinter namePrinter = (NamePrinter)ctx.getBean("namePrinter");
namePrinter.printName();
}
}
มี pom.xml อีกนิดไว้ใช้กับ maven สะดวกดี ปวดหัวเรื่อง jar น้อยไปเยอะ คล้ายๆ python eggs หรือ ruby gems เลย. (แต่ชื่อค่าย java ตั้งไม่ค่อยน่ารักอะ เกี่ยวมะ?)
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.kunyit.spring21ex1</groupId>
<artifactId>spring21ex1</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>spring21ex1</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>SpringFramework Snapshots</id>
<url>
https://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-snapshots
</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-javaconfig</artifactId>
<version>1.0-m2</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.3</version>
</dependency>
</dependencies>
</project>
มันยังไม่จบง่ายเพราะ pom.xml ของ spring-javaconfig ของ version 1.0-m1 นี่เหมือนจะไปใส่ groupid ของ aopalliance มาไม่เหมือนใน repository หลักของ svn. (แต่ใน svn trunk เห็นแก้เรียบร้อยแล้ว เลยไม่ได้รายงาน bug) เราก็หา aopalliance-1.0.jar มาไว้ในเครื่องแล้ว install เอง ด้วยคำสั่งประมาณข้างล่าง เพียงแต่แก้ path สักหน่อย.
mvn install:install-file -DgroupId=org.aopalliance -DartifactId=aopalliance -Dversion=1.0 -Dpackaging=jar -Dfile=/some/path/aopalliance-1.0.jar
เป้าหมายต่อไปก็อยู่ที่ว่าจะเอา AnnotationApplicationContext ไปใช้กับ MVC อย่างไร แต่ก็ค่อยดูไปเอาที่ละด่านละกัน.
ถ้าอยากเล่นแต่ไม่อยากพิมพ์ก็โหลดไฟล์ไปลองได้เลย http://gotoknow.org/file/vsatayamas/view/92458
ป.ล. pom.xml เป็นไฟล์ของ Maven ต้องชื่อนี้นะครับ (ผมเปล่าตั้งเอง)
[1] http://pphetra.blogspot.com/2007/06/spring-configuration.html
[2] http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/
ไม่มีความเห็น