Add @Aggregate annotation for Maven DI collection contributions#11401
Draft
gnodet wants to merge 2 commits intoapache:masterfrom
Draft
Add @Aggregate annotation for Maven DI collection contributions#11401gnodet wants to merge 2 commits intoapache:masterfrom
gnodet wants to merge 2 commits intoapache:masterfrom
Conversation
This commit introduces the @aggregate annotation to Maven's dependency injection framework, enabling modular contribution to aggregated collections without replacing the entire collection. Key Features: - @aggregate annotation for @provides methods that return List<T> or Map<String, T> - Allows multiple modules to contribute entries to the same collection - Preserves auto-aggregation behavior while enabling explicit contributions - Supports priority-based ordering for List<T> aggregations Behavior: 1. Without @aggregate: An explicit @provides method for List<T> or Map<String, T> replaces the auto-aggregated collection entirely 2. With @aggregate: The @provides method contributes entries to the auto-aggregated collection, allowing multiple providers to coexist 3. Mixed mode: If both @aggregate and non-@aggregate providers exist, the non-@aggregate provider takes precedence Use Cases: - Plugin architecture: Different modules can register services without depending on a central registry - Lifecycle providers: Multiple modules can contribute lifecycle phases - Extensible service registries: Core and extension modules can contribute services to the same map/list Implementation Details: - New Binding.BindingToMethod class to track the source method for bindings - Enhanced InjectorImpl with aggregation logic for List and Map injection - Support for @priority ordering in aggregated lists - Comprehensive test coverage with 30+ test cases Examples: @provides @aggregate Map<String, LifecycleProvider> lifecycleProviders() { return Map.of("clean", new CleanLifecycle()); } @Inject Map<String, LifecycleProvider> allLifecycles; // Contains all contributions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
This PR introduces the
@Aggregateannotation to Maven's dependency injection framework, enabling modular contribution to aggregated collections without replacing the entire collection.Key Features
@Providesmethods that returnList<T>orMap<String, T>List<T>aggregationsBehavior
@Providesmethod forList<T>orMap<String, T>replaces the auto-aggregated collection entirely@Providesmethod contributes entries to the auto-aggregated collection, allowing multiple providers to coexist@Aggregateand non-@Aggregateproviders exist, the non-@Aggregateprovider takes precedenceUse Cases
Implementation Details
Binding.BindingToMethodclass to track the source method for bindingsInjectorImplwith aggregation logic for List and Map injection@Priorityordering in aggregated listsExample Usage
Files Changed
api/maven-api-di/src/main/java/org/apache/maven/api/di/Aggregate.java- New annotation with comprehensive documentationimpl/maven-di/src/main/java/org/apache/maven/di/impl/Binding.java- AddedBindingToMethodclassimpl/maven-di/src/main/java/org/apache/maven/di/impl/InjectorImpl.java- Aggregation logic implementationimpl/maven-di/src/main/java/org/apache/maven/di/impl/ReflectionUtils.java- Updated to useBindingToMethodimpl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java- Comprehensive test coverageTesting
Added 30+ test cases covering:
@Aggregateproviders@Aggregate)Pull Request opened by Augment Code with guidance from the PR author