donaricano-btn

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
블로그 이미지

리딩리드

,