2012-03-16 2 views
1

어떻게 Dependency Injection이 작동하는지 이해하려고합니다. 나는 Pro Spring 2.5를 읽고 3 장을 읽었습니다. 내 생각에 떠오르는 몇 가지 질문은 다음과 같습니다.Spring의 의존성 삽입

독립 실행 형 응용 프로그램의 main 메소드에서 bean factory를 만들 때 웹 응용 프로그램도 마찬가지입니다.) 그리고 빈 구성 파일을 읽습니다. 그런 다음 어떻게됩니까? 해당 시점에 종속성을 갖는 Bean을 작성하고이를 등록에 보관합니까, 아니면 등록 정보에 유지되는 구성 정보입니까?

종속성 조회를 최소한으로 유지하여 MyApplication 클래스 또는 기본 응용 프로그램을 부트 스트랩하는 것이 있으면 이해해야한다는 것을 알고 있습니다. 이제 Spring이나 POJO는 레지스터가있는 팩토리가 main 메소드에서만 사용 가능한 경우 종속성을 삽입 할 위치와 시점을 어떻게 알 수 있습니까? 메인 메서드에서만 레지스터를 사용할 수 있습니까? "getBean (...)"을 더 이상 호출하지 않으므로 구조가 어디에서 발생합니까? 어떻게 콩을 싱글 톤 (singletons)으로 유지할 수 있습니까?

+0

는 7 시간 전 같은 질문을 했 참조? http://stackoverflow.com/questions/9734483/how-is-dependency-injection-working – Ralph

답변

1

는 그 시점에서 자신의 의존성과 함께 콩을 만들 수 있습니까 당신이 BeanFactory 또는 ApplicationContext의 인스턴스를 생성하면 기본적으로 레지스터

예에서 그 유지 (참조 : BeanFactory vs ApplicationContext를) 봄은 모든 생성 콩과 그들을 전선. 예외는 lazyscope 인 빈이지만, 비 계급 빈의 종속 인 경우에도 불구하고 생성됩니다.

스프링은 또한 빈 초기화의 올바른 순서를 관리합니다.또는 POJO의 노하우 언제 어디서 종속성

기본적으로, 모든 콩 Spring 컨테이너 내부에 살고

를 주입하는 봄 얼마나 지금

. 하나의 bean을 가져 오면, 이미 그것의 직접적인 의존성에 대한 참조를 가지고있다. 그들은 차례로 다른 사람들에게 의존합니다. 최종 줄은 다음과 같습니다. 모든 빈은 일반적으로 시작시에 만들어지고 유선으로되어 있으며 일종의 싱글 톤입니다.

+0

그래서 어떻게하면 언제 종속성을 갖게되는지 MyApplication은 클래스 A에 종속적 일 수 있습니다. 다시 B와 C 등등? 하지만 당신이 수동으로 bean factory를 참조하고 registery를 의존성 lookup 대신 dependency injection을 사용할 때 bean registery를 이해하지 못한다. 각 클래스는 어떻게 의존성을 얻습니까? – LuckyLuke

+0

@viper : 이것을 설명하는 방법 ... 일단 애플리케이션 컨텍스트를 만들면 모든 빈이 만들어지고 배선됩니다. 시작할 때 자동으로 열심히 모든 일이 발생합니다. Spring은 먼저'B'와'C'를 생성하고,'A'를 생성하여'B'와'C'를 안으로 삽입합니다. 마지막으로'MyApplication'을 만들고'C'를 삽입합니다. 이것은 모두 시동시 완료되고 메모리에 보관됩니다. MyApplication 인스턴스에 대해'BeanFactory'를 요청하면, 이미 생성 된 bean에 의존성이 삽입 된 상태로 반환됩니다. 'getBean()'을 호출하면 ** 기존의 ** 유선 빈을 반환합니다. –

+0

밤에 자바 채팅을하는 데 5 분의 여유 시간이 있습니까? – LuckyLuke

2

나는 이것이 여기에 게시 된 링크를 읽고 가장 좋은 대답이라고 생각한다. What is dependency injection? 특히 Martin Fowler의 기사.

컨테이너 안에 사는 모든 물건을 생각해보십시오. 이 컨테이너 내부의 객체는 컨테이너 내부의 다른 객체 또는 봄에 의해 관리되는 전체 수명주기 (생성, 파괴, 초기화)를가집니다. 그렇다면 수업 구성은 언제 이루어 집니까? 글쎄, getBean()을 호출하면 Spring은이 클래스 인스턴스를 가져 오려고 시도합니다. 특정 종속성 (스프링 관리 속성)을 가지므로 Spring은 해당 클래스의 인스턴스도 생성하고 다른 종속성도 가지며 응용 프로그램의 객체 그래프의 관련 부분이 구성 될 때까지 재귀 적으로 반복됩니다. 당신이 컨테이너를 종료 할 때

합니다 (이 BeanFactory 또는 ApplicationContext, 스프링은 (필요한 모든 종료를 처리 즉, 데이터베이스 연결 등)을 파괴.

싱글 콩 (하나 개의 인스턴스 만의 수명을 위해 존재하는 것입니다있는 콩 응용 프로그램)은 사전에 인스턴스화되었지만 요구 사항은 아닙니다. 전체 개체 그래프는 온 디맨드 방식으로 구축 될 수 있습니다.

웹 응용 프로그램에서 getBean() 호출과 비슷한 것은 특정 요청을 컨트롤러에 연결하는 것입니다 , 세부 사항은 구현에 따라 다르다. 컨트롤러에 대한 모든 경로를 바인딩합니다.

+0

시작 부분에 "getBean()"만 호출 했으므로 일부 부분을 지워 줘서 고마워요. 스프링이 어떻게 우연을 주입 할 수 있습니까? 다른 클래스가 결코 팩토리에 대한 참조를 보유하지 않을 때 의존성 등? – LuckyLuke

+0

Spring은 이러한 클래스의 생성자를 호출하지만 팩토리에 대한 참조가 필요하지 않습니다. – wds

+0

네, 고마워요. 나는 지금 개념을 이해했으며 처음에는 완벽하게 오해했음을 알았습니다. – LuckyLuke

관련 문제