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
'Spring' 카테고리의 다른 글
[Spring] 예제로 보는 Ioc Container - Customizing the Nature of a Bean (0) | 2020.04.30 |
---|---|
[Spring] 예제로 보는 Bean Scope (Feat. 동일성, 동등성) (0) | 2020.04.29 |
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] PostsUpdateRequestDto 오류 (0) | 2020.03.25 |
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] Chapter 3 실습 오류 (0) | 2020.03.24 |
Maven을 사용하는 이유 (0) | 2019.12.27 |