1. Constructor Injection
스프링 컨테이너는 bean 객체 생성시 Default 생성자를 호출하여 객체를 생성한다. 이때 기본 생성자가 아닌 매개변수를 가지는 생성자를 통해 호출하도록 할 수 있는데 이 기능을 사용하여 Construction Injection을 처리할 수 있다. 먼저 아래와 같이 Car, Engine, Main 클래스가 있다고 하자.
# Engine 클래스
public class Engine {
public Engine() {
System.out.println("Engine 생성");
}
public void sound() {
System.out.println("Brrrrrrr!!!");
}
}
# Car 클래스
public class Car {
private Engine engine;
public Car() {
System.out.println("생성자1로 Car 객체 생성");
}
public Car(Engine engine) {
System.out.println("생성자2로 Car 객체 생성");
this.engine = engine;
}
public void powerOn() {
System.out.println("시동 On");
engine.sound();
}
public void powerOff() {
System.out.println("시동 Off");
}
}
# Main 클래스
public class Main {
public static void main(String[] args) {
// 스프링 컨테이너 구동
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
// 객체 요청
Car car = (Car)factory.getBean("car");
car.powerOn();
car.powerOff();
// 컨테이너 종료
factory.close();
}
}
이때 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="car" class="MyExam.Car">
<constructor-arg ref="engine"></constructor-arg>
</bean>
<bean id="engine" class="MyExam.Engine"></bean>
</beans>
Constructor Injection을 위해서는 임의의 클래스의 객체를 사용하려는 bean 객체의 <bean> 태그안에 <constructor-arg> 엘리먼트를 추가하면 된다. 즉, 위에서는 car 객체가 engine 객체를 사용하기 때문에 car 객체의 <bean> 태그안에 <constructor-arg> 태그를 추가한 것이다. 이때 생성자 인자로 전달할 객체의 아디를 ref 속성으로 넘겨준다. 해당 코드의 결과는 아래와 같다.
이때 보면 xml 파일에서 Engine 클래스가 Car 클래스 아래에 등록되었지만 먼저 생성되는 것을 볼 수 있다. 스프링 컨테이너는 기본적으로 bean으로 등록된 순서로 객체를 생성하지만 Construction Injection을 위해 매개변수로 사용되는 객체는 먼저 만든다.
'BackEnd > Spring' 카테고리의 다른 글
[Construction Injection] 다중 변수 매핑 (0) | 2023.04.28 |
---|---|
[Construction Injection] 의존관계 변경 (0) | 2023.04.28 |
[Spring] IoC, DL, DI 란? (0) | 2023.04.27 |
[Spring] XML 파일 설정 (태그 및 속성) (0) | 2023.04.27 |
[Intellij] Bean 클래스 등록 및 스프링 컨테이너 구동 (0) | 2023.04.23 |