Guice 3.0 ist raus
Nach laaaanger Wartezeit ist DI-Framework Guice 3.0 veröffentlicht worden. Von die Neuerungen:
- JSR 330 support
- New Persist extension
- ToConstructor Bindings
- Better OSGi support (and generally improved support for multiple classloaders)
- New methods in Binder:
requireExplicitBindings&disableCircularProxies- Much simpler stack traces when AOP is involved
- Exact duplicate bindings are ignored (instead of an exception being thrown)
- Repackaged cglib, asm & guava classes are now hidden from IDE auto-imports
- Source can be built with Maven
- General extension & SPI improvements:
- Extensions SPI, with support from the Multibindings, ServletModule and AssistedInject extensions.
@Toolable, for use by extensions in Stage.TOOL- All binding implementations implement HasDependencies
- Scope improvements:
- Scopes.
isSingletontoInstancebindings are considered eager singletons in the Scope SPI- Singleton providers that return
nullare now scoped properly.- Fail when circularly dependent singletons cannot be proxied (previously two instances may have been created)
- Provider Method (
@Provides) improvements:
- Logger dependencies now use named instead of anonymous loggers
- Exceptions produce a simpler stack
- Private Modules improvements:
- If a single PrivateModule is passed to Modules.override, private elements can be overridden.
- If many modules are passed to Modules.override, exposed keys can be overridden.
- Multibinder & MapBinder extension improvements:
permitDuplicates— allows MapBinder to inject aMap<K,Set<V>> and aMap<K,Set<Provider<V>> and Multibinder to silently ignore duplicate entries- Expose dependencies in Stage.TOOL, and return a dependency on Injector (instead of
null) when working with Elements.- Co-exist nicely with Modules.override
- Work properly with marker (parameterless) annotations
- Expose details through the new extensions SPI
- Servlet extension improvements:
- Added
with(instance)for servlet bindings.- Support multiple injectors using ServletModule in the same JVM.
- Support thread-continuations (allow background threads to process an HttpRequest)
- Support manually seeding a
@RequestScope- Expose details through new extensions SPI
- Fix request forwarding
- Performance improvements for the filter & servlet pipelines
- Expose the servlet context (ServletModule.
getServletContext)- Fixed so a single ServletModule instance can be used twice (in, say Element.
getElements& creating an Injector)- Fix to work with context paths
- AssistedInject extension improvements
- New FactoryModuleBuilder for building assisted factories
- Injection is done through child injectors and can participate in AOP
- Performance improvements
- Multiple different implementations can be created from a single factory
- Incorrect implementations or factories are detected in Stage.TOOL, and more error-checking with better error messages
- Work better with parameterized types
- Expose details through new extensions SPI
- ThrowingProviders extension improvements
- Added a new CheckedProviders interface that allows more than one exception to be thrown.
- Added
@CheckedProvidesallowing@Provides-like syntax for CheckedProviders.- Dependencies are checked at Injector-creation time and during Stage.TOOL, so they can fail early
- Bindings created by ThrowingProviderBinder now return proper dependencies instead of Injector.
- Struts2
- The Struts2 extension now works again! (It worked in Guice 1.0 and was somewhat broken in Guice 2.0)
- Added to Injector:
getAllBindings,getExistingBinding,getScopeBindings,getTypeConverterBindings.- Added to Key:
hasAttributes,ofType,withoutAttributes- Various bug fixes / improvements:
- Prevent child injectors from rebinding a parent just-in-time binding.
- Non-intercepted methods in a class with other intercepted methods no longer go through cglib (reducing total stack frames).
- Allow Guice to work on generated classes.
- Fix calling
Provider.get()of an unrelated Provider in a scoping method.- MoreTypes.
getRawTypesreturns the proper types for arrays (instead ofObject.class)- JIT bindings left in a parent injector when child injectors fail creating a JIT binding are now removed
- Overriding an
@Injectmethod (if the subclass also annotates the method with@Inject) no longer injects the method twice- You can now bind byte constants (using
ConstantBindingBuilder.to(byte))- Better exceptions when trying to intercept final classes, using keys already bound in child or private module, and many other cases.
- ConvertedConstantBinding now exposes the TypeConverterBinding used to convert the constant.