SlideShare a Scribd company logo
@antoine_sd @cdispec#Devoxx #CDI2
CDI 2.0 is upon us
Antoine Sabot-Durand
Red Hat
CDI spec lead
@antoine_sd @cdispec#Devoxx #CDI2
Me, Myself and I
Antoine Sabot-Durand
Software Engineer at Red Hat
CDI spec lead
CDI evangelist
Follow me: @antoine_sd
Follow CDI: @cdispec
@antoine_sd @cdispec#Devoxx #CDI2
Agenda
Flashback on CDI & CDI 2.0 status
CDI 2.0 new features
Java SE support
Enhancing events
Metadata configurators
Interceptor and Decorators on Produced / custom beans (coming)
Questions and Feedback
Previously on CDI
@antoine_sd @cdispec#Devoxx #CDI2
CDI Timeline
Dec 2009 June 2013 Apr 2014 Sep 2014
CDI1.0
(Java
EE
6)
CDI1.1
(Java
EE
7)
CDI1.2
(1.1
MR)
CDI2.0
Starts
jan 2017
CDI2.0
released
@antoine_sd @cdispec#Devoxx #CDI2
CDI 1.0 - December 2009
A well-defined lifecycle for stateful objects bound to lifecycle contexts
Where the set of contexts is extensible
A type-safe dependency injection mechanism without verbose configuration
Dependencies can be selected at development or deployment time
Type-safe decorators and interceptors
An event notification model
An SPI allowing portable extensions to integrate cleanly with the container
@antoine_sd @cdispec#Devoxx #CDI2
CDI 1.1 / 1.2 – June 2013 / April 2014
Add automatic enablement of CDI in Java EE
Add introspection with event, bean, decorator and interceptor meta data
Ease access to bean manager from outside CDI with CDI class
Add global enablement of interceptors using the @Priority annotation
Add Unmanaged allowing easy access to non-contexutal instances
Spec clarification
@antoine_sd @cdispec#Devoxx #CDI2
CDI 1.2 - April 2014
Clarification in the spec regarding:
CDI Lifecycle
Events
Reworking Bean defining annotation to avoid conflict with other JSR 330
frameworks
Clarification on conversation resolution
OSGi official support in the API
@antoine_sd @cdispec#Devoxx #CDI2
CDI 2.0 status
JSR 365 started in September 2014
EDR1 released in 2015
EDR2 released in august.
Weld 3 Alpha 17 is the RI for EDR2
Release expected in January 2017
@antoine_sd @cdispec#Devoxx #CDI2
cdi-spec.org
@antoine_sd @cdispec#Devoxx #CDI2
CDI 2.0 new features
@antoine_sd @cdispec#Devoxx #CDI2
Java SE support
using CDI outside Java EE
@antoine_sd @cdispec#Devoxx #CDI2
Java SE support - Why?
To align on many other Java EE spec which support Java SE bootstrapping
To boost CDI adoption for Spec and Frameworks
To provide a mean of building new stacks out of Java EE
@antoine_sd @cdispec#Devoxx #CDI2
What did we do?
CDI Specification
CDI Core CDI for Java EECDI for Java SE
@antoine_sd @cdispec#Devoxx #CDI2
Java SE bootstrap API
public static void main(String[] args) {



SeContainer container = SeContainerInitializer.newInstance()

.disableDiscovery()

.addBeanClasses(MyService.class)

.initialize();



MyService service = container.select(MyService.class).get();



service.sayHello();



container.close();

}
@antoine_sd @cdispec#Devoxx #CDI2
Controlling the Request Context
In Java SE, most of our built-in contexts are unavailable:
Request context
Session context
Conversation context
That’s why we added tools to activate Request context programmatically
This feature is also available for Java EE
@antoine_sd @cdispec#Devoxx #CDI2
Controlling the Request Context
@ApplicationScoped

public class MyBean {



@Inject

private RequestContextController requestContextController;



public void doRequest(String body) {

// activate request context

requestContextController.activate();



// do work in a request context.



// deactivate the request context

requestContextController.deactivate();

}



}
@antoine_sd @cdispec#Devoxx #CDI2
In interceptor mode
@ApplicationScoped

public class MyBean {



@ActivateRequestContext

public void doRequest(String body) {

// Request Context will be activated during this invocation

}

}
@antoine_sd @cdispec#Devoxx #CDI2
Enhancing events
Making popular feature even more popular
@antoine_sd @cdispec#Devoxx #CDI2
Enhancing events
CDI events are a very loved feature
We took a very long time to see how to enhance them
In CDI 2.0 we are introducing
Event ordering
Asynchronous events
@antoine_sd @cdispec#Devoxx #CDI2
Events ordering
By adding a @Priority (from commons annotations) on an observer.
The lowest value is first
Observers with no explicit priority have a middle range priority
Allowing observer to be called last
Observer with the same priority are called in an undefined order
No priority on async events
@antoine_sd @cdispec#Devoxx #CDI2
Events ordering
public void observer1(@Observes @Priority(1) Payload p) {
}
public void observer2(@Observes @Priority(2) Payload p) {
}
@antoine_sd @cdispec#Devoxx #CDI2
Events ordering in extensions
public class MyExtension implements Extension {



public void firstPat(@Observes @Priority(1) ProcessAnnotatedType<?> pat) {
…

}

public void secondPat(@Observes @Priority(2) ProcessAnnotatedType<?> pat) {
…

}



}
@antoine_sd @cdispec#Devoxx #CDI2
CDI 1.x: Sync / Async
Sync / Async is not specified
The immutable status of the payload is not specified
Implementations use a Sync model
The payload is mutated in some implementations / framework
Going async “blindly” might raise problems…
@antoine_sd @cdispec#Devoxx #CDI2
Synchronous events - firing pattern
@Inject

Event<Payload> event;

public void someBSCriticalBusinessMethod() {

event.fire(new Payload());

}
@antoine_sd @cdispec#Devoxx #CDI2
Synchronous events - observing pattern
public void callMe(@Observes Payload payload) {

// Do something with the event
}
@antoine_sd @cdispec#Devoxx #CDI2
Events are sync in CDI 1
All the observers are called in the firing thread
In no particular order (at least not specified)
The payload may be mutated
Observers may inject beans
Observers are aware of Transactional and security contexts
@antoine_sd @cdispec#Devoxx #CDI2
Asynchronous Events
Async events can’t:
Mute Payload
Access CDI contexts states at the firing point
Be transactional
So designing backward compatible async events is more tricky than it looks:
A currently sync event should remain sync
Going sync / async should be a decision taken from the firing side
Being sync should be possible from the observing side
@antoine_sd @cdispec#Devoxx #CDI2
Async events - firing pattern
@Inject

Event<Payload> event;

public void someEvenMoreCriticalBusinessMethod() {


event.fireAsync(new Payload());

}
@antoine_sd @cdispec#Devoxx #CDI2
Async events - observing pattern
public void callMe(@ObservesAsync Payload payload) {

// I am called in another thread
}
@antoine_sd @cdispec#Devoxx #CDI2
Sync vs Async Events in a nutshell
callMe(@Observes payload) callMe(@ObservesAsync payload)
event.fire(payload) Sync call Not notified
event.fireAsync(payload) Not notified Async call
@antoine_sd @cdispec#Devoxx #CDI2
Adding an Executor to fireAsync
@Inject

Event<PanelUpdater> event;

public void someOtherCriticalBusinessMethod() {


event.fireAsync(new PanelUpdater(green), 

executor);
}
@antoine_sd @cdispec#Devoxx #CDI2
Async event in the GUI thread
@Inject

Event<PanelUpdater> event;

public void someOtherCriticalBusinessMethod() {


event.fireAsync(new PanelUpdater(green),
SwingUtilities::invokeLater);

}
@antoine_sd @cdispec#Devoxx #CDI2
Handling exceptions
@Inject

Event<PanelUpdater> event;

public void someOtherCriticalBusinessMethod() {


CompletionStage<PanelUpdater> stage = 

event.fireAsync(new PanelUpdater(green),
SwingUtilities::invokeLater);

}
@antoine_sd @cdispec#Devoxx #CDI2
Handling exceptions
Exception in one async observer doesn’t stop execution as in sync observer
One of the reasons why firing async event doesn’t trigger sync observers
Event.fireAsync returns a CompletionStage
Allowing integration of async events in standard Java 8 async pipeline
@antoine_sd @cdispec#Devoxx #CDI2
Handling exceptions
The Exception in fireAsync returned CompletionStage is
CompletionException
It holds all the exceptions in the suppressed exception set
@antoine_sd @cdispec#Devoxx #CDI2
Handling exceptions
Exception handling is done with the Standard Java 8 async api, with:
stage.whenComplete() to deal with result or exception
stage.handle() same as above but allows transformation of stage
stage.exceptionally() to only treat exception case
@antoine_sd @cdispec#Devoxx #CDI2
SPI enhancement
New configurators for meta data
@antoine_sd @cdispec#Devoxx #CDI2
Standard annotations instances
CDI makes an heavy use of Annotations
Java doesn’t provide easy way to create an annotation instance
We provided AnnotationLiteral, to help users create their instances
Annotation instance = new AnnotationLiteral<ApplicationScoped>(){};
@antoine_sd @cdispec#Devoxx #CDI2
When members are here a class has to be created
public class NamedLiteral extends AnnotationLiteral<Named> implements Named{



private String value;



public NamedLiteral(String value) {

this.value = value;

}



@Override

public String value() {

return null;

}

}
@antoine_sd @cdispec#Devoxx #CDI2
CDI 2.0 provides helpers out of the box
ApplicationScoped literal = ApplicationScoped.Literal.INSTANCE;


Named literal2 = NamedLiteral.of("myName");

@antoine_sd @cdispec#Devoxx #CDI2
Configurators for meta-data
Some meta-data are very verbose to create
AnnotatedType
Bean
InjectionPoint
ObserverMethod
If you only need to add info to an existing meta-data, it’s very boring
@antoine_sd @cdispec#Devoxx #CDI2
Example with CDI 1.2
I have a legacy framework
I want to adapt it for CDI
I need to detect all @CacheContext annotations on fields…
...And transform them in injection point
I’ll use an extension to replace @CacheContext annotation by @Inject in
AnnotatedTypes
@antoine_sd @cdispec#Devoxx #CDI2
Example 1/7
First we need to implement an AnnotatedType to decorate the original one
and modify AnnotatedField set
@antoine_sd @cdispec#Devoxx #CDI2
Example 2/7
public class AutoInjectingAnnotatedType<X> implements AnnotatedType<X> {



private final AnnotatedType<X> delegate;

private final Set<AnnotatedField<? super X>> fields;



public AutoInjectingAnnotatedType(AnnotatedType<X> delegate) {

this.delegate = delegate;

fields = new HashSet<>();

for (AnnotatedField<? super X> field : delegate.getFields()) {

if (field.isAnnotationPresent(CacheContext.class))

fields.add(new AutoInjectingAnnotatedField(field));

else

fields.add(field);

}

}

…
@antoine_sd @cdispec#Devoxx #CDI2
Example 3/7
…

public Set<AnnotatedField<? super X>> getFields() {

return fields;

}

public Class<X> getJavaClass() {

return delegate.getJavaClass();

}

// 7 more similar methods


}

@antoine_sd @cdispec#Devoxx #CDI2
Example 4/7
Then we need to do the same for AnnotatedField to add @Inject to the
field annotations set
public class AutoInjectingAnnotatedField<X> implements AnnotatedField<X> {



private final Set<Annotation> annotations;

private final AnnotatedField<X> delegate;



public AutoInjectingAnnotatedField(AnnotatedField<X> delegate) {

this.delegate = delegate;

annotations = new HashSet<>(delegate.getAnnotations());

annotations.add(new InjectLiteral());

}

…
@antoine_sd @cdispec#Devoxx #CDI2
Example 5/7
public <T extends Annotation> T getAnnotation(Class<T> annotationType) {

if (annotationType.equals(Inject.class))

return (T) new InjectLiteral();

return delegate.getAnnotation(annotationType);

}



public Set<Annotation> getAnnotations() {

return annotations;

}

...
@antoine_sd @cdispec#Devoxx #CDI2
Example 6/7
public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {

if (annotationType.equals(Inject.class))

return true;

return delegate.isAnnotationPresent(annotationType);

}
public Set<Type> getTypeClosure() {

return delegate.getTypeClosure();

}

// 4 similar methods


}
@antoine_sd @cdispec#Devoxx #CDI2
Example 7/7
Finaly we need to write the extension to use our custom AnnotatedType
and AnnotatedField
public class AutoInjectExtension implements Extension {



public <T> void CreateIP(
@Observes @WithAnnotations(CacheContext.class)
ProcessAnnotatedType<T> pat) {

pat.setAnnotatedType(
new AutoInjectingAnnotatedType<T>(pat.getAnnotatedType()));

}

}
@antoine_sd @cdispec#Devoxx #CDI2
In CDI 2.0
We introduced configurators, helping creation of these metadata
This configurators are accessible thru container lifecycle events
They are automatically built by the container at the end of
observer invocation
@antoine_sd @cdispec#Devoxx #CDI2
In CDI 2.0
All the previous code fits in this extension
public class AutoInjectExtension implements Extension {



public <T> void CreateIP(
@Observes @WithAnnotations(CacheContext.class) ProcessAnnotatedType<T> pat)
{

pat.configureAnnotatedType().filterFields(
f -> f.isAnnotationPresent(CacheContext.class)
)

.forEach(f -> f.add(InjectLiteral.INSTANCE));
}

}
@antoine_sd @cdispec#Devoxx #CDI2
AOP enhancement
Support AOP on custom or produced bean
CDI 2.0 is upon us Devoxx
@antoine_sd @cdispec#Devoxx #CDI2
Support AOP on producer
In CDI 1.x you cannot bind an interceptor to a produced bean
When you write:
@Transactional is applied to producer method
@Produces

@Transactional
public MyService produceService() {
...
}
@antoine_sd @cdispec#Devoxx #CDI2
Support Interceptor on producer
Answer is probably the new InterceptionFactory
This factory uses an AnnotatedType to know where adding interceptor bindings in
the class
Could also be used in Custom Bean create method
public interface InterceptionFactory<T> {



InterceptionProxyFactory<T> ignoreFinalMethods();



AnnotatedTypeConfigurator<T> configure();



<T> T createInterceptedInstance(T InstanceToWrap);



}
@antoine_sd @cdispec#Devoxx #CDI2
Add @transaction on one produced bean method
@Produces

@RequestScoped

public MyClass createJpaEmAssumed(InterceptionFactory<MyClass> ify) {

AnnotatedTypeConfigurator<MyClass> atc = ify.configure();



atc.filterMethods(m -> m.getJavaMember().getName().equals("doSomething"))

.findFirst()
.ifPresent(m -> m.add(new AnnotationLiteral<Transactional>() { }));



return ify.createInterceptedInstance(new MyClass());



}
@antoine_sd @cdispec#Devoxx #CDI2
CDI 2.0 needs you
CDI 2.0 specification is open to everyone
Come on join us on the mailing list and IRC channel
All infos on http://cdi-spec.org or by following to @cdispec on
twitter
The more we are the more we’ll deliver
@antoine_sd @cdispec#Devoxx #CDI2
Which JSR you’ll use 365 days a year?
…
JSR 365

More Related Content

PDF
CDI 2.0 is coming
Antoine Sabot-Durand
 
PDF
Apache Deltaspike the CDI Toolbox (Java One 2015)
Antoine Sabot-Durand
 
PDF
CDI 2.0 is coming
Antoine Sabot-Durand
 
PDF
The path to cdi 2.0
Antoine Sabot-Durand
 
PDF
Advanced CDI in live coding
Antoine Sabot-Durand
 
PDF
Extending Java EE with CDI and JBoss Forge
Antoine Sabot-Durand
 
PDF
Adopt a JSR: CDI 2.0 at Devoxx UK
Antoine Sabot-Durand
 
PDF
CDI 1.1 university
Antoine Sabot-Durand
 
CDI 2.0 is coming
Antoine Sabot-Durand
 
Apache Deltaspike the CDI Toolbox (Java One 2015)
Antoine Sabot-Durand
 
CDI 2.0 is coming
Antoine Sabot-Durand
 
The path to cdi 2.0
Antoine Sabot-Durand
 
Advanced CDI in live coding
Antoine Sabot-Durand
 
Extending Java EE with CDI and JBoss Forge
Antoine Sabot-Durand
 
Adopt a JSR: CDI 2.0 at Devoxx UK
Antoine Sabot-Durand
 
CDI 1.1 university
Antoine Sabot-Durand
 

What's hot (20)

PDF
CDI In Real Life
Antoine Sabot-Durand
 
PDF
New York Kubernetes: CI/CD Patterns for Kubernetes
Andrew Phillips
 
PDF
Introduction to cdi given at java one 2014
Antoine Sabot-Durand
 
PDF
Android MvRx Framework 介紹
Kros Huang
 
PDF
基於 Flow & Path 的 MVP 架構
玄武 Wu
 
PPTX
OpenDDR and Jakarta MVC - JavaLand 2021
Werner Keil
 
PDF
Binary Authorization in Kubernetes
Aysylu Greenberg
 
PDF
Android NDK: Entrando no Mundo Nativo
Eduardo Carrara de Araujo
 
PDF
Software Supply Chain Management with Grafeas and Kritis
Aysylu Greenberg
 
KEY
Scala on androids
thoraage
 
PDF
Common primitives in Docker environments
alexandru giurgiu
 
PDF
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plans
Michael Vorburger
 
PPTX
OpenDaylight Developer Experience 2.0
Michael Vorburger
 
PDF
MicroProfile for MicroServices
Mert Çalışkan
 
PPT
Steelcon 2015 Reverse-Engineering Obfuscated Android Applications
Tom Keetch
 
PDF
Spring Up Your Graph
VMware Tanzu
 
PDF
Come and Play! with Java EE 7
Antonio Goncalves
 
PDF
BMO - Intelligent Projects with Maven
Mert Çalışkan
 
PDF
AOTB2014: Agile Testing on the Java Platform
Peter Pilgrim
 
KEY
OSGi, Eclipse and API Tooling
Chris Aniszczyk
 
CDI In Real Life
Antoine Sabot-Durand
 
New York Kubernetes: CI/CD Patterns for Kubernetes
Andrew Phillips
 
Introduction to cdi given at java one 2014
Antoine Sabot-Durand
 
Android MvRx Framework 介紹
Kros Huang
 
基於 Flow & Path 的 MVP 架構
玄武 Wu
 
OpenDDR and Jakarta MVC - JavaLand 2021
Werner Keil
 
Binary Authorization in Kubernetes
Aysylu Greenberg
 
Android NDK: Entrando no Mundo Nativo
Eduardo Carrara de Araujo
 
Software Supply Chain Management with Grafeas and Kritis
Aysylu Greenberg
 
Scala on androids
thoraage
 
Common primitives in Docker environments
alexandru giurgiu
 
OpenDaylight Developers Experience 1.5: Eclipse Setup, HOT reload, future plans
Michael Vorburger
 
OpenDaylight Developer Experience 2.0
Michael Vorburger
 
MicroProfile for MicroServices
Mert Çalışkan
 
Steelcon 2015 Reverse-Engineering Obfuscated Android Applications
Tom Keetch
 
Spring Up Your Graph
VMware Tanzu
 
Come and Play! with Java EE 7
Antonio Goncalves
 
BMO - Intelligent Projects with Maven
Mert Çalışkan
 
AOTB2014: Agile Testing on the Java Platform
Peter Pilgrim
 
OSGi, Eclipse and API Tooling
Chris Aniszczyk
 
Ad

Similar to CDI 2.0 is upon us Devoxx (20)

PDF
CDI 2.0 Deep Dive
Thorben Janssen
 
PDF
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
SOAT
 
PDF
CDI Best Practices with Real-Life Examples - TUT3287
Ahmad Gohar
 
PPTX
Context and Dependency Injection 2.0
Brian S. Paskin
 
PDF
CDI Integration in OSGi - Emily Jiang
mfrancis
 
PDF
2/3 : CDI advanced - Antoine Sabot-Durand
SOAT
 
PDF
CDI 2.0 (JSR 365) - Java Day Tokyo 2017 (English)
Logico
 
PDF
Contextual Dependency Injection for Apachecon 2010
Rohit Kelapure
 
PDF
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Shekhar Gulati
 
PDF
Apache DeltaSpike: The CDI Toolbox
Virtual JBoss User Group
 
PDF
Apache DeltaSpike the CDI toolbox
Antoine Sabot-Durand
 
PDF
EJB and CDI - Alignment and Strategy
David Delabassee
 
PDF
OpenWebBeans and DeltaSpike at ApacheCon
os890
 
PDF
Java EE 8: On the Horizon
Josh Juneau
 
PDF
2015 JavaOne EJB/CDI Alignment
David Blevins
 
PDF
2015 JavaOne EJB/CDI Alignment
Jean-Louis MONTEIRO
 
PPT
Cdi demo
Ken Gullaksen
 
PPTX
2012 04-09-v2-tdp-1167-cdi-bestpractices-final
Rohit Kelapure
 
PPTX
2012 04-09-v2-tdp-1167-cdi-bestpractices-final
Rohit Kelapure
 
CDI 2.0 Deep Dive
Thorben Janssen
 
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
SOAT
 
CDI Best Practices with Real-Life Examples - TUT3287
Ahmad Gohar
 
Context and Dependency Injection 2.0
Brian S. Paskin
 
CDI Integration in OSGi - Emily Jiang
mfrancis
 
2/3 : CDI advanced - Antoine Sabot-Durand
SOAT
 
CDI 2.0 (JSR 365) - Java Day Tokyo 2017 (English)
Logico
 
Contextual Dependency Injection for Apachecon 2010
Rohit Kelapure
 
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Shekhar Gulati
 
Apache DeltaSpike: The CDI Toolbox
Virtual JBoss User Group
 
Apache DeltaSpike the CDI toolbox
Antoine Sabot-Durand
 
EJB and CDI - Alignment and Strategy
David Delabassee
 
OpenWebBeans and DeltaSpike at ApacheCon
os890
 
Java EE 8: On the Horizon
Josh Juneau
 
2015 JavaOne EJB/CDI Alignment
David Blevins
 
2015 JavaOne EJB/CDI Alignment
Jean-Louis MONTEIRO
 
Cdi demo
Ken Gullaksen
 
2012 04-09-v2-tdp-1167-cdi-bestpractices-final
Rohit Kelapure
 
2012 04-09-v2-tdp-1167-cdi-bestpractices-final
Rohit Kelapure
 
Ad

More from Antoine Sabot-Durand (10)

PDF
Cdi from monolith to module
Antoine Sabot-Durand
 
PDF
What's new in CDI 2.0
Antoine Sabot-Durand
 
PDF
Mute Java EE DNA with CDI
Antoine Sabot-Durand
 
PDF
Java EE, un ami qui vous veut du bien
Antoine Sabot-Durand
 
PDF
Going further with CDI 1.2
Antoine Sabot-Durand
 
PDF
Invoke dynamite in Java EE with invoke dynamic
Antoine Sabot-Durand
 
PDF
Fais ce que tu veux avec Java EE - Devoxx France 2014
Antoine Sabot-Durand
 
PDF
The Magnificent java EE 7 in Wildfly-O-Rama
Antoine Sabot-Durand
 
PDF
Devoxx Java Social and Agorava
Antoine Sabot-Durand
 
KEY
CDI mis en pratique avec Seam Social et Weld OSGI
Antoine Sabot-Durand
 
Cdi from monolith to module
Antoine Sabot-Durand
 
What's new in CDI 2.0
Antoine Sabot-Durand
 
Mute Java EE DNA with CDI
Antoine Sabot-Durand
 
Java EE, un ami qui vous veut du bien
Antoine Sabot-Durand
 
Going further with CDI 1.2
Antoine Sabot-Durand
 
Invoke dynamite in Java EE with invoke dynamic
Antoine Sabot-Durand
 
Fais ce que tu veux avec Java EE - Devoxx France 2014
Antoine Sabot-Durand
 
The Magnificent java EE 7 in Wildfly-O-Rama
Antoine Sabot-Durand
 
Devoxx Java Social and Agorava
Antoine Sabot-Durand
 
CDI mis en pratique avec Seam Social et Weld OSGI
Antoine Sabot-Durand
 

Recently uploaded (20)

PPTX
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
PPTX
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 
PPTX
TRAVEL APIs | WHITE LABEL TRAVEL API | TOP TRAVEL APIs
philipnathen82
 
PDF
Exploring AI Agents in Process Industries
amoreira6
 
PDF
49785682629390197565_LRN3014_Migrating_the_Beast.pdf
Abilash868456
 
PDF
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
PDF
vAdobe Premiere Pro 2025 (v25.2.3.004) Crack Pre-Activated Latest
imang66g
 
PDF
What to consider before purchasing Microsoft 365 Business Premium_PDF.pdf
Q-Advise
 
PPTX
Presentation about Database and Database Administrator
abhishekchauhan86963
 
PPTX
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
PDF
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
PDF
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
PDF
49784907924775488180_LRN2959_Data_Pump_23ai.pdf
Abilash868456
 
PPTX
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
PDF
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
PDF
Salesforce Implementation Services Provider.pdf
VALiNTRY360
 
PDF
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
PPTX
Presentation about variables and constant.pptx
kr2589474
 
PDF
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
PDF
Summary Of Odoo 18.1 to 18.4 : The Way For Odoo 19
CandidRoot Solutions Private Limited
 
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 
TRAVEL APIs | WHITE LABEL TRAVEL API | TOP TRAVEL APIs
philipnathen82
 
Exploring AI Agents in Process Industries
amoreira6
 
49785682629390197565_LRN3014_Migrating_the_Beast.pdf
Abilash868456
 
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
vAdobe Premiere Pro 2025 (v25.2.3.004) Crack Pre-Activated Latest
imang66g
 
What to consider before purchasing Microsoft 365 Business Premium_PDF.pdf
Q-Advise
 
Presentation about Database and Database Administrator
abhishekchauhan86963
 
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
49784907924775488180_LRN2959_Data_Pump_23ai.pdf
Abilash868456
 
slidesgo-unlocking-the-code-the-dynamic-dance-of-variables-and-constants-2024...
kr2589474
 
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
Salesforce Implementation Services Provider.pdf
VALiNTRY360
 
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
Presentation about variables and constant.pptx
kr2589474
 
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
Summary Of Odoo 18.1 to 18.4 : The Way For Odoo 19
CandidRoot Solutions Private Limited
 

CDI 2.0 is upon us Devoxx

  • 1. @antoine_sd @cdispec#Devoxx #CDI2 CDI 2.0 is upon us Antoine Sabot-Durand Red Hat CDI spec lead
  • 2. @antoine_sd @cdispec#Devoxx #CDI2 Me, Myself and I Antoine Sabot-Durand Software Engineer at Red Hat CDI spec lead CDI evangelist Follow me: @antoine_sd Follow CDI: @cdispec
  • 3. @antoine_sd @cdispec#Devoxx #CDI2 Agenda Flashback on CDI & CDI 2.0 status CDI 2.0 new features Java SE support Enhancing events Metadata configurators Interceptor and Decorators on Produced / custom beans (coming) Questions and Feedback
  • 5. @antoine_sd @cdispec#Devoxx #CDI2 CDI Timeline Dec 2009 June 2013 Apr 2014 Sep 2014 CDI1.0 (Java EE 6) CDI1.1 (Java EE 7) CDI1.2 (1.1 MR) CDI2.0 Starts jan 2017 CDI2.0 released
  • 6. @antoine_sd @cdispec#Devoxx #CDI2 CDI 1.0 - December 2009 A well-defined lifecycle for stateful objects bound to lifecycle contexts Where the set of contexts is extensible A type-safe dependency injection mechanism without verbose configuration Dependencies can be selected at development or deployment time Type-safe decorators and interceptors An event notification model An SPI allowing portable extensions to integrate cleanly with the container
  • 7. @antoine_sd @cdispec#Devoxx #CDI2 CDI 1.1 / 1.2 – June 2013 / April 2014 Add automatic enablement of CDI in Java EE Add introspection with event, bean, decorator and interceptor meta data Ease access to bean manager from outside CDI with CDI class Add global enablement of interceptors using the @Priority annotation Add Unmanaged allowing easy access to non-contexutal instances Spec clarification
  • 8. @antoine_sd @cdispec#Devoxx #CDI2 CDI 1.2 - April 2014 Clarification in the spec regarding: CDI Lifecycle Events Reworking Bean defining annotation to avoid conflict with other JSR 330 frameworks Clarification on conversation resolution OSGi official support in the API
  • 9. @antoine_sd @cdispec#Devoxx #CDI2 CDI 2.0 status JSR 365 started in September 2014 EDR1 released in 2015 EDR2 released in august. Weld 3 Alpha 17 is the RI for EDR2 Release expected in January 2017
  • 12. @antoine_sd @cdispec#Devoxx #CDI2 Java SE support using CDI outside Java EE
  • 13. @antoine_sd @cdispec#Devoxx #CDI2 Java SE support - Why? To align on many other Java EE spec which support Java SE bootstrapping To boost CDI adoption for Spec and Frameworks To provide a mean of building new stacks out of Java EE
  • 14. @antoine_sd @cdispec#Devoxx #CDI2 What did we do? CDI Specification CDI Core CDI for Java EECDI for Java SE
  • 15. @antoine_sd @cdispec#Devoxx #CDI2 Java SE bootstrap API public static void main(String[] args) {
 
 SeContainer container = SeContainerInitializer.newInstance()
 .disableDiscovery()
 .addBeanClasses(MyService.class)
 .initialize();
 
 MyService service = container.select(MyService.class).get();
 
 service.sayHello();
 
 container.close();
 }
  • 16. @antoine_sd @cdispec#Devoxx #CDI2 Controlling the Request Context In Java SE, most of our built-in contexts are unavailable: Request context Session context Conversation context That’s why we added tools to activate Request context programmatically This feature is also available for Java EE
  • 17. @antoine_sd @cdispec#Devoxx #CDI2 Controlling the Request Context @ApplicationScoped
 public class MyBean {
 
 @Inject
 private RequestContextController requestContextController;
 
 public void doRequest(String body) {
 // activate request context
 requestContextController.activate();
 
 // do work in a request context.
 
 // deactivate the request context
 requestContextController.deactivate();
 }
 
 }
  • 18. @antoine_sd @cdispec#Devoxx #CDI2 In interceptor mode @ApplicationScoped
 public class MyBean {
 
 @ActivateRequestContext
 public void doRequest(String body) {
 // Request Context will be activated during this invocation
 }
 }
  • 19. @antoine_sd @cdispec#Devoxx #CDI2 Enhancing events Making popular feature even more popular
  • 20. @antoine_sd @cdispec#Devoxx #CDI2 Enhancing events CDI events are a very loved feature We took a very long time to see how to enhance them In CDI 2.0 we are introducing Event ordering Asynchronous events
  • 21. @antoine_sd @cdispec#Devoxx #CDI2 Events ordering By adding a @Priority (from commons annotations) on an observer. The lowest value is first Observers with no explicit priority have a middle range priority Allowing observer to be called last Observer with the same priority are called in an undefined order No priority on async events
  • 22. @antoine_sd @cdispec#Devoxx #CDI2 Events ordering public void observer1(@Observes @Priority(1) Payload p) { } public void observer2(@Observes @Priority(2) Payload p) { }
  • 23. @antoine_sd @cdispec#Devoxx #CDI2 Events ordering in extensions public class MyExtension implements Extension {
 
 public void firstPat(@Observes @Priority(1) ProcessAnnotatedType<?> pat) { …
 }
 public void secondPat(@Observes @Priority(2) ProcessAnnotatedType<?> pat) { …
 }
 
 }
  • 24. @antoine_sd @cdispec#Devoxx #CDI2 CDI 1.x: Sync / Async Sync / Async is not specified The immutable status of the payload is not specified Implementations use a Sync model The payload is mutated in some implementations / framework Going async “blindly” might raise problems…
  • 25. @antoine_sd @cdispec#Devoxx #CDI2 Synchronous events - firing pattern @Inject
 Event<Payload> event;
 public void someBSCriticalBusinessMethod() {
 event.fire(new Payload());
 }
  • 26. @antoine_sd @cdispec#Devoxx #CDI2 Synchronous events - observing pattern public void callMe(@Observes Payload payload) {
 // Do something with the event }
  • 27. @antoine_sd @cdispec#Devoxx #CDI2 Events are sync in CDI 1 All the observers are called in the firing thread In no particular order (at least not specified) The payload may be mutated Observers may inject beans Observers are aware of Transactional and security contexts
  • 28. @antoine_sd @cdispec#Devoxx #CDI2 Asynchronous Events Async events can’t: Mute Payload Access CDI contexts states at the firing point Be transactional So designing backward compatible async events is more tricky than it looks: A currently sync event should remain sync Going sync / async should be a decision taken from the firing side Being sync should be possible from the observing side
  • 29. @antoine_sd @cdispec#Devoxx #CDI2 Async events - firing pattern @Inject
 Event<Payload> event;
 public void someEvenMoreCriticalBusinessMethod() { 
 event.fireAsync(new Payload());
 }
  • 30. @antoine_sd @cdispec#Devoxx #CDI2 Async events - observing pattern public void callMe(@ObservesAsync Payload payload) {
 // I am called in another thread }
  • 31. @antoine_sd @cdispec#Devoxx #CDI2 Sync vs Async Events in a nutshell callMe(@Observes payload) callMe(@ObservesAsync payload) event.fire(payload) Sync call Not notified event.fireAsync(payload) Not notified Async call
  • 32. @antoine_sd @cdispec#Devoxx #CDI2 Adding an Executor to fireAsync @Inject
 Event<PanelUpdater> event;
 public void someOtherCriticalBusinessMethod() { 
 event.fireAsync(new PanelUpdater(green), 
 executor); }
  • 33. @antoine_sd @cdispec#Devoxx #CDI2 Async event in the GUI thread @Inject
 Event<PanelUpdater> event;
 public void someOtherCriticalBusinessMethod() { 
 event.fireAsync(new PanelUpdater(green), SwingUtilities::invokeLater);
 }
  • 34. @antoine_sd @cdispec#Devoxx #CDI2 Handling exceptions @Inject
 Event<PanelUpdater> event;
 public void someOtherCriticalBusinessMethod() { 
 CompletionStage<PanelUpdater> stage = 
 event.fireAsync(new PanelUpdater(green), SwingUtilities::invokeLater);
 }
  • 35. @antoine_sd @cdispec#Devoxx #CDI2 Handling exceptions Exception in one async observer doesn’t stop execution as in sync observer One of the reasons why firing async event doesn’t trigger sync observers Event.fireAsync returns a CompletionStage Allowing integration of async events in standard Java 8 async pipeline
  • 36. @antoine_sd @cdispec#Devoxx #CDI2 Handling exceptions The Exception in fireAsync returned CompletionStage is CompletionException It holds all the exceptions in the suppressed exception set
  • 37. @antoine_sd @cdispec#Devoxx #CDI2 Handling exceptions Exception handling is done with the Standard Java 8 async api, with: stage.whenComplete() to deal with result or exception stage.handle() same as above but allows transformation of stage stage.exceptionally() to only treat exception case
  • 38. @antoine_sd @cdispec#Devoxx #CDI2 SPI enhancement New configurators for meta data
  • 39. @antoine_sd @cdispec#Devoxx #CDI2 Standard annotations instances CDI makes an heavy use of Annotations Java doesn’t provide easy way to create an annotation instance We provided AnnotationLiteral, to help users create their instances Annotation instance = new AnnotationLiteral<ApplicationScoped>(){};
  • 40. @antoine_sd @cdispec#Devoxx #CDI2 When members are here a class has to be created public class NamedLiteral extends AnnotationLiteral<Named> implements Named{
 
 private String value;
 
 public NamedLiteral(String value) {
 this.value = value;
 }
 
 @Override
 public String value() {
 return null;
 }
 }
  • 41. @antoine_sd @cdispec#Devoxx #CDI2 CDI 2.0 provides helpers out of the box ApplicationScoped literal = ApplicationScoped.Literal.INSTANCE; 
 Named literal2 = NamedLiteral.of("myName");

  • 42. @antoine_sd @cdispec#Devoxx #CDI2 Configurators for meta-data Some meta-data are very verbose to create AnnotatedType Bean InjectionPoint ObserverMethod If you only need to add info to an existing meta-data, it’s very boring
  • 43. @antoine_sd @cdispec#Devoxx #CDI2 Example with CDI 1.2 I have a legacy framework I want to adapt it for CDI I need to detect all @CacheContext annotations on fields… ...And transform them in injection point I’ll use an extension to replace @CacheContext annotation by @Inject in AnnotatedTypes
  • 44. @antoine_sd @cdispec#Devoxx #CDI2 Example 1/7 First we need to implement an AnnotatedType to decorate the original one and modify AnnotatedField set
  • 45. @antoine_sd @cdispec#Devoxx #CDI2 Example 2/7 public class AutoInjectingAnnotatedType<X> implements AnnotatedType<X> {
 
 private final AnnotatedType<X> delegate;
 private final Set<AnnotatedField<? super X>> fields;
 
 public AutoInjectingAnnotatedType(AnnotatedType<X> delegate) {
 this.delegate = delegate;
 fields = new HashSet<>();
 for (AnnotatedField<? super X> field : delegate.getFields()) {
 if (field.isAnnotationPresent(CacheContext.class))
 fields.add(new AutoInjectingAnnotatedField(field));
 else
 fields.add(field);
 }
 }
 …
  • 46. @antoine_sd @cdispec#Devoxx #CDI2 Example 3/7 …
 public Set<AnnotatedField<? super X>> getFields() {
 return fields;
 }
 public Class<X> getJavaClass() {
 return delegate.getJavaClass();
 }
 // 7 more similar methods 
 }

  • 47. @antoine_sd @cdispec#Devoxx #CDI2 Example 4/7 Then we need to do the same for AnnotatedField to add @Inject to the field annotations set public class AutoInjectingAnnotatedField<X> implements AnnotatedField<X> {
 
 private final Set<Annotation> annotations;
 private final AnnotatedField<X> delegate;
 
 public AutoInjectingAnnotatedField(AnnotatedField<X> delegate) {
 this.delegate = delegate;
 annotations = new HashSet<>(delegate.getAnnotations());
 annotations.add(new InjectLiteral());
 }
 …
  • 48. @antoine_sd @cdispec#Devoxx #CDI2 Example 5/7 public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
 if (annotationType.equals(Inject.class))
 return (T) new InjectLiteral();
 return delegate.getAnnotation(annotationType);
 }
 
 public Set<Annotation> getAnnotations() {
 return annotations;
 }
 ...
  • 49. @antoine_sd @cdispec#Devoxx #CDI2 Example 6/7 public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
 if (annotationType.equals(Inject.class))
 return true;
 return delegate.isAnnotationPresent(annotationType);
 } public Set<Type> getTypeClosure() {
 return delegate.getTypeClosure();
 }
 // 4 similar methods 
 }
  • 50. @antoine_sd @cdispec#Devoxx #CDI2 Example 7/7 Finaly we need to write the extension to use our custom AnnotatedType and AnnotatedField public class AutoInjectExtension implements Extension {
 
 public <T> void CreateIP( @Observes @WithAnnotations(CacheContext.class) ProcessAnnotatedType<T> pat) {
 pat.setAnnotatedType( new AutoInjectingAnnotatedType<T>(pat.getAnnotatedType()));
 }
 }
  • 51. @antoine_sd @cdispec#Devoxx #CDI2 In CDI 2.0 We introduced configurators, helping creation of these metadata This configurators are accessible thru container lifecycle events They are automatically built by the container at the end of observer invocation
  • 52. @antoine_sd @cdispec#Devoxx #CDI2 In CDI 2.0 All the previous code fits in this extension public class AutoInjectExtension implements Extension {
 
 public <T> void CreateIP( @Observes @WithAnnotations(CacheContext.class) ProcessAnnotatedType<T> pat) {
 pat.configureAnnotatedType().filterFields( f -> f.isAnnotationPresent(CacheContext.class) )
 .forEach(f -> f.add(InjectLiteral.INSTANCE)); }
 }
  • 53. @antoine_sd @cdispec#Devoxx #CDI2 AOP enhancement Support AOP on custom or produced bean
  • 55. @antoine_sd @cdispec#Devoxx #CDI2 Support AOP on producer In CDI 1.x you cannot bind an interceptor to a produced bean When you write: @Transactional is applied to producer method @Produces
 @Transactional public MyService produceService() { ... }
  • 56. @antoine_sd @cdispec#Devoxx #CDI2 Support Interceptor on producer Answer is probably the new InterceptionFactory This factory uses an AnnotatedType to know where adding interceptor bindings in the class Could also be used in Custom Bean create method public interface InterceptionFactory<T> {
 
 InterceptionProxyFactory<T> ignoreFinalMethods();
 
 AnnotatedTypeConfigurator<T> configure();
 
 <T> T createInterceptedInstance(T InstanceToWrap);
 
 }
  • 57. @antoine_sd @cdispec#Devoxx #CDI2 Add @transaction on one produced bean method @Produces
 @RequestScoped
 public MyClass createJpaEmAssumed(InterceptionFactory<MyClass> ify) {
 AnnotatedTypeConfigurator<MyClass> atc = ify.configure();
 
 atc.filterMethods(m -> m.getJavaMember().getName().equals("doSomething"))
 .findFirst() .ifPresent(m -> m.add(new AnnotationLiteral<Transactional>() { }));
 
 return ify.createInterceptedInstance(new MyClass());
 
 }
  • 58. @antoine_sd @cdispec#Devoxx #CDI2 CDI 2.0 needs you CDI 2.0 specification is open to everyone Come on join us on the mailing list and IRC channel All infos on http://cdi-spec.org or by following to @cdispec on twitter The more we are the more we’ll deliver
  • 59. @antoine_sd @cdispec#Devoxx #CDI2 Which JSR you’ll use 365 days a year? … JSR 365