스프링은 컴포넌트 스캔을 통해 Bean을 자동으로 생성하고 스프링 컨테이너에 해당 Bean들을 저장하여 관리한다.
Bean들을 자동으로 생성할 때 스프링 내부에서 자동으로 의존관계들을 주입하는 4가지 방법이 있다. 알아보자!
생성자를 통해 의존관계를 주입하는 방법이다.
의존관계가 불변이거나, 필수 의존관계에 사용하면 좋다.
@Component
public class TestServiceImpl implements TestService{
private final TestRepository testRepository;
private final TestPolicy testPolicy;
@Autowired //생성자가 1개일 경우 생략 가능
public TestServiceImpl(TestRepository testRepository, TestPolicy testPolicy) {
this.testRepository = testRepository;
this.testPolicy = testPolicy;
}
}
생성자가 1개일 경우 @Autowired를 생략 할 수 있다.
lombok을 사용 할 경우 @RequiredArgsConstructor를 통해 코드를 더 간단히 할 수 있다.
@Component
@RequiredArgsConstructor
public class TestServiceImpl implements TestService{
private final TestRepository testRepository;
private final TestPolicy testPolicy;
}
수정자(setter)를 통해 의존 관계를 주입하는 방법이다.
의존관계가 선택적으로 주입되거나, 변경 가능성이 있는 의존관계에 사용하면 좋다.
setter를 public으로 열어두어야 하기 때문에 누군가 변경 할 여지가 있어서 좋은 방법은 아니다.
@Component
public class TestServiceImpl implements TestService{
private TestRepository testRepository;
private TestPolicy testPolicy;
@Autowired
public void setTestRepository(TestRepository testRepository) {
this.testRepository = testRepository;
}
@Autowired
public void setTestPolicy(TestPolicy testPolicy) {
this.testPolicy = testPolicy;
}
}
만약 스프링 프로젝트를 시작할 때 주입할 대상없이 일단 동작하게 하려면 '@Autowired(required = false)'로 지정해주면 된다
필드에서 바로 주입하는 방법이다.
코드가 간결하여 사용하기는 편하지만, 외부에서 변경이 불가능하여 테스트하기 어렵다.
추가로 DI 프레임워크가 없으면 아무것도 할 수 없다는 단점이 있다.
있다는 것만 알아두고 사용하지 말자. (Test할때는 사용해도 OK)
@Component
public class TestServiceImpl implements TestService{
@Autowired
private TestRepository testRepository;
@Autowired
private TestPolicy testPolicy;
}
일반 메서드를 통해 주입하는 방법이다.
일반적으로 사용하지 않는다.
참고로만 알아두고 사용하지 말자.
@Component
public class TestServiceImpl implements TestService{
private TestRepository testRepository;
private TestPolicy testPolicy;
@Autowired
public void init(TestRepository testRepository, TestPolicy testPolicy) {
this.testRepository = testRepository;
this.testPolicy = testPolicy;
}
}