728x90
반응형
Annotation을 사용하는 이유
- XML 파일의 과도한 설정으로 인한 부담을 덜어준다.
Context 네임스페이스 추가
- 어노테이션을 사용하기 위함.
- 스프링 설정 파일(applicationContext.xml)
context 네임스페이스 추가하기.
컴포넌트 스캔(component-scan)설정
- 스프링 설정 파일에 사용할 객체들을 등록하지 않고 자동으로 생성
- 스프링 설정 파일(applicationContext.xml)
<context:component-scan> 설정을 제외한 나머지 <bean> 설정은 삭제하거나 주석처리.
base-package는 해당 패키지로 시작하는 모든 클래스들을 스캔 대상으로 지정한다는 의미다.
@Component
- 클래스 선언부 위에 설정한다.
XML 설정
<bean id="tv" class = "polymorphism.LgTV"></bean>
Annotation 설정
@Component("tv")
public class LgTV implements TV{
public LgTV(){
System.out.println("===> LgTV 객체생성");
}
}
** id, name 속성을 지정하지 않으면 컨테이너가 자동으로 이름을 설정한다. 이때 규칙은 첫 글자가 소문자인 클래스 이름이다.
실행 결과
의존성 주입 어노테이션
어노테이션 | 설명 |
@Autowired | 주로 변수 위에 설정해 해당 타입의 객체를 찾아서 할당한다. org.springframework.beans.factory.annotation.Autowired |
@Qualifier | 특정 객체의 이름을 이용해 의존성 주입할 때 사용한다. org.springframework.beans.factory.annotation.Qualifier |
@Inject | @Autowired와 동일한 기능을 제공한다. javax.annotation.Resource |
@Resource | @Autowired와 @Qualifier의 기능을 결합한 어노테이션이다. javax.inject.Inject |
@Autowired
- 생성자나 메소드, 멤버변수 위에 사용한다.
- @Autowired를 확인하는 순간, 그 타입의 객체가 메모리에 존재하는지를 확인한 후에 그 객체를 변수에 주입한다.
LgTV클래스에 멤버변수 추가하고 의존관계설정
XML 설정
<bean id ="sony" class="polymorphism.SonySpeaker"/>
Annotation 설정
@Component("sony")
public class SonySpeaker implements Speaker{
public SonySpeaker(){
System.out.println("====> SonySpeaker 객체생성");
}
}
@Qualifier
- 의존성 주입 대상 객체가 2개 이상일 경우 문제가 발생한다.
- 예) AppleSpeaker와 SonySpeaker 객체가 생성된 경우
에러메시지
WARN : org.springframework.context.support.GenericXmlApplicationContext
- Exception encountered during context initialization
- cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'tv':
Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field: private polymorphism.Speaker polymorphism.LgTV.speaker;
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [polymorphism.Speaker] is defined:
expected single matching bean but found 2: apple,sony
이러한 문제를 해결하기위해 @Qualifier 어노테이션을 제공한다.
@Autowired와 @Qualifier를 다음과 같은 변수 위에 사용
실행 결과 - 정상 작동
@Resource
- @Autowired는 변수의 타입을 기준으로 객체를 검색
- @Resource는 객체의 이름을 기준으로 검색해 주입한다.
어노테이션과 XML 설정 병행해 사용하기
1. XML 설정
- 장점 : 자바소스를 수정하지 않고 XML 파일의 설정만 변경하면 실행되는 Speaker를 교체할 수 있어 유지보수가 편하다.
- 단점 : XML 설정에 대한 부담이 존재한다.
2. 어노테이션 설정
- 장점 : XML 설정에 대한 부담이 없고, 의존관계에 대한 정보가 자바소스에 들어있어 사용하기에 편리하다.
- 단점 : 주입할 객체의 이름이 자바소스에 명시되어야 하므로 자바소스를 수정하지 않고 Speaker를 교체할 수 없다.
순서
LgTV 클래스 speaker 변수를 원래대로 @Autowired 어노테이션만 설정 -> AppleSpeaker,SonySpeaker 클래스 @Component 제거해 객체가 자동으로 생성되는 것 차단 -> 둘 중 하나만 스프링 설정 파일에 <bean> 등록해 처리하면 완료
Autowired만 남겨놓기
Component 제거
Sony와 Apple중 하나만 남겨놓기
추가 어노테이션
어노테이션 | 위치 | 의미 |
@Service | XXXServicelmpl | 비즈니스 로직을 처리하는 Service 클래스 |
@Repository | XXXDAO | 데이터베이스 연동을 처리하는 DAO 클래스 |
@Controller | XXXController | 사용자 요청을제어하는 Controller 클래스 |
728x90
반응형
최근댓글