http://www.memestorm.com/blog/spring-components-xml-configuration-on-steroids/

<div class="note"> 알림 : 여기서 사용된 Spring 버전은 2.0 M3임을 알립니다. </div>

Spring 2.0에서 가장 중요한 기능중 하나는 편리한 기능을 제공하는 새로운 XML설정이다. 이것은 편리한 기능이라기 보다는 좀더 많은 것을 제공한다.

'예전(old)' Spring설정파일에서, 대부분의 것은 bean이었고, 당신은 다음처럼 작성했을것이다.

<bean id="foo" class="bar">
   <!-- zip zip -->
</bean>

DTD를 본다면 다음과 같을것이다.

<!ELEMENT beans (
  description?,
  (import | alias | bean)*
)>

Spring 2에서 당신은 다르게 처리할수 있다.

<mycomponent:foobar att="zip"/>

여기엔 class속성이 없다는 것을 알라. 필요한 모든 정보는 명명공간에서 제공된다. XML설정관점에서 본다면, 이것이 제공하는 것은 자체 명명공간내 bean을 획득하여 반복적인 bean정의를 피하는 것이다. Spring은 이미 정의된 많은 것을 제공한다.

 <jndi:lookup id="dataSource" jndiName="jdbc/MyDS"/>
 <tx:advice id="txAdvice">
   <tx:attributes>
     <tx:method name="insert*"/>
     <tx:method name="update*"/>
     <tx:method name="*" read-only="true"/>
   </tx:attributes>
 </tx:advice>

어쨌든, 지금 가능한 것은..

  • 설정을 간단히 할수 있다.
  • 구현을 숨길수 있다('사용자'가 볼 필요가 있는 모든것은 명명공간이다.)
  • 애플리케이션 컨텍스트로부터 JAR와 그것들에 대한 참조를 추가하여 간단히 추가할수 있는 'Spring 컴포넌트' 배포를 시작할수 있다.

뒤 두가지가 가장 멋진 기능이라고 생각한다. 그것들은 Spring개발자가 의도하는 것일뿐 아니라, 새로운 어떤것을 시도하는 것이다. 당신은 어떤 작업을 수행하는 Spring bean모두를 포함하는 간단한 JAR를 배포할수 있다. public속성을 가지는 이러한 bean을 언급하는 XML스키마를 가지고 Amazon이라는 인터페이스를 알린다면, "Spring 컴포넌트"의 어떤 사용자는 간단히 JAR파일을 설치하고 타이핑을 시작한다.

<amazon:listBooks conditionSubject='memetics' associateId='memestorm'/>

어떻게 하는가.?#

당신이 배포할수 있는 간단한 JAR파일을 만들도록 하는 당신의 컴포넌트를 묶는 방법을 보자. 배포가능한 예제를 위해 첨부된 파일(simple.jar)을 보자. WEB-INF/lib내 배치되는 예를 위해 이것이 애플리케이션의 classpath에 있다면, 당신이 할 필요가 있는것은 애플리케이션 컨텍스트내 이것을 묶는 것이다.

컴포넌트로 묶기#

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:memestorm=”http://www.memestorm.com/schema/simple”
    xsi:schemaLocation=”http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.memestorm.com/schema/simple
     http://www.memestorm.com/schema/simple/spring-simple.xsd”>

  <memestorm:action id=”s” value=”HelloWorld” />

  <bean id=”foo”>
    <!– .. –>
  </bean>
  <!– other definitions –>

</beans>

내가 여기서 DTD대신에 bean설정의 XML스키마 버전을 사용하고 있다는것을 알아달라. 그리고 나는 http://www.memestorm.com/schema/simple로 맵핑된 명명공간으로 나의 memestorm컴포넌트를 정의한다. 우리는 나중에 이 명명공간이 bean으로 맵핑되는 방법을 볼것이다.

컴포넌트 코딩하기#

JAR를 추가하고 이것을 묶자. 구현물을 보자. Amazon컴포넌트 대신에 우리는 좀더 간단한 Simple컴포넌트를 작성한다.

package com.memestorm.beandemo;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class SimpleBean {
   private String value;
   private String otherValue;

   Log logger = LogFactory.getLog(getClass());

   public SimpleBean () {
      logger.error("In the constructor of SimpleBean");
   }

   public void action() {
      logger.error("In action with value='" + value + "' and otherValue='" + otherValue + "'");
   }

   public String getValue() {
      return value;
   }

   public void setValue(String value) {
      this.value = value;
   }

   public String getOtherValue() {
      return otherValue;
   }

   public void setOtherValue(String otherValue) {
      this.otherValue = otherValue;
   }
}

당신이 볼수 있는것처럼, 이것은 두개의 프라퍼티(value, otherValue), 생성자, 그리고 로그메시지를 출력하는 action()메소드를 가진다(그래서 이 컴포넌트를 사용하기 위해, 애플리케이션에 commons-logging를 추가할 필요가 있다.).

XML 인터페이스 정의하기#

당신이 묶는 작업을 볼때, XML인터페이스는 XML스키마에 의해 정의된다. 그래서 우리는 컴포넌트의 클라이언트에 의해 사용되는 XML스키마를 정의할 필요가 있다. 이것은 우리가 생성한 simple.xsd이다.

<xsd:schema xmlns="http://www.memestorm.com/schema/simple"
         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
         targetNamespace="http://www.memestorm.com/schema/simple"
         elementFormDefault="qualified"
         attributeFormDefault="unqualified">
   <xsd:element name="action">
      <xsd:complexType>
         <xsd:attribute name="id" type="xsd:ID" use="required"/>
         <xsd:attribute name="value" type="xsd:string"/>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>

당신이 볼수 있는 것처럼, action이라고 불리는 요소에 두개의 속성을 부여한다. " 컴포넌트로 묶기"에서 당신은 모든것이 적합한 xml파일을 볼수 있을것이다.

명명공간(Namespace) 핸들러#

몰래, Spring은 실질적인 bean인스턴스를 생성하기 위해 명명공간 핸들러를 호출한다.

<memestorm:action id="s" value="HelloWorld" />

컴포넌트 개발자처럼, 당신은 이 명명공간 핸들러를 제공한다.

package com.memestorm.tag;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import org.w3c.dom.Element;
import com.memestorm.beandemo.SimpleBean;

public class SimpleNamespaceHandler extends NamespaceHandlerSupport {

  public SimpleNamespaceHandler() {
    registerBeanDefinitionParser(”action”, new SimpleBeanDefinitionParser());
  }

  private static class SimpleBeanDefinitionParser extends
      AbstractSimpleBeanDefinitionParser {

    protected Class getBeanClass(Element element) {
      return SimpleBean.class;
    }

    protected void postProcess(BeanDefinitionBuilder definitionBuilder,
        Element element) {
      definitionBuilder.addPropertyValue(”otherValue”, “fromPostProcess”);
      definitionBuilder.setInitMethodName(”action”);
    }
  }
}

생성자가 요소와 관련된 bean정의 파서를 등록한다는 것에 유의하라. 당신은 나중에 명명공간을 요소에 맵핑하는 방법을 보게될것이다. bean정의 파서 자체는 매우 간단하다. getBeanClass()는 적절한 클래스를 반환할것이다. 당신이 볼수 있는것처럼 우리는 SimpleBean.class를 반환한다. 우리는 또한 파싱된 bean정의에 추가하기 위해 사용할수 있는 postProcess()메소드를 가진다. 이 경우, 우리는 다른 프라퍼티 값을 셋팅하고 호출하기 위한 init-method를 셋팅한다. AbstractSimpleBeanDefinitionParser에서 발생하는 것은 XML조각이 파싱되고 모든 속성(그리고 값)이 bean인스턴스의 프라퍼티 setter로 맵핑되는것이다. 반면에, 이것은 프로그래밍 형태로 bean정의를 생성하고 이것의 프라퍼티는 애플리케이션 컨텍스트내 정의된 값에 따른다.

패키징#

이 모든것을 패키징하기 위해, XSD파일, bean들, 그리고 명명공간 핸들러를 META-INF디렉토리내 두개의 특별한 파일과 함께 포함시켜라. 첫번째 당신은 spring.shemas가 필요하다.

http://www.memestorm.com/schema/simple/spring-simple.xsd=com/memestorm/tag/simple.xsd

당신이 보는것처럼, 이것은 명명공간 위치를 JAR내 스키마의 물리적인 위치에 맵핑한다. 다음 당신은 spring.handlers가 필요하다.

http://www.memestorm.com/schema/simple=com.memestorm.tag.SimpleNamespaceHandler

당신이 보는것처럼, 이것은 스키마 명명공간을 태그 핸들러로 맵핑한다.

요약#

  • 당신의 컴포넌트를 정의하는 XML스키마를 생성하기
  • 당신의 컴포넌트 bean생성하기
  • 스키마를 bean에 맵핑하는 명명공간 핸들러를 생성하기
  • 모두 함께 묶기 위한 두개의 패키징 가공물을 생성하기

다운로드#

원문에서 다운로드가능하다.

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-1) was last changed on 06-Apr-2006 09:45 by 이동국