記錄

Spring) getBean과 객체의 생성 본문

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);
    }


Comments