반응형

Spring JSR-250 Annotations


(원문 위치 : http://www.tutorialspoint.com/spring/spring_jsr250_annotations.htm )

Spring은 또한 @PostConstructor, @PreDestroy, @Resource annotation을 포함하는 JSR-250기반 annotation을 포함한다. 비록 이것이 실제로 다른 것으로 대체되어 필요하지 않을지라도 여전히 영감을 준다.

@PostConstruct and @PreDestroy Annotations:

Bean에 대해 설정과 분해를 정의하기 위해 init-method 그리고/또는 destroy-method 인자를 가진 <bean>을 선언한다. init-method 속성(attribute)은 인스턴스화(instantiation) 즉시 bean에서 불려지는 함수를 지정한다. 유사하게,  destroy-method는 container로부터 bean이 제거되기 직전에 호출되는 함수를 지정한다.

초기화(initialization) callback의 대체로 @PostConstruct annotation을 소멸(destruction) callback의 대체로써 @PreDestroy annotation을 사용할 수 있다.

Example

[003] HelloWorld Example 강좌를 참조하여 프로젝트를 생성한다.

HelloWorld.javainit()함수에 @PostConstruct가 destroy()함수에 @PreDestroy가 선언되었다.

package com.tutorialspoint;
import javax.annotation.*;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }

   public String getMessage(){
      System.out.println("Your Message : " + message);
      return message;
   }
   @PostConstruct
   public void init(){
      System.out.println("Bean is going through init.");
   }
   @PreDestroy
   public void destroy(){
      System.out.println("Bean will destroy now.");
   }
}

MainApp.java: 이전 강좌([007] Bean lifecycle)에서 언급되었던 registerShutdownHook()함수를 사용하였고, 이를 위해 ApplicationContext가 아닌 AbstractApplicationContext가 사용되었다.

package com.tutorialspoint;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {

      AbstractApplicationContext context = 
                          new ClassPathXmlApplicationContext("Beans.xml");

      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      obj.getMessage();
      context.registerShutdownHook();
   }
}

Beans.xml: init-method와 destroy-method 속성을 정의하였다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config/>

   <bean id="helloWorld" 
       class="com.tutorialspoint.HelloWorld"
       init-method="init" destroy-method="destroy">
       <property name="message" value="Hello World!"/>
   </bean>

</beans>

실행 결과는 아래와 같다. 실제 @PostConstruct, @PreDestroy annotation이 제거되어도 큰 차이가 없다. 서두에 언급되었듯 실제로는 사용 안하는 이유인듯 하다.

Bean is going through init.
Your Message : Hello World!
Bean will destroy now.

@Resource Annotation:

field나 setter method에 @Resource annotation을 사용할 수 있고, 이것은 Java EE 5와 같이 동작한다(음..어떻게 동작한다는 거지..??). @Resource annotation은 삽입되어질 bean의 이름으로써 표현되어 질 'name' 속성(attribute)을 갖는다. 이것은 아래 보여지는 예제처럼 의미적으로 'byName' autowiring을 따른다고 할 수 있다.
package com.tutorialspoint;

import javax.annotation.Resource;

public class TextEditor {
   private SpellChecker spellChecker;

   @Resource(name= "spellChecker")
   public void setSpellChecker( SpellChecker spellChecker ){
      this.spellChecker = spellChecker;
   }
   public SpellChecker getSpellChecker(){
      return spellChecker;
   }
   public void spellCheck(){
      spellChecker.checkSpelling();
   }
}
만약 명시적으로 보여지는 'name'이 없다면, 기본(default)이름은 field 혹은 setter함수로부터 상속되어진다. field의 경우, field이름을 갖고, setter함수의 경우, bean 속성(property)이름을 갖는다.

(--> 이번 내용은 크게 와닿지가 않는다.. 서두에서도 실제로 사용하지 않는다 했으니 그려러니 하고 넘어간다..
그래서 이번 강좌 소스는 안돌려보고 눈으로만 봤다.. 나중에 심심하면 몇가지 테스트를 해보고 결과를 추가로 포스팅하겠다. -> bean 설정파일에서 init-method/destroy-method 삭제하고 실행해 보기)



반응형

+ Recent posts