티스토리 뷰

의존성 주입을 위해 사용되는 어노테이션은 @Autowired, @Resource, @Inject 가 있는데 이 중 비슷한 @Autowired@Inject를 비교해보자.

 

@Autowired vs @Inject

@Autowired
private InjectionBean injectionBean;
@Inject
private InjectionBean injectionBean;

두 어노테이션 모두 컨테이너상에서 데이터 타입이 같은 Bean을 찾아 의존성을 주입해주는 방식으로 주입 방식과 역할은 동일하며 2가지 차이점을 제외하면 이 둘은 거의 동일하다고 볼 수 있다. 

 

차이점

1. 스프링 컨테이너에 Bean 객체가 존재하지 않을 경우 예외처리 방식

이럴 경우는 거의 없겠지만, 프로그래머가 컨테이너에 Bean을 생성하지 않고 자동주입을 시도하게되면 예외가 발생하게되는데, @Autowired는 이런 예외처리를 할 수 있다.

@Autowired(required = false)
private InjectionBean injectionBean;

그러나 property말고도 생성자, Setter 등 Bean을 가져오는 요소들에 모두 required를 적용해줘야 하기 때문에 번거로울 뿐 아니라, 컨테이너에 생성하지 않은 Bean을 자동주입 하는 상황이 발생할 가능성이 희박하기 때문에 큰 의미를 가지긴 어렵다.

 

2. 스프링 컨테이너에 동일한 타입을 가진 Bean이 두 개 이상 존재할 때 예외처리 어노테이션

@Autowired 같은 경우 같은 타입의 Bean이 두 개 이상 존재할 때, 컨테이너상에 명시한 <qualifier> 태그의 value 속성 값을 @Qualifier 어노테이션에 명시해주면 된다.

<bean id="injectionBean1" class="scope.ex.InjectionBean">
    <qualifier value = "injectionBean1"/>
</bean>
<bean id="injectionBean2" class="scope.ex.InjectionBean">
    <qualifier value = "injectionBean2"/>
</bean>
<bean id="injectionBean3" class="scope.ex.InjectionBean">
    <qualifier value = "injectionBean3"/>
</bean>

Controller

@Autowired(required = false)
@Qualifier("injectionBean1")
private InjectionBean injectionBean;

 

 

@Inject는 컨테이너상에 <qualifier> 태그를 명시할 필요 없이 @Named 어노테이션에 Bean id 값을 지정해줌으로써 해당 상황을 처리할 수 있다.

Controller

@Inject
@Named(value="injectionBean1")
private InjectionBean injectionBean;

 

 

 

출처 : [인프런] 자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함