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-core의aot), Groovy(선택), SnakeYAML(선택). - 의존받는 모듈:
spring-context가 직접 확장한다.ApplicationContext는 내부에DefaultListableBeanFactory를 두고 부가 기능(이벤트, 국제화, 환경)을 입힌다. 사실상 거의 모든 Spring 모듈의 토대.
- 01 — 빈팩토리 계층과 핵심 추상화
BeanFactory인터페이스 계층,BeanDefinition메타데이터 모델,DefaultListableBeanFactory의 위치. - 02 — 빈 생성 수명주기
getBean→doGetBean→createBean→doCreateBean. 인스턴스화·프로퍼티 채움·초기화·소멸의 전 과정. - 03 — 싱글톤 레지스트리와 순환참조
DefaultSingletonBeanRegistry의 3단계 캐시, 순환참조 해소, 스코프. - 04 — 의존성 주입과 오토와이어링
resolveDependency,findAutowireCandidates,AutowiredAnnotationBeanPostProcessor,ConstructorResolver, 후보 중재. - 05 — 프로퍼티 바인딩과 타입 변환
BeanWrapper/PropertyAccessor,PropertyEditor레지스트리,TypeConverterDelegate. - 06 — 설정 로딩과 팩토리 후처리
BeanDefinitionRegistry, XML 리더 파이프라인,BeanFactoryPostProcessor/BeanPostProcessor확장점. - 07 — AOT 빈 등록과 코드 생성 네이티브 이미지를 위한 빌드 타임 빈 등록 코드 생성.
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장이 이 모듈의 본론이다.