[스프링 빈의 생명 주기(life cycle)]
OtherStudent.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | public class OtherStudent { private String name; private int age; private ArrayList<String> hobbies; private double height; private double weight; public OtherStudent(String name, int age, ArrayList<String> hobbies) { this.name = name; this.age = age; this.hobbies = hobbies; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public ArrayList<String> getHobbies() { return hobbies; } public void setHobbies(ArrayList<String> hobbies) { this.hobbies = hobbies; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } } | cs |
*
그동안 만들었던 student 파일과 같다.
Student.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | public class Student implements InitializingBean, DisposableBean{ private String name; private int age; private ArrayList<String> hobbies; private double height; private double weight; public Student(String name, int age, ArrayList<String> hobbies) { this.name = name; this.age = age; this.hobbies = hobbies; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public ArrayList<String> getHobbies() { return hobbies; } public void setHobbies(ArrayList<String> hobbies) { this.hobbies = hobbies; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } @Override public void destroy() throws Exception { System.out.println("destroy() 메서드를 실행."); } @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet() 메서드를 실행합니다."); } } | cs |
*
InitializingBean : 빈 초기화 과정에서 호출되며 afterPropertiesSet()를 오버라이딩한다. --> ctx.refresh에서 소환
DisposableBean : 빈 소멸 과정에서 생성되며 destroy()를 오버라이딩한다. --> ctx.close에서 소환
ctx_example02.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <bean id="student1" class="com.yul.ex05_example01.Student"> <constructor-arg value="yul"/> <constructor-arg value="100"/> <constructor-arg> <list> <value>기도하기</value> </list> </constructor-arg> <property name="height" value="180"/> <property name="weight" value="68"/> </bean> <bean id="otherstudent" class="com.yul.ex05_example01.Student"> <constructor-arg value="rim"/> <constructor-arg value="120"/> <constructor-arg> <list> <value>사랑하기</value> </list> </constructor-arg> <property name="height" value="187"/> <property name="weight" value="67"/> </bean> </beans> | cs |
MainClass.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class MainClass { public static void main(String[] args) { GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.load("classpath:ctx_example02.xml"); ctx.refresh(); // afterPropertiesSet() 실행 ctx.close(); // destroy() 실행 } } | cs |
*
출력결과 :
afterPropertiesSet() 메서드 실행
afterPropertiesSet() 메서드 실행
destroy() 메서드 실행
destroy() 메서드 실행
------------------------------------
중요한 점은 빈의 순환이 어떻게 이루어지고 있느냐이다.
ctx.load를 하는 순간 xml은 student와 매핑되어 들어오고
ctx.refresh가 실행되면 초기화되면서
afterPropertiesSet() 메서드를 소환하므로 해당 내용이 출력되고
ctx.close()를 통해 종료되는 시점에 destroy()가 실행되면서 해당 내용이 출력된다.
왜 두 번씩 나오는지는 나도 모르겠다..
'프로그래밍 > Spring' 카테고리의 다른 글
Spring / 외부 파일을 이용한 설정 - Environment 객체 (0) | 2018.04.08 |
---|---|
Spring / 스프링 빈의 범위(Bean Scope) (0) | 2018.04.07 |
Spring / 스프링 컨테이너의 생명주기(lifecycle) (0) | 2018.04.07 |
Spring / xml과 Java를 같이 사용하는 방법 (0) | 2018.04.07 |
Spring / Java를 통한 DI 설정방법 (0) | 2018.04.07 |