@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
어떤 객체가 다른 객체를 의존하는 관계에 있을때, 다른 객체를 생성(new)하여 사용하는 것이 아닌 해당 객체를 주입받아서 사용하는 방법이다. 필드주입방식과, setter주입방식, 생성자 주입방식이 있다.
@Autowired private MemberRepository memberRepository;
바로 @Autowired 어노테이션을 붙여 해당 클래스를 고정적으로 주입한다. 다른 클래스와 교체할 수 가 없다는 단점이 있어서 거의 사용되지 않는다.
private MemberRepository memberRepository;
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
setter를 통해 클래스를 주입시킨다. 클래스를 유동적으로 바꿀 수 있다는 장점이 있으나, public이기 때문에 위험하고, 중간에 class를 변경시킬 이유가 거의 없으므로 지양한다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
가장 많이 쓰이는 생성자 주입 방식이다. 생성자를 통해 해당 클래스를 주입받는다. 수동적으로 주입받는다는 특성이 있으며, 중간에 변경이 불가해 적절하게 유연한 방법으로 가장 많이 사용된다.