BackEnd/Spring

[Spring] Constructor Injection 기본 사용법

코딩마루 2023. 4. 27. 23:21

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을 위해 매개변수로 사용되는 객체는 먼저 만든다.