Weld 3.0.0.Alpha8
Weld 3.0.0.Alpha8 has been released. The main change is the enhanced API for using Weld in Java SE environment. In addition, this release comes with several weld-probe improvements.
Enhanced API for Weld SE
Weld has provided support for the Java SE environment for a long time with the weld-se module.
The API provides an easy way for an application to initialize Weld and use it in a standalone mode.
On initialization Weld SE scans the classpath for bean archives with the beans.xml
file, similarly to how it’s done in the Java EE environment.
In this release we are extending the API further. This is partially inspired by the current discussion in the CDI expert group where a standardized CDI API for Java SE is being proposed as part of CDI-26.
The following code snippet shows the new API in action:
Weld builder = new Weld()
.disableDiscovery()
.packages(Main.class, Utils.class)
.interceptors(TransactionalInterceptor.class)
.property("org.jboss.weld.construction.relaxed", true);
try (WeldContainer weld = builder.initialize()) {
MyBean bean = weld.select(MyBean.class).get();
System.out.println(bean.computeResult());
}
There are several new things to notice:
-
the
Weld
class is used as a builder to configure Weld before it is initialized -
automatic scanning can be disabled
-
instead of scanning, classes or packages can be selected explicitly. All classes in those packages will be managed by Weld
-
interceptors, decorators, extensions and Weld-specific configuration options can be specified using the builder
-
WeldContainer
now implementsAutoCloseable
and can therefore be used in atry-with-resources
block. At any time that execution gets outside of the code block, the Weld instance is shut down and all managed instances are safely destroyed.
It is also possible to start multiple independent Weld instances:
new Weld().disableDiscovery().containerId("one").beanClasses(MyBean.class).initialize();
new Weld().disableDiscovery().containerId("two").beanClasses(OtherBean.class).initialize();
MyBean bean = WeldContainer.instance("one").select(MyBean.class).get();
System.out.println(bean.computeResult());
WeldContainer.instance("one").shutdown();
WeldContainer.instance("two").shutdown();
Here, two independent WeldContainer
instances are initialized.
Each of them is given a unique ID.
The ID can subsequently be used to obtain a WeldContainer
reference in a different place of the code.
One possible use-case this enables is for a library or framework (e.g. a testing framework) to use an embedded instance of Weld internally for its own needs (dependency injection, events, extensibility).
This instance would not interfere with the Weld instance used by the application.
Obviously, automatic classpath scanning can still be used as before:
try (WeldContainer weld = new Weld().enableDiscovery().initialize()) {
MyBean bean = weld.select(MyBean.class).get();
System.out.println(bean.computeResult());
}
Update:
To play with the new API use the following dependency in you Maven project:
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>3.0.0.Alpha8</version>
</dependency>
Aforementioned classes are from the org.jboss.weld.environment.se
package.
Weld Probe Enhancements
Since the last Alpha releases there were several enhancements to Weld Probe. If you are not familiar with Weld Probe, check this introductory blog post first.
A new feature of Probe is that, when the development mode is enabled, it now embeds a tiny information bar directly into the application’s HTML output. That makes it easy to navigate to Probe directly from the application anytime. Furthermore, if invocation tracking is enabled, the information bar helps navigate directly to the invocation tree related to the request that rendered the output.
Additionally, the following Probe improvements were implemented:
-
tracked invocations are now grouped into a invocation tree instead of being tracked in isolation
-
a special type of edges is now used in the overview graph to represent a "declared by" relation (when a bean declares a producer method or field)
-
Instance<?> injection points are now treated specially - a resolved bean is show as injection point’s dependency
[ Experimental API documentation ] [ Release notes ] [ Distribution ] [ Patch for Wildfly (8.2, 9 Beta) ]