DI_1
1. What is DI
- DI는 인터페이스를 이용해 컴포넌트화를 실현함
- 오브젝트 사이의 의존 관계를 만든다
1_1 DI 하지 않았을때
- 각자의 new한 다음에 각각의 인스턴스를 생성해서 사용
1_2 DI 사용
- new라는 키워드를 사용하지 않는다
- DI컨테이너 생성, ProductService의 인스턴스 취득은 ApplicationContext에서 함
- 작은 어플리케이션에서는 main에서 DI컨테이너 생성
- DI컨테이너가 인스턴스를 생성할 클래스, 인스턴스를 전달 받은 클래스는 모두 POJO로 작성된다
- 팩토리메소드 같은 디자인 패턴이 필요없다
- DI컨테이너는 클래스를 단 한번 인스턴스로 만들고 재사용 함으로 싱글톤을 구현한다
2. Using of DI
- 서비스와 컨트롤러, 서비스와 DAO의 의존관계를 구축하는데 어울림
- 서비스와 도메인(Product), DAO와 도메인(Product)은 어울리지 않는다
3. DI by using annotation
3_1. DI를 사용하는 방법
1) Bean정의 파일을 사용한 DI
2) Annotation을 사용한 DI
3_2. @Autowired, @Component
- DI 컨테이너는 @Autowired가 붙은 인스턴스 변수의 형에 대입할 수 있는 클래스를 @Component가 붙은 클래스 중에서 찾아내 그 인스턴스를 인젝션한다
- 인젝션이 setProductDao 같은 셋터 메소드는 필요없다
3_3. applicationContext.xml
- bean 스키마 : Bean(컴포넌트) 설정
- context스키마 : Bean(컴포넌트) 검색과 애노테이션 설정
- <context:annotation-config/>
@Autowired, @Resource를 이용할 때의 선언이다
context:component-scan혹은 mvc:annotation-driven이 있으면 생략 가능
- <context:component-scan base-package=""/>
@Component, @Service등의 컴포넌트를 이용할떄 선언
context:exclude-filter(검색하지 않는 컴포넌트 조건)
use-default-filters="false"(지정한 패키지 아래 컴포넌트를 찾지 않을떄)
context:include-filter(검색할 컴포넌트릐 조건)
3_4. @Autowired
1) @Autowired 위치
- 메소드에 선언
- 생성자 인젝션
2) @Autowired 필수 설정
3) 인젝션할 클래스 찾는 방법
(1) byType
- @Component가 붙은 클래스가 여러개 있어도 형이 다르면 @Autowired가 붙은 인스턴스 변수에 인젝션되지 않는다
(2) byName
- 인젝션할 클래스를 형이 아닌 이름으로 찾아주는 방법
(3) context:component-scan 이용
- context:component-scan을 어느 정도 크기의 컴포넌트마다 기술해 두고, 만약 어떤 컴포넌트를 테스트 용으로 바꾸자고 할때는 그 컴포넌트 부분의 정의만 테스트로 바꿈
-평상시
- 컴포넌트 스캔변경
3_5. @Component
- @Component는 DI 컨테이너가 관리하는, 주로 인젝션을 위한 인스턴스를 설정함
- 클래스 선언 앞에 @Component를 붙이면 스프링의 DI컨테이너가 찾아서 관리함
1) @Component의 확장
- @Controller
- @Service
- @Repository
2) @scope
- @Scope뒤에 value속성을 지정하면 인스턴스화와 삭제를 제어함
- @Scope을 생략하면 해당 클래스는 싱글톤이된다
singleton : 인스턴스를 싱글톤으로 한다
prototype : 이용할 떄마다 인스턴스화 한다
request : Servlet API의 Request 스코프인 동안만 인스턴스가 생존한다
session : Servlet API의 Session 스코프인 동안만 인스턴스가 생존
예제 소스 : https://github.com/KyleJeong/SpringFramework/tree/master/simpleProject/src/main/java/DI
'Back-End > SpringFrame_1' 카테고리의 다른 글
[Spring] AOP_2 (0) | 2016.07.20 |
---|---|
[Spring] DI_2 (0) | 2016.07.17 |
[Spring] AOP_1 (0) | 2016.07.04 |
[Spring]8_4 Skill of Spring (0) | 2016.02.28 |
[Spring]8_2.Purpose of Spring - 스프링의 목적 (0) | 2016.02.28 |