SPRING

DI Annotation

nang. 2019. 3. 25. 04:13
반응형
SMALL

- Spring에서의 annotation 활용

: Dependency Injection (bean wiring)

: Bean 탐색 및 등록

: Java code 기반 설정



- annotation을 처리하려면 BeanPostProcessor가 필요

: 번거로운 방법 - BeanPostProcessor 객체를 설정 파일에 bean으로 등록

: 일반적인 방법 - xml 파일에 <context:annotation-config /> 입력



- annotation은 일종의 인터페이스로 선언되어 있음





★ @Required

- setter 메소드 앞에 사용

- property의 값 또는 의존 객체가 반드시 설정되어야 함

- 설정되지 않으면 BeanInitializationException

- 그니까 bean 설정하면서 제대로 주입했나 코드 안빼먹었나 확인할 수 있으니까 좋음




★ @Autowired

- Auto-wiring 수행 (DI 자동수행)

- default : byType

- 생성자 앞, 필드 앞, 메소드 앞 다 사용 가능

- 같은 타입이 여러개면 에러 NoSuchBeanDefinitionException

- 근데 에러에서 끝나는게 아니고 일단 대안을 찾아봄

- byName으로 찾아봄

- byType ---> byName ---> 에러

- 같은 타입, 같은 이름 하나도 없어도 에러

- 속성 : required 

: 반드시 주입이 필요한지 여부

: default=true 즉, @Autowired 이면 반드시 DI가 실행되어야 함

: false 이면 할당할 bean이 없어도 에러는 안남

- collection 타입은 일단 각각의 원소를 다 주입함... 더 공부해


  • 필드나 세터 앞에 쓰기
: 필드 앞에 붙으면 세터 없어도 DI 가능
: 필드가 private이여도 접근 가능하다는건 내부적으로 세터가 있다는 얘기임
: 그래서 세터 없어도 주입 가능한거야
  • 생성자 앞에 쓰기
: 생성자가 여러개면 하나에만 붙여야 함
: required="false" 쓰면 되기도 함
  • 일반 메소드 앞에 쓰기

 

 

 

★ @Qualifier

- 자동 주입 가능한 의존 객체가 여러 개 존재할 때 특정 객체를 선택하도록 지정

- 특정 객체를 명시적으로 지정

- 항상 @Autowired 랑 같이 쓰임

- 같이 안쓰이고 혼자쓰이면 그건 그냥 별명 붙이기 용도

- 같이 써야 DI





★ @Resource
- JSR-250에 정의됨
- 객체를 직접 지정하고 검색해서 DI
- @Autowired + @Qualifier
- name 속성이랑 함께 쓰임
- @Resource(name="nang")
===> id가 nang인 객체를 여기다가 주입
===> 여길로 가져와 그리고 주입해
- name 속성 생략해도 돼
그러면 필드타입말고 필드이름을 name 값으로 사용함
- 즉, @Resource의 default는 byName
- byName 했다가 없으면 byType으로 뒤짐
- 객체가 없거나 여러개면 exception




★ @Inject
- JSR-330에 정의됨
- 사용하려면 maven에 별도 코드 필요
- @Autowired와 같음
- 그니까 byType
- 타입 맞는걸로 주입해라~ 여기다가~





★ @Named
- JSR-330에 정의됨
- 사용하려면 maven에 별도 코드 필요
- @Component
- @Qualifier
- 빈 등록 용도이기도하고(@Component) 별명이나 특정 주입이기도 하고(@Qualifier)






< Bean Scan >


★ @Component @Repository @Service @Controller @Configuration

- 이게 붙어있는거는 자동으로 bean으로 등록해라~

- 그러니까 xml 파일에 <bean~ 코드가 없어도 되지

- @Component("nang")

===> id가 nang인 bean이 등록된다

- id 따로 지정안할거면 안붙임

- 안붙이면? 클래스 이름이 id가 됨 / 클래스 이름 소문자로 한거



  • Bean Scan을 사용하려면(@Component...) xml 파일에
<context:component-scan base-package="탐색할패키지명" /> 
  • 써놓은 패키지 하위 클래스들을 다 뒤짐
  • <context:annotation-config /> 이거보다 상위 개념이라 scan 쓰면 config 다 됨

  • <context:include-filter /> : 자동 scan에 포함시킬 class 지정
  • <context:exclude-filter /> : 자동 scan에서 제외시킬 class 지정


반응형
LIST

'SPRING' 카테고리의 다른 글

Bean Scope (Bean 유효범위)  (0) 2019.03.28
DI Java Code  (0) 2019.03.27
Auto-wiring  (0) 2019.03.25
DI XML / SpEL (property 방식)  (0) 2019.03.19
DI XML / Collection Wiring (property 방식)  (0) 2019.03.19