아무거나

[spring] 생명주기(life cycle)와 범위 본문

Java & Kotlin/Spring

[spring] 생명주기(life cycle)와 범위

전봉근 2019. 12. 25. 23:22
반응형

[spring] 생명주기(life cycle)와 범위

 

1. 스프링 컨테이너 생명 주기

   [ex]

public class MainClass {
    public static void main(String[] args) {
        // 스프링 컨테이너 생성
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();

        // 스프링 컨테이너 설정
        ctx.load("classpath:applicationCTX.xml");
        ctx.refresh(); // load메서드를 사용할경우 refresh메서드를 사용하여 반드시 설정이 다 되도록 하여야 한다.

        // 스프링 컨테이너 사용
        Student student = ctx.getBean("student", Student.class);
        System.out.println("이름 : " + student.getName());
        System.out.println("나이 : " + student.getAge());

        // 스프링 컨테이너 종료
        ctx.close();
    }
}

 

 

2. 스프링 빈 생명 주기

# 인터페이스를 이용해서 하는 경우

public static void main(String[] args) {
    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); // 컨테이너생성
    ctx.load("classpath:applicationCTX.xml"); // 로드
    ctx.refresh(); // 빈 생성(즉, 빈이 초기화 과정에서 호출된다. interface:InitializingBean, method:afterPropertiesSet() )
    ctx.close(); // 빈 소멸(빈 소멸 과정에서 생성 된다. interface:DisposableBean , method:destroy() )
}

 

# 어노테이션을 이용해서 하는 경우

// 어노테이션을 이용해서 하는 경우

public static void main(String[] args) {
    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); // 컨테이너생성
    ctx.load("classpath:applicationCTX.xml"); // 로드

    // 개발자가 임의로 만들어놓은 method 활용
    ctx.refresh(); // 빈 생성(빈이 초기화 과정에서 호출된다. @PostConstruct, method:initMethod())
    ctx.close(); // 빈 소멸(빈 소멸 과정에서 생성 된다. @PreDestroy, method:destroyMethod())
}

 

# 결과

afterPropertiesSet() // 인터페이스 빈 생성

initMethod() // 어노테이션 빈 생성

destroyMethod() // 어노테이션 빈 소멸

destroy() // 인터페이스 빈 소멸

 

 

3. 스프링 빈 범위(scope)

   - 스프링 컨테이너가 생성되고, 스프링 빈이 생성 될 때, 생성된 스프링 빈은 scope을 가지고 있다.( = 범위 )

     scope(범위)란 해당하는 객체가 어디까지 영향을 미치는지 결정하는 것

 

     [MainClass.java]

public class MainClass {
    public static void main(String[] args) {
        AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");

        Student student1 = ctx.getBean("student", Student.class);
        System.out.println("이름 : " + student1.getName());
        System.out.println("나이 : " + student1.getAge());
        System.out.println("==============================");

        Student student2 = ctx.getBean("student", Student.class);
        student2.setName("홀길자");
        student2.setAge(100);

        System.out.println("이름 : " + student1.getName());
        System.out.println("나이 : " + student1.getAge());
        System.out.println("==============================");

        if(student1.equals(student2)) {
        	System.out.println("student1 == student2");
        } else {
        	System.out.println("student1 != student2");
        }
        
        ctx.close();
    }
}

 

     [applicationCTX.xml]

<?xml version="1.0" encoding="UTF-8"?>
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="com.javalec.ex.Student" scope="singleton">
    <constructor-arg value="홍길순"></constructor-arg>
    <constructor-arg value="30"></constructor-arg>
</bean>

</beans>

 

     * 위의 xml에서 스프링 컨테이너가 생성을 했기때문에 java에서 사용이 가능하다.​ 

 

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%95%EC%A2%8C/dashboard

반응형
Comments