ApplicationContext
)는 객체를 생성하고, 의존성을 주입하며, 생명 주기를 관리합니다.<bean>
태그를 통해 객체를 생성하고 의존성을 설정합니다.singleton
(기본값):prototype
:getBean()
메서드를 호출할 때마다 새로운 객체를 생성합니다.<bean id="singletonBean" class="org.example.model.HelloBean" scope="singleton" />
<bean id="prototypeBean" class="org.example.model.HelloBean" scope="prototype" />
스프링 DI는 다음과 같은 방식으로 의존성을 주입합니다:
<property>
를 사용해 멤버 필드에 값을 설정합니다.// 클래스 정의
public class HelloBean {
private String name;
public void setName(String name) { this.name = name; }
public void sayHello() { System.out.println(name + "님 안녕하세요!"); }
}
<bean id="helloBean" class="org.example.model.HelloBean">
<property name="name" value="홍길동" />
</bean>
// 클래스 정의
public class HelloBean {
private String name;
public HelloBean(String name) { this.name = name; }
public void sayHello() { System.out.println(name + "님 안녕하세요!"); }
}
<bean id="helloBean" class="org.example.model.HelloBean">
<constructor-arg value="홍길동" />
</bean>
// 클래스 정의
public class WriteAction {
private BoardTO to;
public WriteAction(BoardTO to) { this.to = to; }
public void execute() { System.out.println("execute(): " + to); }
}
<bean id="boardTO" class="org.example.model2.BoardTO" />
<bean id="writeAction" class="org.example.model2.WriteAction">
<constructor-arg ref="boardTO" />
</bean>
HelloBean helloBean1 = (HelloBean) ctx.getBean("helloBean1");
HelloBean helloBean2 = (HelloBean) ctx.getBean("helloBean2");
System.out.println("helloBean1: " + helloBean1);
System.out.println("helloBean2: " + helloBean2);
// 이름을 바꾸는 순간에 NEW (1과 5 다른 참조값)
HelloBean helloBean5 = (HelloBean) ctx.getBean("helloBean1");
System.out.println("helloBean5: " + helloBean5);
동작:
helloBean1
과 helloBean2
는 각각 helloBean1
과 helloBean2
라는 ID를 가진 프로토타입 빈입니다.scope="prototype"
이므로 getBean
호출 시마다 새로운 객체가 생성됩니다.helloBean1
ID로 getBean()
을 호출하면, 새로운 객체가 생성됩니다.helloBean1
과 helloBean5
는 서로 다른 참조값을 가집니다.결과:
helloBean1: org.example.model.HelloBean@xxxx
helloBean2: org.example.model.HelloBean@yyyy
helloBean5: org.example.model.HelloBean@zzzz
helloBean1
과 helloBean5
는 다른 참조값을 가집니다.helloBean1
)라도 호출할 때마다 새로운 객체를 반환.HelloBean helloBean3 = (HelloBean) ctx.getBean("helloBean3");
HelloBean helloBean4 = (HelloBean) ctx.getBean("helloBean4");
System.out.println("helloBean3: " + helloBean3);
System.out.println("helloBean4: " + helloBean4);
// 3과 5 같은 참조값
HelloBean helloBean5 = (HelloBean) ctx.getBean("helloBean3");
System.out.println("helloBean5: " + helloBean5);
동작:
helloBean3
과 helloBean4
는 각각 helloBean3
과 helloBean4
라는 ID를 가진 싱글톤 빈입니다.scope="singleton"
이므로 컨테이너 초기화 시 단 한 번만 객체를 생성합니다.helloBean3
ID로 getBean()
을 호출하면 동일한 객체를 반환합니다.결과:
helloBean3: org.example.model.HelloBean@aaaa
helloBean4: org.example.model.HelloBean@bbbb
helloBean5: org.example.model.HelloBean@aaaa
helloBean3
과 helloBean5
는 동일한 참조값을 가집니다.helloBean4
는 별도의 싱글톤 빈으로서 다른 참조값을 가집니다.Prototype 스코프:
getBean()
호출 시마다 새로운 객체를 반환.Singleton 스코프:
getBean()
을 호출하면 항상 동일한 객체를 반환.<bean id="helloBean1" class="org.example.model.HelloBean">
<constructor-arg value="홍길동" />
</bean>
<bean id="helloBean2" class="org.example.model.HelloBean">
<constructor-arg value="이몽룡" />
</bean>
HelloBean hello1 = (HelloBean) ctx.getBean("helloBean1");
hello1.sayHello();
HelloBean hello2 = (HelloBean) ctx.getBean("helloBean2");
hello2.sayHello();
helloBean1
은 "홍길동님 안녕하세요!" 출력.helloBean2
는 "이몽룡님 안녕하세요!" 출력.<bean id="boardTO" class="org.example.model2.BoardTO" />
<bean id="writeAction" class="org.example.model2.WriteAction">
<constructor-arg ref="boardTO" />
</bean>
WriteAction writeAction = (WriteAction) ctx.getBean("writeAction");
writeAction.execute();
writeAction
은 boardTO
객체를 의존성으로 받아 사용.DI 핵심 개념
주요 구성 요소
<bean>
: 스프링 빈을 정의.scope
: 빈의 생명주기를 정의(singleton
, prototype
).<constructor-arg>
: 생성자 주입에 사용.<property>
: 멤버 필드 초기화에 사용.DI 활용