Changelog
Version history and major features
2.12 — Generic Type Matching
Component injection (@Component) now uses generic type arguments when resolving which components are eligible. A parameter of type RequestHandler<String, Integer> will only match implementations with those exact type arguments — previously any RequestHandler would match.
- Wildcard support —
? extends Number,? super Integer, and unbounded?in injection points - Collection injection —
List<RequestHandler<String, Integer>>collects only matching implementations - All producer types — generics resolved correctly across constructors,
@Factorymethods,@Builderpatterns, and pre-built instances - Mixed resolution — type arguments can come from both the producer declaration and the class hierarchy
- Backwards compatible — raw type injection points (no generics) continue to match any implementation
2.10 — Factory Methods and Builders
Two new producer types for creating components.
@Factory— annotate a public static method to serve as the component factory. Parameters use the same Pixie annotations (@Param,@Component,@Name,@Event). The factory can live in the same class or a separate class.@Builder— annotate a public static method that returns a builder object. Pixie calls annotated setter methods on the builder, then callsbuild()to produce the component. Also supports separate builder classes.
Factory methods take priority over builders, and both take priority over constructors.
2.9 — Collection Injection
Inject all components of a given type as a List:
@Param("handlers") @Component List<RequestHandler> handlers
Pixie collects all matching components from both pre-built instances and definitions yet to be constructed.
2.8 — @Component with @Param
Changed @Component("name") to @Param("name") @Component. This separates the concern of naming a property from declaring it as a component reference, making the annotation model more consistent.
2.5 — Event System Improvements
- Observer exceptions are now caught and do not propagate to the event producer
ObserverNotFoundevent fired when no observers exist for a given event- Property usage tracking to help diagnose unused or misconfigured properties
2.4 — Subclassable System
System can now be subclassed to augment behavior.
2.2 — Lookup by Annotation
New getAnnotated(Class<? extends Annotation>) method to find components by class-level annotation.
2.1 — Lookup by Name and Type
New get(Class<T>, String name) method to retrieve a component by both type and name.
2.0 — Events and Builder API
Major release introducing two new subsystems:
- Event system —
@Eventinjects aConsumer<T>for firing events;@Observesmarks methods as listeners. Built-in lifecycle events (PixieLoad,PixieClose,ComponentAdded, etc.) System.builder()— fluent Builder API for defining components in code without properties filesInstance.builder()— build a single object without a full System@Param— renamed from@Optionto better reflect that these are required configuration parameterssystem.add()— add pre-built instances to the System
1.0 — Initial Release
Constructor-based dependency injection and configuration from properties files.
@Param,@Component,@Default,@Nullable,@Nameannotationsnew://properties syntax for declaring components- Automatic type conversion via tomitribe-util
Converter - Case-insensitive property matching
- Strict property validation