@Autowired
- required : ๊ธฐ๋ณธ๊ฐ์ true (๋ฐ๋ผ์ ๋ชป ์ฐพ์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์คํจ)
@Autowired๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ์๋๋ฐ ์ด๋ป๊ฒ ๋น์ผ๋ก ๋ฑ๋ก์ด ๋๊ฑธ๊น?
์ด๋ค ๋น์ด ๋๋ ํด๋์ค์
์์ฑ์๊ฐ ์ค์ง ํ๋๋ง ์๊ณ ๊ทธ ์์ฑ์์ ๋งค๊ฐ๋ณ์ ํ์
์ด ๋น์ผ๋ก ๋ฑ๋ก์ด ๋์ด์๋ค๋ฉด
@Autowired๊ฐ ์๋๋ผ๋ ์๋์ผ๋ก ์ฃผ์
์ ์์ผ์ค๋ค.
Repository๋ผ๋ interface ๋ฅผ ๊ตฌํํ interface๋ Spring Data JPA์์ .. LifeCycle .. ์ด์ฉ๊ณ ์์ bean์ผ๋ก ์๋์ผ๋ก ๋ฑ๋กํด์ค๋ค.... ๊ทธ๋์ ๋ฐ๋ก @Autowired๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ์์ด๋ bean์ผ๋ก ๋ฑ๋ก์ด ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด @Autowired ๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ์ ์ ์ฌ๋ผ์ง๋ค๊ณ ํ๋ค. ์ด๋ฐ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ฉด.
์ฌ์ฉํ ์ ์๋ ์์น
@Autowired / @Inject๋ฅผ ์ด๋์ ๋ถ์ผ๊น?
- ์์ฑ์ ( ์ด๋ ํ ํด๋์ค์ ๋ฐ๋์ ํ์ํ ์์กด์ฑ์ด๋ค ํ๋ฉด ์์ฑ์)
๋น์ด ์์ผ๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑ์ ํ์ง ๋ชปํ๋ค. ->
- Setter (๋ง์ฝ *์ด๋ ์์กด์ฑ์ ๋ํ Setter๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด Setter)
*์ด๋ ์์กด์ฑ -> private final PetRepository pets;
- ํ๋ (Setter๊ฐ ์๋ค๋ฉด .. ํ์ง๋ง @Autowired๋ฅผ ์ํด์ ๊ตณ์ด Setter๋ฅผ ๋ง๋ค์ด์๊น์ง ํ ํ์๋ ์๋ค.)
๋ด๊ฐ ์ด๋ค ๋น์ ์ฃผ์ ๋ฐ์๋์ง ํ์ธ ํ๊ณ ์ถ์๋
1. Runner๋ฅผ ํ๋ ๋ง๋ค์ด ์ค๋ค. (implements ApplicationRunner)
2. ๋น์ ์ฃผ์ ๋ฐ์ผ๋ฉด, ์ฃผ์ ๋ฐ์ ๋น์ ํด๋์ค์ด๋ฆ์ ์ถ๋ ฅํ๊ฒ๋ ํด์ค๋ค.
3. @Primary - ๊ฐ์ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ ์ผ๋
๊ฐ์ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ์ฌ๋ @Primary๋ก ๋ฑ๋กํด์ฃผ๋ฉด ๊ทธ ๋น์ด ์ฃผ์ ์ด ๋๋ค.
์๋๋ ์คํํ์๋์ ์ถ๋ ฅ๋ฌธ ์ด๋ค.
๊ฐ์ ํ์ ์ ๋น์ด ์ฌ๋ฌ๊ฐ์ผ๋, ๋ช ํํ๊ฒ ํ์๋ฅผ ์ํด์ฃผ๋ฉด ์ค๋ฅ๊ฐ ๋๋ค.
๊ทธ๋ฆฌํ์ฌ ์ด ์ค๋ฅ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ง๊ฐ ์๋ค.
- @Primary ("์ด ๋น์ ๋ฐ์๊ฑฐ๋ค" ๋ผ๊ณ ๋งํนํ๋ ์ฉ๋)
- ํด๋น ํ์ ์ ๋น ๋ชจ๋ ์ฃผ์ ๋ฐ๊ธฐ
- @Qualify (๋น ์ด๋ฆ์ผ๋ก ์ฃผ์ )
@Primary
์ด ๋น์ ์ฃผ์ ํ๋๋ก ํ์ํ๋ ์ฉ๋.
@Qualifier (๋น ์ด๋ฆ์ผ๋ก ์ฃผ์ ) *์ด ๋ฐฉ๋ฒ๋ณด๋จ @Primary๊ฐ ๋ ์์ ํ๋ค.
ํ๋์๋ค๊ฐ ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋ค.
@Autowired @Qualifier("๋น์ ์ด๋ฆ")
ํด๋น ํ์ ์ ๋น ๋ชจ๋ ์ฃผ์ ๋ฐ๊ธฐ
๋ชจ๋ ํ์ ์ ๋น์ ์ฃผ์ ๋ฐ์ผ๋ ค๋ฉด ์์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ด ์ถ๋ ฅ์ด ๋๋ค.
๋์ ์๋ฆฌ
- BeanPostProcessor
- ์๋ก ๋ง๋ ๋น ์ธ์คํด์ค๋ฅผ ์์ ํ ์ ์๋ ๋ผ์ดํ ์ฌ์ดํด ์ธํฐํ์ด์ค
- AutowiredAnnotationBeanPostProcessor extends BeanPostProcessor
- ์คํ๋ง์ด ์ ๊ณตํ๋ @Autowired @Value ์ ๋ ธํ ์ด์ ๊ทธ๋ฆฌ๊ณ JSR-330์ @Inject์ ๋ ธํ ์ด์ ์ ์ง์ํ๋ ์ ๋ ธํ ์ด์ ์ฒ๋ฆฌ๊ธฐ
์ถ์ฒ : http://blog.naver.com/PostView.nhn?blogId=edy5016&logNo=221280377077
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, @Autowired ์ ๋ ธํ ์ด์ ์ BeanPostProcessor๋ผ๋ ๋ผ์ดํ ์ฌ์ดํด ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ AutowiredAnnotationBeanPostProcessor์ ์ํด ์์กด์ฑ ์ฃผ์ ์ด ์ด๋ฃจ์ด์ง๋ค.
BeanPostProcessor๋ ๋น์ initializing(์ด๊ธฐํ) ๋ผ์ดํ ์ฌ์ดํด ์ด์ , ์ดํ์ ํ์ํ ๋ถ๊ฐ ์์ ์ ํ ์ ์๋ ๋ผ์ดํ ์ฌ์ดํด ์ฝ๋ฐฑ์ด๋ค.
๊ทธ๋ฆฌ๊ณ BeanPostProcessor์ ๊ตฌํ์ฒด์ธ AutowiredAnnotationBeanPostProcessor๊ฐ ๋น์ ์ด๊ธฐํ ๋ผ์ดํ ์ฌ์ดํด ์ด์ , ์ฆ ๋น์ด ์์ฑ๋๊ธฐ ์ ์ @Autowired๊ฐ ๋ถ์ด์์ผ๋ฉด ํด๋นํ๋ ๋น์ ์ฐพ์์ ์ฃผ์ ํด์ฃผ๋ ์์ ์ ํ๋ ๊ฒ์ด๋ค.
์์ ๋น ๋ผ์ดํ ์ฌ์ดํด์ ๋ณด๋ฉด 12. ๋น ์ด๊ธฐํ ์ด์ , ์ดํ๋ฅผ BeanPostProcessors๊ฐ ๊ฐ์ธ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
AutowiredAnnotationBeanPostProcessor๋ ํ๋์ ๋น์ผ๋ก์จ spring IoC ์ปจํ ์ด๋์ ๋ฑ๋ก๋์ด ์๋ค.
BeanFactory(ApplicationContext)๋ BeanPostProcessor ํ์ ์ ๋น = AutowiredAnnotationBeanPostProcessor ๋น์ ๊บผ๋ด ์ผ๋ฐ์ ์ธ ๋น๋ค = @Autowired๋ก ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ๋น๋ค์๊ฒ @Autowired๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ์ ์ฉํ๋ค.
12๋จ๊ณ์๋ ์ฌ์ค์ ์ด๋ฏธ ๋น๋ค์ด ์ฃผ์ ์ด ๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ํ ์๊ฐ ์๊ฒ๋๋ค.
@Service
public class EventLService {
@Autowired
MyBookRepository myBookRepository;
@PostConstruct
public void setup(){
System.out.println(myBookRepository.getClass());
}
}
์ถ๋ ฅ์ด ๋๋ ์์น๊ฐ Runner์๋ ๋ค๋ฅด๋ค. Spring-boot๊ฐ ์ง์ํ๋ ApplicationRunner๋ applicaion์ด ์์ ํ ๊ตฌ๋์ด ๋์๋, ๊ทธ ๋ค์์ ์ฒ๋ฆฌ๊ฐ ๋๋ ๊ฑด๋ฐ, ์ด @PostConstruct ๋ผ์ดํ ์ฌ์ดํด ๊ฐ์ ๊ฒฝ์ฐ์๋ application ๊ตฌ๋์ค(12 ๋จ๊ณ)์ ์ฐํ๊ฒ ๋๋ค.
BeanFactory๊ฐ ์์ ์์ ๋ฑ๋ก๋์ด์๋ BeanPostProcessors๋ฅผ ์ฐพ๊ฒ ๋๊ณ , ๊ทธ ๊ตฌํ์ฒด ์ค AutowiredAnnotaionBeanPostProcessor๋ฅผ ๊ฐ ๋น๋ค์๊ฒ ์ ์ฉ์ ์ํค๊ฒ ๋๋ค. (์ ์ดํด๊ฐ ์๋์ง๋ง..)
- AutowiredAnnotationBeanPostProcessor ๊ฐ ๋น์ผ๋ก ๋ฑ๋ก๋์ด์๋์ง ์ง์ ๊บผ๋ด์ ์ถ๋ ฅํด๋ณด์.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext applicationContext;
@Override
public void run(ApplicationArguments args) throws Exception {
AutowiredAnnotationBeanPostProcessor bean = applicationContext.getBean(AutowiredAnnotationBeanPostProcessor.class);
System.out.println(bean);
}
}
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor@43c87306