본문 바로가기
프로그래밍/Spring

Spring / 스프링 빈의 생명 주기(life cycle)

by 소소로드 2018. 4. 7.

[스프링 빈의 생명 주기(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()가 실행되면서 해당 내용이 출력된다.

왜 두 번씩 나오는지는 나도 모르겠다..