#ioc-container
글
-
Gradle 소스 파헤치기 4: 서비스 레지스트리 — Gradle 안의 DI 컨테이너
태스크 생성자에 @Inject를 붙이면 FileSystemOperations가 들어오는 것은 누구 덕분일까요. 스코프마다 하나씩 만들어 부모를 따라 서비스를 찾는 DefaultServiceRegistry, @Provides 메서드로 서비스를 선언하는 규칙과 장식(decorator), 처음 찾을 때 만드는 게으른 싱글턴, 서비스가 제 스코프에 있는지 보는 ServiceScopeValidator, 모듈 57개가 스코프마다 서비스를 보태는 GradleModuleServices, 그리고 abstract 게터를 채운 _Decorated 클래스까지, 레지스트리를 빌드 밖에서 직접 써 보고 태스크 생성 스택을 찍어 소스와 함께 확인합니다.
-
Spring 소스 파헤치기 5: @Autowired는 넣을 빈을 어떻게 고르나 — 의존성 주입 해석
@Autowired가 붙은 필드와 생성자에 Spring이 어떤 빈을 넣는지, 그 빈을 어떻게 찾고 여럿이면 어떻게 고르는지를 실제 소스에서 따라갑니다. 후보 찾기, @Primary·@Qualifier·이름 일치의 우선순위, List와 Map 주입, 생성자 선택 규칙, 그리고 없을 때의 처리를 예제를 돌려 확인합니다.
-
Spring 소스 파헤치기 6: 생명주기 콜백과 PostProcessor — 컨테이너에 끼어드는 자리
BeanFactoryPostProcessor, BeanPostProcessor와 그 하위 인터페이스들, Aware 계열, @PostConstruct·InitializingBean·init-method, @PreDestroy·DisposableBean·destroy-method, SmartInitializingSingleton, SmartLifecycle이 각각 언제, 어떤 순서로 불리는지 실제 소스와 실행 결과로 확인합니다. 끼어드는 자리가 왜 이렇게 여러 종류인지도 함께 봅니다.
-
Spring 소스 파헤치기 7: refresh() 12단계 — 컨테이너가 켜지는 순서
new AnnotationConfigApplicationContext(...) 한 줄 뒤에서 도는 refresh()를 열두 단계 하나씩 엽니다. ApplicationContext가 BeanFactory에 무엇을 더하는지, 왜 GenericApplicationContext와 AbstractRefreshableApplicationContext 두 갈래인지, 켜다가 실패하면 그리고 close()하면 무슨 일이 일어나는지를 실제 소스와 예제로 확인합니다.
-
Spring 소스 파헤치기 8: @Configuration과 @ComponentScan은 어떻게 설계도가 되나
설정 클래스(@Configuration)와 @Bean 메서드, @ComponentScan으로 찾은 @Component 클래스가 빈의 설계도(BeanDefinition)로 바뀌는 과정을 Spring을 처음 보는 사람 기준으로 따라갑니다. ConfigurationClassPostProcessor가 설계도를 읽어 설계도를 더하는 방법, 클래스를 로딩하지 않고 훑는 컴포넌트 스캔, 그리고 @Configuration 클래스가 CGLIB로 감싸져 @Bean 메서드를 두 번 불러도 같은 객체가 나오는 이유를 실제 소스와 예제로 확인합니다.
-
Spring 소스 파헤치기 9: @Conditional, @Profile, @Import — 조건에 따라 빈을 고르는 법
조건이 맞을 때만 빈을 등록하는 @Conditional과 @Profile, 다른 설정을 가져오는 @Import가 컨테이너 안에서 언제, 어떻게 평가되는지를 Spring을 처음 보는 사람 기준으로 따라갑니다. 조건이 세 번 평가되는 이유, @Import의 세 갈래, DeferredImportSelector가 "미루는" 이유, 순환 import를 잡는 ImportStack, 그리고 @EnableXxx가 전부 @Import의 응용인 까닭을 실제 소스와 예제로 확인합니다.
-
Spring 소스 파헤치기 3: BeanFactory 계층 구조와 BeanDefinition
Spring이 객체를 만들기 전에 먼저 준비하는 설계도(BeanDefinition)와, 객체를 꺼내는 창구(BeanFactory)가 왜 여러 인터페이스로 나뉘어 있는지를 실제 소스 발췌와 그림으로 따라갑니다. Spring을 처음 보는 사람을 위한 글입니다.
-
Spring 소스 파헤치기 4: Bean은 어떻게 만들어지나 — 생성 흐름과 3단계 캐시
getBean()을 한 번 부르면 Spring 안에서 무슨 일이 일어나는지, Spring을 처음 보는 사람 기준으로 따라갑니다. 캐시 조회, 인스턴스화·의존성 주입·초기화 세 단계, 그리고 A와 B가 서로를 필요로 하는 순환 참조를 맵 세 개로 푸는 방법을 실제 소스에서 확인합니다.