This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
# Build the entire project (Java 8+ required)
mvn clean install
# Run all tests across all modules
mvn test
# Run tests in a specific module
mvn test -pl summer-beans
mvn test -pl summer-validator
mvn test -pl summer-java-core
# Run a single test class
mvn test -pl summer-beans -Dtest=DefaultListableBeanFactoryTest
mvn test -pl summer-java-core -Dtest=PredicatesTest
# Skip tests during build
mvn install -DskipTestsCI runs mvn -B test (CircleCI) and mvn -B package (GitHub Actions) on push/PR to main. Java 8 is the target version.
Summer is a minimal IoC/AOP kernel for Java 8, inspired by the Spring Framework. It's a Maven multi-module project (groupId: com.dianpoint, version 0.1.0-SNAPSHOT) with four modules:
summer-parent (BOM — dependencyManagement for all versions)
├── summer-java-core (standalone utilities, no internal deps)
├── summer-validator (standalone validation, no internal deps)
└── summer-beans (IoC/AOP/MVC — test-scoped dep on summer-validator)
The core module. Package layout:
beans.factory— BeanFactory interfaces (BeanFactory,ListableBeanFactory,AutowireCapableBeanFactory,ConfigurableBeanFactory) and their implementations. The concrete factory isDefaultListableBeanFactory.beans.factory.config—BeanDefinition,BeanPostProcessor,BeanFactoryPostProcessor, constructor arguments, property values.beans.factory.support—DefaultListableBeanFactory,DefaultSingletonBeanRegistry,BeanDefinitionRegistry.beans.factory.xml—XmlBeanDefinitionReaderparses XML via dom4j, producingBeanDefinitionobjects.beans.factory.annotation—@AutowiredandAutowiredAnnotationBeanPostProcessor(field injection by name).context—ApplicationContexthierarchy.AbstractApplicationContextdefines therefresh()template;ClassPathXmlApplicationContextis the concrete implementation.aop— JDK dynamic proxy-based AOP. See AOP section below.web—DispatcherServlet(minimal stub extendingHttpServlet) and@RequestMapping.core—Resourceabstraction for loading classpath XML files.core.env—Environment/PropertyResolverinterfaces.
DefaultSingletonBeanRegistry (singleton storage, singleton/earlySingleton maps)
└── AbstractBeanFactory (bean creation, property injection, init-method invocation)
└── AbstractAutowireCapableBeanFactory (BeanPostProcessor registration + lifecycle)
└── DefaultListableBeanFactory (concrete, query-by-type, getBeansOfType)
- XML parsed by
XmlBeanDefinitionReader→BeanDefinitionobjects registered inBeanDefinitionRegistry AbstractBeanFactory.getBean(name)checks singleton cache →earlySingletonObjects→ callscreateBean(beanDefinition)createBean: instantiate viadoCreateBean(reflection, constructor injection or no-arg) → stash inearlySingletonObjects→handleProperties(setter injection, includingrefdependencies resolved recursively viagetBean) → register as singletonBeanPostProcessor.postProcessBeforeInitializationrunsinit-method(if defined) invoked via reflectionBeanPostProcessor.postProcessAfterInitializationwould run (currently stubbed)
AbstractApplicationContext.refresh() orchestrates:
postProcessBeanFactory()— template methodregisterBeanPostProcessors()— registersAutowiredAnnotationBeanPostProcessorinitApplicationEventPublisher()— createsSimpleApplicationEventPublisheronRefresh()— callsbeanFactory.refresh()which eagerly instantiates all non-lazy singleton beansregisterListeners()— registers anApplicationListenerfinishRefresh()— publishesContextRefreshEvent
JDK dynamic proxy only (no CGLIB). The entry point is ProxyFactoryBean (implements FactoryBean<Object>).
ProxyFactoryBean
└── AopProxyFactory (DefaultAopProxyFactory)
└── AopProxy (JdkDynamicAopProxy implements InvocationHandler)
└── Advisor (DefaultAdvisor)
└── MethodInterceptor
Advice type hierarchy:
Advice(root marker) →Interceptor(marker) →MethodInterceptor(core:invoke(MethodInvocation))BeforeAdvice→MethodBeforeAdvice(definesbefore(method, args, target))AfterAdvice→AfterReturningAdvice(definesafterReturning(returnValue, method, args, target))
Adapter pattern — typed advice is wrapped into MethodInterceptor:
MethodBeforeAdviceInterceptorwrapsMethodBeforeAdvice(callsbefore()thenproceed())AfterReturningAdviceInterceptorwrapsAfterReturningAdvice(callsproceed()thenafterReturning())
Invocation chain: JdkDynamicAopProxy.invoke() matches method name "doAction" (hardcoded pointcut), creates a ReflectiveMethodInvocation, and delegates to the advisor's MethodInterceptor, which calls invocation.proceed() at the appropriate point. Single-interceptor only — no multi-interceptor chain.
Standalone module with no internal dependencies.
Two validation approaches:
-
Fluent/functional API:
Validators.generic(),Validators.string(),Validators.integer()return pre-configuredGenericValidator<T>instances.Validators.collection()returnsDefaultCollectionValidator. Rules arePredicate<T>lambdas. -
Annotation-based API:
Validators.annotated(User.class)returns anAnnotationValidatorAdapterthat scans for@NotNulland@Patternannotations and runs correspondingAnnotationProcessorimplementations registered inAnnotationProcessorRegister.
Wrapper— interface for unwrapping/delegating objectsStreams,Predicates— functional helpersAssertUtils— assertion utilitiesThrowableAction,ThrowableConsumer,ThrowableFunction,ThrowableSupplier— functional interfaces that allow checked exceptions (for use with lambdas)SetUtils— set utilities
Centralizes all dependency versions (Jackson, dom4j, servlet-api, Lombok, JUnit 4+5, AssertJ). Child modules inherit from this, not the root POM.
- dom4j 2.1.4 — XML parsing for bean definitions
- Jackson 2.18.3 — JSON support
- Servlet API 2.5 —
providedscope, forDispatcherServlet - Lombok 1.18.12 — used in summer-java-core
- JUnit 4.13.2 — summer-beans tests
- JUnit Jupiter 5.12.2 + AssertJ 3.24.2 — summer-java-core tests
- summer-beans: Uses JUnit 4 (
@Test+assert*). Tests for bean factory, XML loading, autowiring, circular dependency resolution, AOP proxies, and the application context. - summer-java-core: Uses JUnit Jupiter 5 + AssertJ. Tests for
PredicatesandAssertUtils. - summer-validator: Has a
ValidatorDemotest class and aUsertest model using@NotNull/@Patternannotations.