스프링에서 의존 관계 주입은 빈의 생성자나 세터 메서드에 인수를 넘기는 방식으로 이루어 진다.
세터 기반 DI (수정자 주입)
세터 기반 DI에서는 property 엘리먼트를 사용해 빈 의존 관계를 설정했다.
@Component
public class PersonalBakingService{
private JmsMessageSender jmsMessageSender;
private EmailMessageSender emailMessageSender;
// 각 의존관계마다 세터 메서드를 정의한다.
@Autowired
public void setJmsMessageSender(JmsMessageSender jmsMessageSender){
this.jmsMessageSender = jmsMessageSender;
}
@Autowired
public void setEmailMessageSender(EmailMessageSender emailMessageSender){
this.emailMessageSender = emailMessageSender;
}
}
PersonalBakingService 클래스와 의존 관계인 빈 정의
<bean id = "PersonalBankingService" class="PersonalBankingService">
<property name = "emailMessageSender" ref="emailMessageSender" />
<property name = "jmsMessageSender" ref = "jmsMessageSender" />
</bean>
생성자 기반 DI
현재 내가 실무에서 사용하고 있는 방법.
이름 그대로 생성자를 통해서 의존 관계를 주입 받는다.
생성자 기반 DI에서는 빈의 의존 관계를 빈 클래스 생성자의 인수로 전달한다.
@Component
public class PersonalBankingService{
// 스프링이 PersonalBakingService 객체를 생성할 때 생성자를 주입한다.
private final JmsMessageSender jmsMessageSender;
private final EmailMessageSender emailMessageSender;
// 생성자 인수는 클래스의 의존관계를 표현한다.
// 생성자가 딱 1개 있으면 @Autowired 를 생략해도 자동 주입된다.
@Autowired
public PersonalBankingService(JmsMessageSender jmsMessageSender, EmailMessageSender emailMessageSender){
this.jsmMessageSender = jmsMessageSender;
this.emailMessageSender = emailMessageSender;
}
}
PersonalBankingService 빈 정의
<bean id = "PersonalBankingService" class="PersonalBankingService">
//contructor-arg 엘리먼트는 PersonalBankingService 인스턴스의 생성자에 전달할 인수를 지정한다. index 속성값이 '0'이면 생성자의 첫번째 인수에 해당
<constructor-arg index="0" ref="emailMessageSender" />
<constructor-arg index="1" ref = "jmsMessageSender" />
</bean>
생성자 주입 방식을 사용해야 한다.
< 불변 >
< 누락 >