- 이 글은 아래의 내용에서 이어지는 내용입니다.
# Bean의 생성 시점과 새로운 객체로 생성하기
- XML 에서 bean 요소에 lazy-init와 scope를 지정합니다.
- 아래 xml 두개 bean 생성 요소에 lazy-init, scope를 넣어보겠습니다.
<!-- 총 두개의 bean을 생성합니다. -->
<!-- id값 없이 생성해 보도록 하겠습니다. -->
<bean class="beans.TestBean"></bean>
<!-- bean id 값으로 객체를 불러올 거라 bean id 값을 부여하였습니다. -->
<bean id="test1" class="beans.TestBean"></bean>
# Bean.xml
<?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 값으로 객체를 불러올 거라 bean id 값을 부여하였습니다. -->
<bean id="test1" class="beans.TestBean"></bean>
<!-- getBean 할 때 마다 새로운 객체의 주소를 줍니다 -->
<bean id="test2" class="beans.TestBean" scope="prototype"></bean>
<!-- getBean 할 때 딱 한번 객체를 생성합니다. -->
<bean id="test3" class="beans.TestBean" lazy-init="true"></bean>
<!-- getBean 할 때 마다 객체를 생성 및 새로운 객체를 생성합니다 -->
<bean id="test4" class="beans.TestBean" lazy-init="true"
scope="prototype"></bean>
</beans>
1. Main.java
package main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import beans.TestBean;
public class Main {
public static void main(String[] args) {
System.out.println("-1------------");
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("config/beans.xml");
System.out.println("TestBean은 test1의 요소만 한번 생성");
System.out.println("-2------------");
// beans.xml에서 정의한 TestBean의 요소를 가져오겠습니다.
System.out.println("-3--getBean 불러오기 전-");
// getBean해서 부르기 전에 이미 test1의 bean의 생성되어진 상태.
TestBean t1_1 = ctx.getBean("test1", TestBean.class);
System.out.printf("t1 : %s\n", t1_1);
TestBean t1_2 = ctx.getBean("test1", TestBean.class);
System.out.printf("t2 : %s\n", t1_2);
// t1_1,t1_2 동일한 주소의 객체.
// scope가 정의된 bean은 getBean 할 때 마다 새로운 객체를 생성합니다.
// getBean할 때마다 생성자가 실행됨.
TestBean t2_1 = ctx.getBean("test2", TestBean.class);
System.out.printf("t2_1 : %s\n", t2_1);
TestBean t2_2 = ctx.getBean("test2", TestBean.class);
System.out.printf("t2_2 : %s\n", t2_2);
// t2_1,t2_2 동일한 주소를 가지고 있지 않음.
// lazy-init가 정의된 bean은 getBean할 때 새로운 객체를 생성합니다.
// 단, getBean한 이후, 싱글톤으로 생성된다.
TestBean t3_1 = ctx.getBean("test3", TestBean.class);
System.out.printf("t3_1 : %s\n", t3_1);
TestBean t3_2 = ctx.getBean("test3", TestBean.class);
System.out.printf("t3_2 : %s\n", t3_2);
// t3_1과 t3_2의 주소가 동일하게 나올 것입니다.
// getBena 할 때, 생성자가 실행되며, 항상 새로운 객체가 생성됩니다.
TestBean t4_1 = ctx.getBean("test2", TestBean.class);
System.out.printf("t2_1 : %s\n", t4_1);
TestBean t4_2 = ctx.getBean("test2", TestBean.class);
System.out.printf("t2_2 : %s\n", t4_2);
// t4_1,t4_2 동일한 주소를 가지고 있지 않음.
System.out.println("-4--getBean 불러온 후-");
ctx.close();
}
}
2. Main.java, Beans.xml 관계
- main.java에서 실행 시, Beans.xml 정의된 내용
3. 결과화면
- scope, lazy-init 이 정의된 내용에 따라서 bean 생성에 영향을 줍니다,
'[Spring]' 카테고리의 다른 글
[Spring기초] 모든 Bean이 생성 시 실행되는 메소드(BeanPostProcessor) - BeanLifeCycle (0) | 2019.10.12 |
---|---|
[Spring기초] 모든 Bean 생성, 종료 메소드 실행(default-init-method, defalut-destroy-method) (0) | 2019.10.11 |
[Spring기초] Bean 초기화, 종료 메소드 실행(init-method, destroy-method) (0) | 2019.10.11 |
[Spring기초] bean 생성하기(XML로 생성) (0) | 2019.10.11 |
[Spring기초] pom.xml 의존성 버전 관리(properties 사용하기) (0) | 2019.10.09 |