반응형
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.java: init()함수에 @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 삭제하고 실행해 보기)
반응형