Web/Spring framework
Spring) getBean과 객체의 생성
surhommejk
2018. 4. 26. 10:14
ApplicationContext context =
new GenericXmlApplicationContext("classpath:DI_05_Spring/DI_05.xml");
System.out.println("before : mybean객체");
MyBean mybean = context.getBean("mybean",MyBean.class);
System.out.println("after : mybean객체 : " + mybean);
System.out.println("before : mybean2객체");
MyBean mybean2 = context.getBean("mybean",MyBean.class);
System.out.println("after : mybean2객체 : " + mybean2);
////////////////////////////////////////////////////////////
System.out.println("before : mybean3객체(생성자)");
MyBean mybean3 = context.getBean("mybean2",MyBean.class);
System.out.println("after : mybean3객체(생성자): " + mybean3);
<bean id="mybean" class="DI_05_Spring.MyBean"></bean>
<bean id="mybean2" class="DI_05_Spring.MyBean">
<constructor-arg value="hong" />
</bean>
public class MyBean {
public MyBean() {
System.out.println("Default");
}
public MyBean(String name) {
System.out.println("Overloading : " + name);
}
}
console
Default
Overloading : hong
before : mybean객체
after : mybean객체 : DI_05_Spring.MyBean@5cb9f472
before : mybean2객체
after : mybean2객체 : DI_05_Spring.MyBean@5cb9f472
before : mybean3객체(생성자)
after : mybean3객체(생성자): DI_05_Spring.MyBean@cb644e
>> 정리 <<
1. ApplicationContext을 만들면 xml에 설정한 bean이 모두 '일단' '생성'된다.
ApplicationContext context =
new GenericXmlApplicationContext("classpath:DI_05_Spring/DI_05.xml");
이것이 실행되면 xml에서 bean으로 설정된 클래스들을 일단 생성하게 된다.(만들어 놨다가 getBean시에 꺼내줘야 하기 때문에 미리 만들어 놓는 의미로 이해) 따라서 위 두 줄의 코드만으로 xml에 bean으로 설정된 모든 객체를 생성하게 되는 것이다. 그렇기 때문에 생성자 내부에 넣어둔 로직들이 실행되는 것이고 여기서는 sysout이 설정되어 있기 때문에 "Default"와 "Overloading : hong"이 콘솔에 찍히는 것이다.
2. 같은 bean에서 꺼내온 클래스는 아무리 여러번 꺼내도 결국 동일한 객체를 꺼내오게 된다
System.out.println("before : mybean객체");
MyBean mybean = context.getBean("mybean",MyBean.class);
System.out.println("after : mybean객체 : " + mybean);
System.out.println("before : mybean2객체");
MyBean mybean2 = context.getBean("mybean",MyBean.class);
System.out.println("after : mybean2객체 : " + mybean2);
before : mybean객체
after : mybean객체 : DI_05_Spring.MyBean@5cb9f472
before : mybean2객체
after : mybean2객체 : DI_05_Spring.MyBean@5cb9f472
결국 같은 bean을 getBean 했기 때문에 주소값을 뽑아보면 똑같은 것을 알 수 있다. bean에 미리 만들어둔 객체를 getBean으로 가져오는 것이기 때문에 아무리 여러번 getBean으로 가져와도 결국 동일한 객체를 가져오는 것일 뿐이다.
3. 오버로딩된 생성자를 이용하면 새로운 객체가 생성된다
System.out.println("before : mybean3객체(생성자)");
MyBean mybean3 = context.getBean("mybean2",MyBean.class);
System.out.println("after : mybean3객체(생성자): " + mybean3);
<bean id="mybean2" class="DI_05_Spring.MyBean">
<constructor-arg value="hong" />
</bean>
public MyBean(String name) {
System.out.println("Overloading : " + name);
}