spring-javaconfig: Spring configuration แบบไม่มี XML (อย่างง่ายๆ)


 

โดยแรงบรรดาลใจจาก 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/

 

 

 

 

 

 

 

หมายเลขบันทึก: 111426เขียนเมื่อ 14 กรกฎาคม 2007 03:07 น. ()แก้ไขเมื่อ 22 มิถุนายน 2012 11:49 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท