
lazy-init 속성을 알아보기전에 간단한 예제부터 보겠습니다.
TV라는 인터페이스와 이를 상속받는 IgTv, SamsongTv클래스가 있으며 applicationContext.xml의 역할을 해줄 BeanFactory클래스와 MTest클래스가 있습니다.
패키지 구조

TV.java
package com.test06;
public interface TV {
void powerOn();
void powerOff();
void volumeUp();
void volumeDown();
}
IgTv.java
package com.test06;
public class IgTv implements TV {
@Override
public void powerOn() {
System.out.println("ig tv on");
}
@Override
public void powerOff() {
System.out.println("ig tv down");
}
@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.test06;
public class SamsongTv implements TV{
@Override
public void powerOn() {
System.out.println("samsong tv on");
}
@Override
public void powerOff() {
System.out.println("samsong tv down");
}
@Override
public void volumeUp() {
System.out.println("samsong tv volume up");
}
@Override
public void volumeDown() {
System.out.println("samsong tv volume down");
}
}
BeanFactory.java
package com.test06;
public class BeanFactory {
public Object getBean(String beanName) {
if(beanName.equals("samsong")) {
return new SamsongTv();
} else if(beanName.equals("ig")) {
return new IgTv();
}
return null;
}
}
MTest.java
package com.test06;
public class MTest {
public static void main(String[] args) {
BeanFactory factory = new BeanFactory();
TV tv = (TV) factory.getBean("samsong");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
}
}
실행 결과

해당 코드에서는 MTest에서 factory객체를 만들고 factory객체를 이용해 samsong객체를 호출하였습니다.
BeanFactory에서 samsong이라는 파라미터를 받게되면 new SamsongTv() 명령이 수행되어 객체가 만들어집니다.
그러면 MTest에서 tv라는 변수는 즉 samsong이라는 객체가 됩니다.
Tv를 상속받고 있기때문에 SamsongTv에서 오버라이드된 각 메소드를 호출하게 됩니다.
lazt-init속성을 알아보겠습니다!
마찬가지로 Tv인터페이스를 상속받는 IgTv와 Samsong클래스를 만들겠습니다.
패키지 구조

Tv.java
package com.test07;
public interface TV {
void powerOn();
void powerOff();
void volumeUp();
void volumeDown();
}
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 down");
}
@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 down");
}
@Override
public void volumeUp() {
System.out.println("samsong tv volume up");
}
@Override
public void volumeDown() {
System.out.println("samsong tv volume down");
}
}
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" lazy-init="true"></bean>
<bean id="ig" class="com.test07.IgTv"></bean>
</beans>
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();
}
}
실행결과

factory객체가 생성될때 applicationContext에 있는 bean객체들이 같이 생성이 되어야합니다.
하지만 해당 코드의 실행결과를 보면 factory 객체가 생성될때 IgTv객체만 생성 되었습니다.
이후 TV tv = (TV) factory.getBean("samsong");으로 생성될때 samsong 객체가 호출이 됩니다.
applicationContext.xml에서 lazy-init을 true로 해놓았기 때문에 객체가 호출될때 생성이 됩니다.
<bean id="samsong" class="com.test07.SamsongTv" lazy-init="true"></bean>
<bean id="ig" class="com.test07.IgTv"></bean>
<bean>객체를 만들때 lazy-init 속성을 true로 해놓으면 반드시 객체가 호출 될때 생성이 됩니다!
자 그리고 xml파일 가장위에있는 url중 http://www.springframework.org/schema/beans
Index of /schema/beans
www.springframework.org
으로 들어가 보면 bean태그에 사용할수 있는 다양한 태그를 볼수 있습니다.

해당 url로 들어오면 이런 화면이 나옵니다.
해당 페이지에 보니 버전이 매우 많이있네요.
근데 자신이 무슨버전을 쓰는지 어떻게 알까요??

XML파일에서 Namespaces로 들어가서 beans를 눌러봅니다!
그러면 사용하고 있는 버전에 체크가 되어있는데요.
버전이 안써저 있는것을 사용하고 있네요.

그러면 페이지에서도 버전이 안써져있는 버전을 눌러볼까요?

그러면 뭐가 되게 많은데요...!
lazy-init말고도 <beans>에서 사용하는 모든 속성들이 정리되어있습니다!
api찾듯이 찾아서 쓰면 될거같아요!
'Java 관련 > Spring Legecy' 카테고리의 다른 글
[Spring] DI / IoC (Bean 객체_10) - autowire (0) | 2022.03.19 |
---|---|
[Spring] DI / IoC (Bean 객체_09) - 호출 (0) | 2022.03.18 |
[Spring] DI / IoC (Bean 객체 생성_07) - schema/c(c:), schema/p(p:) (0) | 2022.03.16 |
[Spring] DI / IoC (Bean 객체 생성_06) - 객체 참조(ref) (0) | 2022.03.15 |
[Spring] DI / IoC (Bean 객체 생성_05) - construct-arg와 property 동시 사용도 될까? (0) | 2022.03.14 |