Implicit bean archive

CDI 1.1 introduced the notation of implicit bean archives, making the inclusion of beans.xml optional. Only beans annotated with bean defining annotations will be considered.

An implicit bean archive is any other archive which contains one or more bean classes with a bean defining annotation, or one or more session beans.

CDI 1.1 specification, 12.1. Bean archives

It is important to note that CDI 1.1 defined all JSR-330 javax.inject.* annotations as bean defining, however this caused some problems with archives that use other JSR-330 compliant injection frameworks, most notably google guava library.

The CDI 1.2 maintenance release addresses these by limiting bean defining annotations to:

@ApplicationScoped, @SessionScoped, @ConversationScoped and @RequestScoped annotations,

all other normal scope types,

@Interceptor and @Decorator annotations,

all stereotype annotations (i.e. annotations annotated with @Stereotype),

and the @Dependent scope annotation. CDI 1.2 specification, 2.5.1. Bean defining annotations

Any bean that does not define at least one bean defining annotation, will be ignored by CDI. Most notably beans solely defining @Named or CDI pseudo-scopes other than @Dependent, such as @Singleton will be ignored.



Explicit bean archive

A bean archive which contains a beans.xml file with no version has a default bean discovery mode of all.

A bean archive which contains a beans.xml file with version 1.1 (or later) must specify the bean-discovery-mode attribute. The default value for the attribute is annotated.

…

An explicit bean archive is an archive which contains a beans.xml file: with a version number of 1.1 (or later), with the bean-discovery-mode of all, or,

with no version number, or,

that is an empty file. CDI 1.1 specification, 12.1. Bean archives

Bean archives with a beans.xml set to version 1.1 or later are required to define the bean-discovery-mode (beans_1_1.xsd defines the default version as 1.1). For backwards compatibility, bean-archives that don’t specify a version will be treated with bean discovery mode “all”. This includes empty beans.xml as well as CDI 1.0 beans.xml defining the beans_1_0.xsd schema, as the version attribute was added with CDI 1.1.

Conclusion

The annotated bean discovery mode, which was introduced with CDI 1.1 to Java EE 7, has many pitfalls requiring developers to rethink the way they declare beans. Alternatively developers may prefer to resort to the known and trusted bean discovery mode “all”, mimicking CDI 1.0 behavior.

Only time will tell if implicit bean declarations and the annotated bean discovery mode will get accepted by the Java EE community.