일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- 오라클
- 봄 사랑 벚꽃 말고
- index
- 니가 참 좋아
- 악보
- 슬픔의 후에
- 장범준
- 스위트라떼
- 핑거스타일
- 인덱스
- DBMS
- 레이디스코드
- SQL 처리
- oracle
- 러블리즈
- I'm fine thank you
- 기타
- 데이터베이스
- 천공의 시간
- 6학년 8반 1분단
- IT
- 신입
- Inside Of Me
- 개발자
- db
- 오라클 아키텍처
- 말 더듬
- 아이유
- nginx
- DBMS 구성요소
취미로 음악을 하는 개발자
[Spring] 의존 객체 자동 주입 본문
// 의존 객체 자동 주입
: Spring 설정 파일에서 의존 객체를 주입할 때 <constructor-arg> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도 Spring 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능
- 변경 전 xml
- 변경 후 xml
beans 태그에 들어갈 코드들은 외우기보다 복사 붙여넣기로 필요할 때마다 끌어오는 것이 더 효율적이다.
변경 후 xml에 나타나 있듯이 <context:annotation-config />를 선언하면 주입을 하기위해 필요했던 태그 <constructor-arg>를 사용하지 않아도 된다.
- 단, 동일한 객체가 2개 이상인 경우 Spring 컨테이너는 자동 주입 대상 객체를 판단하지 못해서 예외처리를 발생시킨다.
// 윗 코드처럼 설정 후 실행했을 때의 Log 중 일부
-> 적절한 Bean 객체를 찾지 못했지만 3개를 발견했다. 그래도 3개 중에 어떤 것을 가져오는지 모르겠다.
// 의존 객체 선택 방법
1) <qualifier> 태그 사용
: qualifier 태그 안의 value값을 자동으로 주입해야할 클래스에 똑같이 Qualifier 태그로 선언해준다.
2) 객체의 이름과 같은 id값 사용
: 주입해야할 클래스에 선언된 필드 값과 동일하게 id를 지정해준다.
- 단, 개발자 입장에서도 혼동이 올 수 있으므로 1) 의 방법을 쓰는 것이 더 좋다.
* 의존 객체 주입 체크
의존 객체가 없을 때, 예외처리가 안나오는 방법은 Autowired 속성 중 required 가 있는데 그것을 false
-> 의존 객체가 있으면 주입하고 없으면 주입하지 않는다.
- 하지만 bean객체에 자동 주입을 설정 안했는데 Autowired를 선언해주는 경우가 있을까?
1) Autowired
: Autowired로 선언된 생성자나 메소드, 필드 등이 사용될 때 매개변수로 받는 타입과 일치하는 것을 찾아서 자동으로 주입.
생성자에서 쓸 때는 상관없지만 메소드나 필드에 쓸 때에는 기본 생성자를 선언해주어야한다.
-> 객체가 생성되어야 Autowired로 선언된 것들이 실행될 수 있고 기본 생성자 없이 파라미터를 이용한 생성자만 있다면 이 경우에는 Autowired로 선언한 생성자가 아니므로 매개변수의 타입을 찾지 못해서 에러가 뜨게 된다.
2) Resource
: Resource로 선언된 메소드, 필드 등이 사용될 때 매개변수와 같은 이름을 가진 것을 찾아서 자동으로 주입, 생성자는 Resource 선언 불가
Autowired와 같이 기본 생성자를 명시해주어야 함
3) Inject
: Autowired와 거의 비슷하지만 required 속성을 지원하지 않는다는 차이가 있다.
- Autowired와 비교해보면 Autowired는 xml 파일에 원하는 <bean> 태그에 <qualifier> 태그를 넣어야하지만 Inject의 경우는 지정할 클래스에서만 선언하면 되므로 좀 더 직관적으로 볼 수 있다는 장점이 있다.
'공대인 > Spring[Boot]' 카테고리의 다른 글
[Spring] 어노테이션을 이용한 스프링 설정 (0) | 2019.05.24 |
---|---|
[Spring] 생명주기 (Life Cycle) (0) | 2019.05.23 |
[Spring] Spring 설정 파일 분리 (0) | 2019.05.21 |
[Spring] 의존 주입 (DI, Dependency injection) (0) | 2019.05.20 |
[Spring] 프로젝트 생성 (0) | 2019.05.20 |