Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Java EE CDI Qualifiers: Quick Peek

DZone's Guide to

Java EE CDI Qualifiers: Quick Peek

· DevOps Zone ·
Free Resource

Easily enforce open source policies in real time and reduce MTTRs from six weeks to six seconds with the Sonatype Nexus Platform. See for yourself - Free Vulnerability Scanner. 

Qualifiers are the mainstay of type safety and loose coupling in Contexts and Dependency Injection (CDI). Why? Without CDI, we would be injecting Java EE components in a manner similar to below

Note:This will actually not compile and is just a hypothetical code snippet

Example 1

cdi1

Example 2

cdi2

What’s wrong with the above implementations?

  • Not type safe – Uses a String to specify the fully qualified name of an implementation class (see Example 1)
  • Tightly couples the BasicCustomerPortal class to the BasicService class (seeExample 2)

This is exactly why CDI does not do Injection this way ! ;-)

Qualifiers help promote
  • Loose Coupling – An explicit class is not introduced within another. Detaches implementations from each other
  • Strong Typing (type safety) – No String literals to define injection properties/metadata
 Qualifiers also serve as
  • Binding components between beans and Decorators
  • Event selectors for Observers (event consumers)

How to use Qualifiers? 

CDI Qualifiers Simplified

CDI-Qualifiers-simplified

 Simplified steps

  • Create a Qualifier
  • Apply Qualifiers to different implementation classes
  • Use the Qualifiers along with @Inject to inject the instance of the appropriate implementation within a class

This was not a detailed or in-depth post about CDI Qualifiers. It’s more of a quick reference.

Click for source code

More on CDI

Thanks for reading! :-)

Automate open source governance at scale across the entire software supply chain with the Nexus Platform. Learn more.

Topics:

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}