해결된 질문
작성
·
128
1
안녕하세요 영한님,
Dependency Injection에 관해서 궁금한점이 있어 질문드립니다. 제가 실무중이나 code review중에 아래같은 코드를 자주봤는데 지금까지는 그냥 그런가보다 하고 넘어갔지만, 그래도 강사님께 좀 자세한 mechanism을 들으면 좀더 개념확립에 도움이 될것같아서 질문드립니다.
//SecretVault.java
@Component
public class SecretVault {
private final String secret = "Secret123";
public SecretVault() {
}
public String getSecret() {
return this.secret;
}
}
//SecretService.java
public class SecretService {
private SecretVault vault;
public SecretService() {
}
public SecretService(SecretVault vault) {
super();
this.vault = vault;
}
public String revealSecret() {
return vault.getSecret();
}
}
//CoreApplication.java
@SpringBootApplication
public class CoreApplication {
public static void main(String[] args) {
SpringApplication.run(CoreApplication.class, args);
}
@Bean
SecretService secretService(SecretVault vault) {
return new SecretService(vault);
}
}
//테스트 클래스
//JUnit Test Pass
//MiscTest.java
@SpringBootTest
public class MiscTest {
@Autowired
ApplicationContext ac;
@Test
void testSecret() {
SecretService service = (SecretService) ac.getBean("secretService");
Assertions.assertEquals(service.revealSecret(), "Secret123");
}
}
테스트 결과, secretService bean안에 vault 필드가 제대로 주입되어있습니다. 빈 생성하는 method parameter가 spring이 관리하는 bean이면 저절로 찾아서 넣어주나요? 저는 method parameter bean이 같은 configuration 클래스 안에서 생성되었을 경우에만 가능한걸로 알았는데, 위 예제의 dependency injection이 어떻게 일어나는지 궁금합니다.
답변 1
0
안녕하세요. SeokHoon Kim님, 공식 서포터즈 코즈위버입니다.
SecretService 는 @Bean 어노테이션으로, SecretVault는 @Component 어노테이션으로 모두 빈으로 등록하여 관리하게 됩니다. 이처럼 스프링 빈 끼리는 의존성 주입을 지원합니다. 그래서 valut 값이 제대로 조회가 됩니다.
감사합니다.
docs.spring.io 에서 답변을 찾았습니다.
" A @Bean
-annotated method can have an arbitrary number of parameters that describe the dependencies required to build that bean. The resolution mechanism is pretty much identical to constructor-based dependency injection."
그냥 생성자 주입과 똑같은 원리로 작동하는것 같습니다.
답변 감사합니다. @Autowired가 없는데 의존성주입을 자동으로 해주는건가요?
보통 아래처럼 직접 Configuration 클래스에서 @Autowired로 의존주입을 받아서 넣어주거나,
직접 SecretService에서 @Autowired를 써서 의존성주입을 해결하는건 알겠는데,
위에 코드는 그런게 전혀없어서 bean declaration method (
SecretService secretService(SecretVault vault)
)의 parameter에 어떻게 빈이 주입되는지가 궁금합니다. @Bean으로 빈등록을 하면 메서드 파라미터에 있는 모든 빈들을 찾아서 그냥 넣어주는건가요?