GOHAR , AHMAD NABIL • Software Architect & Technical Team Lead (9Y.) | CIC, IBM. • Duke Award Winner 2016. • IBM/Open Group Certified Experienced IT Specialist. • M.Sc. in Information System, FCI, Egypt. • MIBA in Global Management, ESLSCA, France. • OCEJPA | OCPWCD | OCPJP | OCP PL/SQL | MCP(s). • JAVA Community Process (JCP) Member. • Blogger Author and Academic Researcher.
WHAT IS CDI (JSR 299)? • Java Specification Requests • JSR is a document of a proposed specification used in the Java Community Process (JCP). • Classes specify what their dependencies • NOT how to obtain them (container responsibility)
CDI IS MORE THAN A FRAMEWORK • It’s a whole, rich programming model • The theme of CDI is loosecoupling with strong typing. • A bean specifies only the type and semantics of other beans it depends upon • It need not be aware of the actual lifecycle, concrete implementation, threading model or other clients of any bean it interacts with • Even better, the concrete implementation, lifecycle and threading model of a bean may vary according to the deployment scenario, without affecting any client • This loose-coupling makes your code easier to maintain
AUTOMATIC BEAN DISCOVERY • • How can container scan bean? • By detecting the presence of “beans.xml” in application archive • For WAR file, the “beans.xml” is under WEB-INF directory • For JAR file, the “beans.xml” is under META-INF directory • • “beans.xml” • It is not for declaring beans (like in Spring) • It can be empty • Used for some other purposes (like declaring an alternative)
WHAT IS A BEAN ANYWAY? • Many forms of a “bean” already exist. So which bean arewe talking about? • JSF bean • EJB bean • Spring bean • Seam bean • Guice bean • CDI bean • Java EE needs a unified bean definition • Managed Bean 1.0 specification in Java EE 6 provides it
WHAT ABOUT MANAGED, EJB, REST, CDI BEAN? • Managed Beans are container-managed POJOs • Lightweight component model • Instances are managed by the container • You could see everything as a Managed Bean with extra services • • An EJB is a Managed Bean with • Transaction support • Security • Thread safety • Persistence • • A REST service is a Managed Bean with • HTTP support • • A CDI bean is a Managed Bean with • CDI services (explained in the next slide)
CDI INJECTION POINT • Use @Inject for field injection • can be Java interface • Bean can be injected at “Injection points” • Field • Method parameter • Method can be • Constructor (useful for created immutable object) • Initializer • Setter method • Producer • Observer
WHAT IS A QUALIFIER? • For a given bean type (class or interface), there may be multiple beans which implement the type (in the classpath) • For an interface, there could be multiple implementations • For a class, there could be multiple child types • Ambiguity error will result • A qualifier is an annotation that lets a client choose one between multiple candidates of a certain type • Make type more specific • Assigns semantic meaning • Injected type is identified by • Qualifier(s) + Java type
QUALIFIER AND TYPE SAFETY (STRONG TYPING) • Qualifier + Java type makes a composite type (extended type) • Again, think of a Qualifier as a type • Qualifiers make type safe injection possible • Qualifiers replace “look-up via string-based names” • Qualifier and Type Safety (Strong Typing)
WHAT IS ALTERNATIVE BEAN? • Any bean with @Alternative is not considered for injection • Lets you package multiple beans that match injection type without ambiguity errors • In order to be considered for injection, it has to be activated in “beans.xml” • Provide a replacement implementation during deployment • You can apply the @Alternative annotation to two or more beans, then, based on your deployment, specify the bean you want to use in the “beans.xml” configuration file • Useful for providing mock objects for testing – mock objects are annotated with @Alternative
REQUEST – @REQUESTSCOPED • This scope describes a user’s interaction with a web application in a single HTTP request. • The instance of the @RequestScoped annotated bean has an HTTP request lifecycle.
APPLICATION – @APPLICATIONSCOPED • In this case the state is shared across all users’ interactions with a web application. • The container provides the same instance of the @ApplicationScoped annotated bean to all client requests.
DEPENDENT – @DEPENDENT PSEUDO-SCOPE • This pseudo-scope means that an object exists to serve exactly one client (bean) and has the same lifecycle as that client (bean). • This is the default scope for a bean which does not explicitly declare a scope type. • An instance of a dependent bean is never shared between different clients or different injection points. • It is strictly a dependent object of some other object. • It is instantiated when the object it belongs to is created, and destroyed when the object it belongs to is destroyed.
VIEW – @ VIEWSCOPED • @ViewScoped belongs to JSF specification • Retains the scope lifespan for current page view • If the controller navigates away to a different page view the bean is de-scoped • Therefore view-scope is great for form validation and rich AJAX request and response sequences!
CONVERSATION – @CONVERSATIONSCOPED • A lifespan sits between a Http Request scope and Http Session scope • Maintains state for the unique interaction • Works for individual tab in web browsers • Better than @ViewScoped bean controllers • Application defined lifespan
SESSION & CONVERSATION SCOPED BEAN • A thing to notice is that beans must be serializable. • This is because the container passivates the HTTP session from time to time, so when the session is activated again the beans’ state must be retrieved.
SINGLETON – @SINGLETON PSEUDO- SCOPE • This is a pseudo-scope. • It defines that a bean is once instantiated. • When a CDI managed bean is injected into another bean, the CDI container makes use of a proxy. • The proxy is the one to handle calls to the bean. • Though, @Singleton annotated beans don’t have a proxy object. • Clients hold a direct reference to the singleton instance.
SINGLETON – @SINGLETON PSEUDO- SCOPE • So, what happens when a client is serialized ? • We must ensure that the singleton bean remains a singleton. • To do so there are a fiew ways, such as, have the singleton bean implement writeResolve() and readReplace() (as defined by the Java serialization specification), make sure the client keeps only a transient reference to the singleton bean, or give the client a reference of type Instance where X is the bean type of the singleton bean.
INTERCEPTORS • Interceptor functionality is defined in the Java Interceptors specification. • The Interceptors specification defines three kinds of interception points: • Business method interception, • Lifecycle callback interception, and • Timeout method interception (EJB only). • A business method interceptor applies to invocations of methods of the bean by clients of the bean • By default, all interceptors are disabled
LIFECYCLE CALLBACK INTERCEPTOR • A lifecycle callback interceptor applies to invocations of lifecycle callbacks by the container • An interceptor class may intercept both lifecycle callbacks and business methods
WHAT IS A DECORATOR? • Decorators implement the Decorator design pattern • Allows implementation of an additional business logic for a bean • A Decorator decorates interfaces they implement • @Delegate is used to inject the original object • Original object business logic can be be invoked within the decorator • Decorators must be activated through “beans.xml”
INTERCEPTORS VS DECORATORS • Interceptors and Decorators both geared towards cross-cutting logic. • Bypass traditional complexity associated with AOP by avoiding point-cuts. • Interceptors are designed for system-level crosscutting concerns very decoupled from business logic. • Decorators intended for concerns that should be compartmentalized but are still very close to business logic.
EVENT • Event Producers • An event is fired by an injected javax.enterprise.event.Event object • Event Consumer (Event Observer) • The only thing event consumer has to do is to use @Observes annotation
WHEN YOU STILL NEED EJB ? … NOT YET ALIGNED! • Asynchronous • @Asynchronsous • Allows method calls to be asynchronous and return Future objects • Usable by • @Stateless • @Stateful • @Singleton
WHEN YOU STILL NEED EJB ? … NOT YET ALIGNED! • Schedule • @Schedule • Effectively Cron -- schedule invocations by minute or date, etc. • Usable by • @Stateless • @Singleton • Not @Stateful
WHEN YOU STILL NEED EJB ? … NOT YET ALIGNED! • Locking • @Lock(READ • @Lock(WRITE) • @AccessTimeout • Allows for synchronization of methods without complex code • Usable by • @Singleton • Not @Stateless • Not @Stateful
WHEN YOU STILL NEED EJB ? … NOT YET ALIGNED! • MDBs • @MessageDriven • Connector-Driven Beans • Usable by • Not @Singleton • Not @Stateless • Not @Stateful
COMMON MISTAKES YOU WILL MAKE • Not putting a beans.xml in your app (Java EE 6) • No CDI for you! • Not understanding @Typed • Think @Local from EJB • Bites you when using @Produces • Not understanding what Dependent and NormalScope • Dependent == plain object • NormalScoped == proxied object • Bites you when creating custom scopes
RESULT FOR EJB AFTER CDI ? • Java EE 7 • Focus on realignment: @Transactional • • Java EE 8 • First spec round with no new EJB JSR • Realignment stalled • Awkward relationship
BIGGEST BENEFITS OF CDI • Very active and open expert group • Fully extendable • Beans can be added at development, deployment, or even runtime • Fully Open Source • Spec is open source • All implementations are open source • Compliance test (TCK) suite is open source