Skip to content

Latest commit

 

History

History
124 lines (109 loc) · 8.35 KB

File metadata and controls

124 lines (109 loc) · 8.35 KB

spring-beans — IoC 컨테이너의 심장

Spring Framework 7.1.0-SNAPSHOT 기준 해설

한 줄 정의

spring-beans"빈(bean) 메타데이터를 읽어 객체를 생성하고, 의존성을 주입하며, 수명주기를 관리하는" Spring IoC 컨테이너의 핵심 구현 모듈이다. BeanFactory라는 이름의 빈 컨테이너 계약과, 그 사실상 표준 구현인 DefaultListableBeanFactory가 여기에 있다.

이 모듈이 푸는 문제

애플리케이션 객체들은 서로를 필요로 한다(의존). 각 객체가 자기 협력자를 직접 new 하고 설정 파일을 직접 읽으면, 구성 코드가 객체마다 흩어지고 결합도가 높아진다. Spring은 이 책임을 객체 바깥의 컨테이너로 옮긴다 — 객체는 "무엇이 필요한지"만 선언하고(생성자/필드/세터), 컨테이너가 "누구를 줄지"를 결정해 밀어 넣는다(push, Dependency Injection).

spring-beans가 구체적으로 책임지는 것:

  • 빈 정의(BeanDefinition): 어떤 클래스를, 어떤 생성자 인자/프로퍼티로, 어떤 스코프로, 어떤 init/destroy 콜백과 함께 만들지를 담은 메타데이터 모델.
  • 빈 생성 수명주기: 인스턴스화 → 프로퍼티 주입 → 초기화 콜백 → (사용) → 소멸 콜백의 정해진 순서.
  • 의존성 해소(autowiring): 타입/이름/@Qualifier로 협력 빈을 찾아 주입. 모호하면 @Primary/@Fallback/@Order로 중재.
  • 싱글톤 레지스트리와 순환참조: 컨테이너 스코프 싱글톤 캐시, 3단계 캐시를 통한 순환참조 해소.
  • 확장 훅: BeanFactoryPostProcessor(정의 수정), BeanPostProcessor(인스턴스 가공) — AOP·@Autowired·@Configuration이 모두 이 위에 얹힌다.
  • 프로퍼티 바인딩/타입 변환: BeanWrapper, PropertyEditor를 통한 문자열→객체 변환.
  • AOT: GraalVM 네이티브 이미지를 위해 빈 등록을 빌드 타임 Java 코드로 생성.

의존 관계

            ┌──────────────┐
            │ spring-core  │  (ResolvableType, Ordered, AttributeAccessor,
            └──────┬───────┘   ClassUtils, Resource, GenericApplicationContext용 io)
                   │ 사용
            ┌──────▼───────┐
            │ spring-beans │  ◀── 이 모듈
            └──────┬───────┘
                   │ 토대 제공
        ┌──────────┼─────────────┬───────────────┐
        ▼          ▼             ▼               ▼
  spring-context  spring-aop  spring-tx 등   거의 모든 상위 모듈
  (ApplicationContext가
   DefaultListableBeanFactory를 감싼다)
  • 의존하는 모듈: spring-core(타입 시스템·리소스·유틸)가 거의 유일. 선택적으로 spring-core의 AOT 인프라(spring-coreaot), Groovy(선택), SnakeYAML(선택).
  • 의존받는 모듈: spring-context가 직접 확장한다. ApplicationContext는 내부에 DefaultListableBeanFactory를 두고 부가 기능(이벤트, 국제화, 환경)을 입힌다. 사실상 거의 모든 Spring 모듈의 토대.

내부 목차 (읽는 순서)

  1. 01 — 빈팩토리 계층과 핵심 추상화 BeanFactory 인터페이스 계층, BeanDefinition 메타데이터 모델, DefaultListableBeanFactory의 위치.
  2. 02 — 빈 생성 수명주기 getBeandoGetBeancreateBeandoCreateBean. 인스턴스화·프로퍼티 채움·초기화·소멸의 전 과정.
  3. 03 — 싱글톤 레지스트리와 순환참조 DefaultSingletonBeanRegistry의 3단계 캐시, 순환참조 해소, 스코프.
  4. 04 — 의존성 주입과 오토와이어링 resolveDependency, findAutowireCandidates, AutowiredAnnotationBeanPostProcessor, ConstructorResolver, 후보 중재.
  5. 05 — 프로퍼티 바인딩과 타입 변환 BeanWrapper/PropertyAccessor, PropertyEditor 레지스트리, TypeConverterDelegate.
  6. 06 — 설정 로딩과 팩토리 후처리 BeanDefinitionRegistry, XML 리더 파이프라인, BeanFactoryPostProcessor/BeanPostProcessor 확장점.
  7. 07 — AOT 빈 등록과 코드 생성 네이티브 이미지를 위한 빌드 타임 빈 등록 코드 생성.

전체 패키지 구조 ASCII 맵

org.springframework.beans
│
│  ── 빈 컨테이너 "바깥쪽": JavaBeans 프로퍼티 접근 / 타입 변환 ──
│  PropertyAccessor, ConfigurablePropertyAccessor, BeanWrapper(Impl)
│  AbstractNestablePropertyAccessor, DirectFieldAccessor
│  TypeConverter, TypeConverterDelegate, SimpleTypeConverter
│  PropertyEditorRegistry(Support), PropertyValue(s), MutablePropertyValues
│  BeanUtils, BeanMetadataElement, Mergeable, CachedIntrospectionResults
│
├─ factory                      ── 컨테이너 "클라이언트 뷰" 계약 ──
│   BeanFactory, HierarchicalBeanFactory, ListableBeanFactory
│   FactoryBean, ObjectProvider, ObjectFactory
│   *Aware (BeanNameAware/BeanFactoryAware/...), InitializingBean, DisposableBean
│   SmartInitializingSingleton, BeanRegistrar/BeanRegistry, InjectionPoint
│   (수많은 NoSuch.../BeanCreationException 등 예외 계층)
│
│   ├─ config                   ── "설정 가능한" 확장 계약 ──
│   │   ConfigurableBeanFactory, ConfigurableListableBeanFactory
│   │   AutowireCapableBeanFactory, SingletonBeanRegistry
│   │   BeanDefinition, BeanDefinitionHolder, ConstructorArgumentValues
│   │   BeanPostProcessor, InstantiationAwareBeanPostProcessor,
│   │   DestructionAwareBeanPostProcessor, BeanFactoryPostProcessor
│   │   Scope, BeanExpressionResolver, DependencyDescriptor
│   │   *FactoryBean(List/Map/Set/Properties/...), *PlaceholderConfigurer
│   │
│   ├─ support                  ── 핵심 "구현체" ──
│   │   AbstractBeanFactory ─▶ AbstractAutowireCapableBeanFactory
│   │                       ─▶ DefaultListableBeanFactory   ★ 표준 구현
│   │   DefaultSingletonBeanRegistry (싱글톤 3단계 캐시)
│   │   AbstractBeanDefinition / RootBeanDefinition / ChildBeanDefinition
│   │   GenericBeanDefinition, BeanDefinitionBuilder, BeanDefinitionRegistry
│   │   ConstructorResolver, *InstantiationStrategy(Cglib/Simple)
│   │   AutowireCandidateResolver, DisposableBeanAdapter
│   │   Managed{List,Set,Map,Array,Properties}, RegisteredBean
│   │
│   ├─ annotation               ── 애너테이션 기반 주입 ──
│   │   AutowiredAnnotationBeanPostProcessor (@Autowired/@Value/@Inject)
│   │   InitDestroyAnnotationBeanPostProcessor (@PostConstruct/@PreDestroy 토대)
│   │   Qualifier, Value, Lookup, InjectionMetadata
│   │
│   ├─ xml                      ── XML 설정 로딩 파이프라인 ──
│   │   XmlBeanDefinitionReader ─▶ DefaultBeanDefinitionDocumentReader
│   │   BeanDefinitionParserDelegate, NamespaceHandler(Resolver)
│   │
│   ├─ parsing                  ── 파싱 이벤트/문제 보고 ──
│   │   ReaderContext, ProblemReporter, ComponentDefinition, ParseState
│   │
│   ├─ aot                      ── 빌드 타임 코드 생성(네이티브) ──
│   │   BeanRegistrationAotProcessor, BeanRegistrationCodeGenerator
│   │   BeanDefinitionMethodGenerator, BeanInstanceSupplier, AotServices
│   │
│   ├─ groovy / serviceloader / wiring   ── 보조 통합 ──
│
├─ propertyeditors             ── 내장 PropertyEditor 모음 ──
│   ClassEditor, URLEditor, CustomDateEditor, CustomCollectionEditor, ...
│
└─ support                     ── 잡다한 공용 지원 ──
    ResourceEditorRegistrar, PropertyComparator, PagedListHolder

각 챕터는 위 맵의 한 영역(또는 한 흐름)을 깊게 파고든다. 핵심 동선은 factory.support의 세 추상/구현 클래스에 모여 있으므로, 02~04장이 이 모듈의 본론이다.