Summary
- @Autowired 사용과 동작원리에 대해 알아본다.
@Autowired
- 필요한 의존 객체의 타입에 해당하는 빈을 찾아 주입한다.
- 선언한 빈을 못 찾으면 애플리케이션 구동 안된다.
boolean required() default true;
사용할 수 있는 위치
1) 생성자
스프링 4.3 부터는 생략 가능
2) 세터
3) 필드
경우의 수
1) 해당 타입의 빈이 없는 경우
- 구동이 안된다.
- 굳이 구동시키고 싶다면 required = false.
2) 해당 타입의 빈이 한 개인 경우
- 구동 된다.
3) 해당 타입의 빈이 여러 개인 경우
public interface AllService {
}
@Service
public class AService implements AllService {
}
@Service
public class BService implements AllService {
}
@Service
public class OtherService {
//찾을 수 없다.
@Autowired
private AllService allService;
}
- 구동이 안된다.
해결 방법1. @Primary
- 우선 순위를 정한다.
- AService 혹은 BService에 선언한다.
해결 방법2. @Qualifier
- 빈의 이름을 기입한다.
- 기본적으로 빈의 camelCase가 이름이다.
@Service
public class OtherService {
@Autowired @Qualifier("aService")
private AllService allService;
}
동작 원리
- BeanPostProcessor라는 LifeCycle Interface의 구현체에 의해 동작.
BeanPostProcessor
- 빈의 인스턴스를 만드는 LifeCycle이 있다.
- BeanPostProcessor는 빈의 initialization Life Cycle 이전과 이후에 또 다른 부가적인 작업을 할 수 있는 LifeCycle CallBack.
1) @PostConstuct
@Service
public class OtherService implements InitializingBean {
@Autowired
private AllService allService;
@PostConstruct
public void setUp() {
//do...
}
}
2) InitializingBean
@Slf4j
@Service
public class OtherService implements InitializingBean {
@Autowired
private AllService allService;
@Override
public void afterPropertiesSet() throws Exception {
//do...
}
}
AutowiredAnnotationBeanPostProcessor
- BeanPostProcessor를 상속받고 있다.
- 다음은 빈 초기화 LifeCycle 일부이다.
- BeanPostPorcessor는 이중 두가지 메서드를 제공한다.(11, 14)
- BeanPostProcessor의 postProcessBeforeInitialization() LifeCycle에
- AutowiredAnnotationBeanPostProcessor가 동작해서 @Autowired 라는 Annotation을 찾아 해당 타입의 Bean을 주입해 준다.
Next
- 추후에 AutowiredAnnotationBeanPostProcessor가 동작을 더 자세하게 알아봐야겠다.