오늘은 spring에서 객체는 언제 생성되는지에 대해 정리해보려고 합니다.
com.test07 패키지 만들러 가볼까요?
IgTv.java
package com.test07;
public class IgTv implements TV {
public IgTv() {
System.out.println("ig tv 생성");
}
@Override
public void powerOn() {
System.out.println("ig tv on");
}
@Override
public void powerOff() {
System.out.println("ig tv off");
}
@Override
public void volumeUp() {
System.out.println("ig tv volume up");
}
@Override
public void volumeDown() {
System.out.println("ig tv volume down");
}
}
SamsongTv.java
package com.test07;
public class SamsongTv implements TV {
public SamsongTv() {
System.out.println("samsong tv 생성");
}
@Override
public void powerOn() {
System.out.println("samsong tv on");
}
@Override
public void powerOff() {
System.out.println("samsong tv off");
}
@Override
public void volumeUp() {
System.out.println("samsong tv volume up");
}
@Override
public void volumeDown() {
System.out.println("samsong tv volume down");
}
}
TV.java
package com.test07;
public interface TV {
void powerOn();
void powerOff();
void volumeUp();
void volumeDown();
}
MTest.java
package com.test07;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test07/applicationContext.xml");
System.out.println("spring ioc container 준비 완료");
TV tv = (TV) factory.getBean("samsong");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
}
}
applicationContext.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="samsong" class="com.test07.SamsongTv"></bean>
<bean id="ig" class="com.test07.IgTv"></bean>
</beans>
코드 실행결과
MTest에 ApplicationContext 객체를 생성할 때 applicationContext.xml의 bean태그에서 객체도 만들어집니다.
그 만들어진 객체는 바로 컨테이너에 담아 언제든 사용할 수 있게 만들어줍니다.
MTest에서의 진행순서를 매겨보자면
1. ApplicationContext factory = new ClassPathXmlApplicationContext("com/test07/applicationContext.xml");
2. System.out.println("spring ioc container 준비 완료");
3. TV tv = (TV) factory.getBean("samsong");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
이라고 할 수 있는데요
1번의 순서가 진행될 때 applicationContext.xml에서 samsong과 ig의 이름을 가진 객체를 생성합니다.
2번은 사실 그냥 결과를 보려고 문장을 출력시켜놓은 것이지만 객체가 생성되었다면 spring container에서 이미 쓸 준비가 완료된것입니다.
3번 순서가 되면 컨테이너에 있는 객체들을 가져다가 자기가 원하는 형태로 사용한것입니다.
여기서 IoC의 특징이 나타난다고 볼 수 있습니다.
- 생성하는 곳(applicationContext.xml)과 사용하는 곳(MTest)가 다르다.
다음은 <beans>태그에서 사용가능한 속성중에 하나인 lazy-init에 대해 알아보겠습니다.
lazy-init은 말 그대로 번역하자면 "게으른 초기화" 인데요 이게 과연 뭔지 실습을 통해 알아보겠습니다.
applicationContext.xml에서 <bean>태그 하나에 lazy-init 속성을 사용해 볼게요
<bean id="samsong" class="com.test07.SamsongTv" lazy-init='true'></bean>
이렇게 id가 samsong인 객체에 lazy-init='true'를 적용시켜봤습니다. 결과가 어떻게 달라질까요?
처음 결과에는 분명히 ApplicationContext factory = new ... 할때 ig tv, samsong tv 객체를 만들어줬는데
이번엔 ig tv만 만들어져있다가 늦게 samsong tv가 생성된 것을 확인할 수 있습니다.
lazy-init이 true라는 건 객체가 생성될 때 같이 생성되지 않다가 객체가 호출이 될 때 생성이되게 만들어줍니다.
이 밖에 <beans>태그에는 많은 속성들이 있는데요 이를 확인하려면
만들어진 xml파일에서 namespace에 들어가면 beans라는 속성을 클릭했을 때 오른쪽에 체크되어있는것이 현재 본인이 사용중인 spring의 버전입니다. 버전 확인 후
저 부분을 복사해서 웹에 붙여넣기하면
이렇게 나오는데요 저는 제가 사용중인 버전을 눌러보겠습니다.
위에 사진이 작아 안보일 수 있는데 lazy-init보이시나요 ㅎㅎ
이외에도 <beans>에서 사용할 수 있는 속성들이 정리되어있으니 확인해보시기 바랍니다.
'Java > Spring' 카테고리의 다른 글
[Spring] 09. MessageSource (메시지 국제화) (0) | 2021.06.24 |
---|---|
[Spring] 08. <bean> 속성 사용하기 - Autowire (0) | 2021.06.23 |
[Spring] 06. applicationContext의 내부구조(Factory 패턴) (0) | 2021.06.20 |
[Spring] Namespace가 안 나올 때 (0) | 2021.06.19 |
[Spring] 05. <bean> 속성 사용하기 (0) | 2021.06.18 |