@Autowired는 type에 따라 자동으로 객체를 찾아서 저장해준다.

해당 그림처럼 스프링의 ApplicationContext(BeanFactory)는 내부적으로 Bean을 Map형태로 저장하고 관리한다.
만약 @Autowired를 사용하지 않고 해당 객체를 불러오려면
ApplicationContext ac = new AppContext();
Car car = (Car)ac.getBean("car");
Engine engine = (Engine)ac.getBean("engine");
Door door = (Door)ac.getBean("door");
car.engine=engine;
car.door=door;
이와 같이 getBean()을 직접 호출하여 객체를 가져오고, 수동으로 할당해줘야 한다.
하지만 @Autowired를 사용하게 되면
class Car{
@Autowired Engine engien;
@Autowired Door door;
}
이와같이 스프링이 자동으로 Engine과 Door를 주입해준다.
(개발자가 직접 getBean() 호출 할 필요 없음)
이는 내부적으로 스프링 컨테이너가 Map<String, Object> 형태로 빈을 저장하고 해당 타입의 객체를 스스로 찾아 Car 객체에 주입해주는 것이다.
@Resource 어노테이션은 @Autowired와 비슷하지만 타입이 아닌 이름을 기준으로 Bean을 주입하는 것이다.
@Component("carService")
public class CarService{}
---------------------------
@Service
public class CarController{
@Resource(name="carService")
private CarService service;
}
이는 이름이 carService인 빈을 찾아 주입해주는 것이다.
위에 코드에서 @Component("carService")라고 빈의 이름을 설정해주었기 때문에 해당 객체가 정상적으로 주입이 된다.
@Component
public class Engine{}
------------------------------
@Service
public class Car{
@Resource
private Engine engine;
}
name이 따로 지정되어있지 않은 경우, 동일한 타입을 가지는 빈 객체를 찾는다.
하지만 이때 동일한 타입을 가지는 빈 객체가 두 개 이상 존재하면
1. 두 개 이상의 빈들 중 동일한 이름을 가진 빈 객체를 찾는다.
2. 두 개 이상의 빈들 중 동일한 이름을 가진 빈 객체가 없는 경우 @Qualifier를 이용해 주입할 빈 객체를 찾는다.
@Qualifier - 빈의 이름을 결정해주는 어노테이션