2. 개별 인스턴스 주입하기
이번 실습에서는 프로퍼티에 의존 객체를 주입할 때 이미 존재하는 빈을 주입하는 것이 아닌, 새로 빈을 만들어 주입하는 방법을 알아본다.
- 실습 패키지 생성
exam 패키지 아래에 test08 패키지를 생성한다. test07 패키지의 모든 파일을 복사해온다.
- beans.xml 빈 설정 파일
exam/test08/beans.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="car1" class="exam.test08.Car">
<constructor-arg value="Avante"/>
<constructor-arg>
<bean class="exam.test08.Engine" p:maker="Hyundai" p:cc="1495"/>
</constructor-arg>
</bean>
<bean id="car2" class="exam.test08.Car">
<property name="model" value="Sonata"/>
<property name="engine">
<bean class="exam.test08.Engine" p:maker="Hyundai" p:cc="1997"/>
</property>
</bean>
</beans>
<bean id="car1" class="exam.test08.Car">
<constructor-arg value="Avante"/>
<constructor-arg>
<bean class="exam.test08.Engine" p:maker="Hyundai" p:cc="1495"/>
</constructor-arg>
</bean>
▶ 자바 코드로 표현하면?
Engine temp = new Engine();
temp.setMaker("Hyundai");
temp.setCc(1495);
Car car1 = new Car("Avante", temp);
생성자 매개변수를 설정할 때 새로 빈을 생성하여 할당하고 싶다면 <constructor-arg> 태그의 자식 태그로 <bean> 태그를 선언하면 된다. 새로 생성된 빈은 매개변수로 전달될 것이기 때문에 빈의 아이디나 이름을 설정하지 않는다.
<bean id="car2" class="exam.test08.Car">
<property name="model" value="Sonata"/>
<property name="engine">
<bean class="exam.test08.Engine" p:maker="Hyundai" p:cc="1997"/>
</property>
</bean>
▶ 자바 코드로 표현하면?
Car car2 = new Car();
car2.setModel("Sonata");
Engine temp = new Engine();
temp.setMaker("Hyundai");
temp.setCc(1997);
car2.setEngine(temp);
프로퍼티도 생성자 매개변수처럼 새로 빈을 만들어 할당할 수 있다. <property> 태그의 자식 태그로서 <bean> 태그를 선언하면 된다. 예제 코드를 보면 'car1'은 생성자를 통해 배기량이 1495cc인 엔진을 얹었고, 'car2'는 프로퍼티를 통해 배기량이 1997cc인 엔진을 얹었다.
- 빈 컨테이너 테스트
빈 컨테이너의 동작을 테스트할 exam.test08.Test 클래스를 다음과 같이 편집한다.
package exam.test08;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
//IoC 컨테이너 준비하여 빈 생성
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("exam/test08/beans.xml");
Car car1 = (Car)ctx.getBean("car1");
System.out.println(car1);
Car car2 = (Car)ctx.getBean("car2");
System.out.println(car2);
Engine engine = car1.engine;
engine.cc = 3000;
System.out.println(car1);
System.out.println(car2);
}
}
Car car1 = (Car)ctx.getBean("car1");
System.out.println(car1);
Car car2 = (Car)ctx.getBean("car2");
System.out.println(car2);

일단 빈 컨테이너에서 'car1'과 'car2'를 꺼내 내용을 출력해 본다. 출력 결과를 보면 각각의 Car 객체가 자신만의 엔진을 갖고 있음을 알 수 있다.
Engine engine = car1.engine;
engine.cc = 3000;

'car1'에 설정된 엔진과 'car2'에 설정된 엔진이 다르다는 것을 확인하기 위해 'car1' 엔진의 배기량을 변경한다. 다시 'car1'과 'car2'를 출력해 보면 'car1'의 엔진만 배기량이 3000으로 변경되었다. 서로 다른 엔진이라는 의미이다.
이렇게 프로퍼티나 매개변수에 새로운 객체를 생성하여 할당하고 싶다면 <property> 태그나 <constructor-arg> 태그의 자식 태그로 <bean> 태그를 선언하면 된다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
141. 컬렉션 값 주입 (2) (0) | 2022.10.26 |
---|---|
140. 컬렉션 값 주입 (1) (0) | 2022.10.25 |
138. 의존 객체 주입 (1) (0) | 2022.10.23 |
137. 생성자와 프로퍼티 설정 (3) (0) | 2022.10.21 |
136. 생성자와 프로퍼티 설정 (2) (0) | 2022.10.20 |
댓글