본문 바로가기
⚙️Backend/Spring

[Spring] DI (Dependency Injection) part 6

by Bㅐ추 2020. 5. 30.
728x90
반응형

2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 1

2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 2

2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 3

2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 4

2020/05/30 - [🌎Web Application/Spring] - [Spring] DI (Dependency Injection) part 5

 

 

2. Annotation 방식

@Component

빈을 등록하길 원하는 클래스에 추가.
<context:component-scan> 태그에 spring이 bean으로 등록할 클래스가 위치한 패키지를 지정.

해당 어노테이션이 붙은 클래스는 모두 빈으로 생성. <bean id="..."></bean>과 같다. 이때 id는 클래스의 이름이자 앞 글자가 소문자인 이름. 

*클래스 명이 SomeClass면 id는 someClass가 기본값.
*bean이름을 직접 지정할 경우, @Component("mySomeClass") 로 지정.

 

<context:component-scan base-package="com.test01.anno"></context:component-scan>

=> base-package 안에 정의한 패키지의 컴포넌트들을 스캔하겠다. / annotation을 달아 둔 클래스들을 스캔하겠다. / 해당 패키지 안에 있는 클래스들을 다 스캔한다는 뜻이다. 

 

 

@Autowired

주입하려고 하는 객체의 타입이 일치하는지를 찾고  생성되어 있는 빈을 자동으로 주입.

만약에 타입이 존재하지 않는다면 @Autowired에 위치한 속성명이 일치하는 bean을 컨테이너에서 찾는다. 그리고 이름이 없을 경우 나중에 포스팅할 @Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입한다.

 

(정리) 타입 => 이름 => Qualifier => Fail

-spring에서 의존관계를 자동으로 설정. 

-byType으로 의존관계를 자동으로 설정할 경우 같은 타입의 bean이 2개 이상 존재하게 되면 예외 발생.

--> @Qualifier("test") 를 이용하여 특정 빈을 사용하도록 하여 문제 해결 가능. 같은 타입의 bean들 중 test를 사용하겠다.

@Qualifier

 @Autowired 어노테이션이 타입기반 이기에 같은 타입 2개 이상 존재할 경우
특정 bean을 사용하도록 선언.

 

@Resource

이름을 기준으로 객체를 찾는다. 만일 이름이 존재하지 않는다면 타입을 기준으로 자동적으로 객체를 찾아 주입한다. 마지막으로 @Qualifier 어노테이션의 유무를 판별한 후 그 어노테이션이 붙은 속성을 주입한다.

728x90
반응형