Spring

[Spring] 예제로 공부하는 IoC - Dependecies (제어의 역전 - 의존성)

KEMON 2020. 4. 19. 21:58
728x90

1. Constructor-based Dependency Injection (생성자 기반의 의존성 주입)

package examples;

public class ExampleBean {

    // Number of years to calculate the Ultimate Answer
    private int years;

    // The Answer to Life, the Universe, and Everything
    private String ultimateAnswer;

    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}

위와 같이 자바의 생성자가 정의될 때 new ExampleBean(7500000,"42"); 이런식으로 사용하는 방법 대신 xml에서 아래와 같이 의존성 주입을 할 수 있다. 

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>

생성자 기반의 의존성 주입은 constructor-arg 를 사용한다. 위와 같은 방식 외에도 아래와 같이 index를 사용하여 주입이 가능하다. 

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>

2. Setter-based Dependency Injection (Setter 기반의 의존성 주입)

public class ExampleBean {

    private AnotherBean beanOne;

    private YetAnotherBean beanTwo;

    private int i;

    public void setBeanOne(AnotherBean beanOne) {
        this.beanOne = beanOne;
    }

    public void setBeanTwo(YetAnotherBean beanTwo) {
        this.beanTwo = beanTwo;
    }

    public void setIntegerProperty(int i) {
        this.i = i;
    }
}

위와 같이 자바의 Setter를 정의할 때 xml에서 아래와 같이 의존성 주입을 할 수 있다.

 

<bean id="exampleBean" class="examples.ExampleBean">
    <!-- setter injection using the nested ref element -->
    <property name="beanOne">
        <ref bean="anotherExampleBean"/>
    </property>

    <!-- setter injection using the neater ref attribute -->
    <property name="beanTwo" ref="yetAnotherBean"/>
    <property name="integerProperty" value="1"/>
</bean>

<bean id="anotherExampleBean" class="examples.AnotherBean"/>
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>

Setter Injection에서는 constructor-arg 대신 property를 사용한다.

name에는 setter에서 set뒤의 함수명을적는다.  

 

*** 생성자 DI와 Setter DI의 차이점 ***

  • 생성자 DI : 객체가 만들어질 때 단 한번만 동작 (생성할 때에만 필요한 코드에 사용)
  • Setter DI : 코드가 돌다가 객체의 dependency를 변경하고 싶을 때 (runtime 어느 시점에든 관계 재설정 가능)
  • 복잡함을 방지하기위해 가능하면 생성자 DI를 사용하는 것이 좋다. (공식 문서에서도 생성자 DI를 추천!)

 

3. Using depends-on

<bean id="beanOne" class="ExampleBean" depends-on="manager"/>
<bean id="manager" class="ManagerBean" />

 

 

4. Autowiring Collaborators

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>

 

<bean id="exampleBean" class="examples.ExampleBean" autowire="constructor"/>

 

autowire = "constructor"로 생성자를 xml에서 지정하지않고 자동으로 설정해준다 . 

설정시 편하지만 나중에 어떤 빈하고 관계가 맺어지는지 찾는게 힘드니까 명시적으로 constructor-arg를 설정해주는게 좋다.

 

예제코드 출처(Spring 공식문서) : https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-dependencies

 

 

728x90