[Spring] 객체 찾기

유진·2025년 3월 13일

Spring

목록 보기
7/11

@Autowired

@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

@Resource 어노테이션은 @Autowired와 비슷하지만 타입이 아닌 이름을 기준으로 Bean을 주입하는 것이다.

1. name을 사용한 주입

@Component("carService")
public class CarService{}
---------------------------
@Service
public class CarController{
	@Resource(name="carService")
    private CarService service;
}

이는 이름이 carService인 빈을 찾아 주입해주는 것이다.
위에 코드에서 @Component("carService")라고 빈의 이름을 설정해주었기 때문에 해당 객체가 정상적으로 주입이 된다.

2. name을 생략한 경우

@Component
public class Engine{}
------------------------------
@Service 
public class Car{
	@Resource
    private Engine engine;
}

name이 따로 지정되어있지 않은 경우, 동일한 타입을 가지는 빈 객체를 찾는다.
하지만 이때 동일한 타입을 가지는 빈 객체가 두 개 이상 존재하면
1. 두 개 이상의 빈들 중 동일한 이름을 가진 빈 객체를 찾는다.
2. 두 개 이상의 빈들 중 동일한 이름을 가진 빈 객체가 없는 경우 @Qualifier를 이용해 주입할 빈 객체를 찾는다.

@Qualifier - 빈의 이름을 결정해주는 어노테이션

0개의 댓글