Spring(스프링), Spring Boot(스프링부트), JSP

스프링(Spring) 스프링 컨테이너, 스프링 빈 생명주기

알통몬_ 2018. 1. 4. 16:30
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 스프링 컨테이너와 스프링 빈의 생명 주기에 대해 알아보겠습니다.


스프링 컨테이너 생명 주기

컨테이너 생성 -> 컨테이너 설정 -> 컨테이너 사용 -> 컨테이너 종료의 순서로 생명 주기가

진행됩니다.

코드로 보겠습니다.

스프링설정 .xml

1
2
3
4
5
6
7
8
9
10
11
12
// input your code here<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id="student" class="org.mon.altong.lifecycle.Student">
        <constructor-arg value="알통몬"/>
        <constructor-arg value="26"/>
    </bean>
 
</beans>
 
cs

Student.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package org.mon.altong.lifecycle;
 
public class Student {
 
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
 
}
 
cs

Running.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
package org.mon.altong.lifecycle;
 
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class Running{
 
    public static void main(String[] args) {
        //컨테이너 생성
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        
        //컨테이너 설정
        ctx.load("classpath:lifeCycleContext.xml");
        ctx.refresh();
        
        //컨테이너 사용
        Student student = ctx.getBean("student", Student.class);
        System.out.println(student.getName());
        System.out.println(student.getAge());
        //사용 끝
        
        //컨테이너 종료
        ctx.close();
    }
 
}
 
cs

위에서 GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("설정파일.xml 경로"); 처럼 사용할 수도 있습니다.

위 코드처럼 생성과 설정을 따로 할 경우에는

ctx.load("classpath:설정파일.xml"); 호출 후

꼭 ctx.refresh(); 를 호출해 주어야 합니다.

ctx.getBean() 처럼 컨테이너를 사용하고,

ctx.close(); 호출을 통해 자원을 해제합니다.


스프링 빈 생명 주기

빈으로 사용될 클래스가 두 가지 인터페이스를 상속 받으면 됩니다.


빈의 생명주기는 컨테이너를 따라가기 때문에 기본적으로 컨테이너가 종료되면 빈은 자동 소멸되고 빈만 종료하고 싶을 경우 destroy()를 호출하면 됩니다.

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
package org.mon.altong.lifecycle;
 
public class Student implements InitializingBean, DisposableBean {
 
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    
    //InitializingBean 빈의 초기화 될 때(ctx.refresh) 호출
    @Override
    public void afterPropertiesSet() throws Exception {
        // 빈이 초기화될 때 특정 작업이 필요한 경우
        System.out.println("afterPropertiesSet() called");
        
    }

    //DisposableBean 빈이 destroy(ctx.close()) 될 때 호출

    @Override
    public void destroy() throws Exception {
        // 빈이 소멸될 때 특정 작업이 필요한 경우
        System.out.println("destroy() called");        
    }
 
}
 
cs


스프링 빈의 범위 ( SCOPE )

 : 스프링 컨테이너가 생성되고, 스프링 빈이 생성될 때 스프링 빈은 scope를 가지고 있습니다.

scope란 해당하는 객체가 어디까지 영향을 주는지 결정하는 거라고 생각하시면 되겠습니다.

scope의 default는 singleton입니다.

1
2
3
4
<bean id="student" class="org.mon.altong.lifecycle.Student" scope="singleton">
        <constructor-arg value="알통몬"/>
        <constructor-arg value="26"/>
    </bean>
cs


그래서 같은 빈을 가지고 여러 개의 객체를 생성했다면, == 연산자로 비교해보았을 때

true 가 나오게 됩니다.


이상입니다.


반응형