A 30 slide CDI (Context and Dependency Injection for the Java EE Platform) presentation Jens Augustsson from Redpill Linpro did in Copenhagen March 23 2011
6. Martin Fowler.
Coined the term ”Dependency Injection”
«The fundamental choice is between
Service Locator and Dependency Injection»
http://martinfowler.com/articles/injection.html
«Inversion of Control» ... «The Hollywood principle»
Consulting ● Development ● IT Operations ● Training ● Support ● Products
7. CDI - JSR299.
”Context and Dependency Injection for the Java EE Platform”
«Loose coupling, strong typing»
Consulting ● Development ● IT Operations ● Training ● Support ● Products
8. but...
Why care?
Consulting ● Development ● IT Operations ● Training ● Support ● Products
9. JEE5 DI features.
Resource injection in JEE5
✔ @EJB, @Resource, @PersistenceContext,
@PersistenceUnit
✔ Servlets, JSF backing beans and other EJBs
Problems
✔ Cannot inject EJBs into Struts Actions
✔ Cannot inject DAOs or helper classes that
were not written as EJBs
✔ Hard to integrate anything but strictly
business components
Consulting ● Development ● IT Operations ● Training ● Support ● Products
10. Alternative DI frameworks.
PicoContainer
✔ Early one
HiveMind
✔ Howard Lewis Ship & Tapestry
Spring Core
✔ The de facto standard
Seam 2
✔ By the Hibernate Team
Guice
✔ Crazy Bob Lee @ Google
Consulting ● Development ● IT Operations ● Training ● Support ● Products
11. but I've heard the term.....
CDI
WebBeans
old name for... new name for...
JSR-299
implements... inspired...
Seam 2
Weld
part of...
includes...
uses... Java EE 6
D4J
name for...
Seam 3 JSR-330
created by... created by...
Spring Core
Guice
Consulting ● Development ● IT Operations ● Training ● Support ● Products
12. next...
2. CDI Features
Consulting ● Development ● IT Operations ● Training ● Support ● Products
13. Injection points.
Class constructor public class Checkout {
private final ShoppingCart cart;
@Inject
public Checkout(ShoppingCart cart) {
this.cart = cart;
}
}
Initializer method public class Checkout {
private ShoppingCart cart;
@Inject
void setShoppingCart(ShoppingCart cart) {
this.cart = cart;
}
}
Direct field public class Checkout {
private @Inject ShoppingCart cart;
}
Consulting ● Development ● IT Operations ● Training ● Support ● Products
14. Bean types.
A user-defined class or interface
In a JEE module with a /META-INF/beans.xml
public class BookShop
extends Business
implements Shop<Book>, Auditable {
...
}
...but «there can be only one»...
Consulting ● Development ● IT Operations ● Training ● Support ● Products
15. Non-default qualifiers.
Custom annotations links...
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Asynchronous {}
...the qualified bean...
@Asynchronous
public class AsynchronousPaymentProcessor implements PaymentProcessor {
public void process(Payment payment) { ... }
}
...to declared injection points.
@Inject @Asynchronous PaymentProcessor asyncPaymentProcessor;
@Inject @Synchronous PaymentProcessor syncPaymentProcessor;
Consulting ● Development ● IT Operations ● Training ● Support ● Products
16. Producer methods.
Run time qualifier
public PaymentAction {
@Inject @Preferred PaymentStrategy paymentStrategy;
...
}
@Singleton @Managed
public PaymentServiceBean imlements PaymentService {
PaymentStrategy paymentStrategy = PaymentStrategy.CREDIT_CARD;
@Produces @Preferred @SessionScoped
public PaymentStrategy getPaymentStrategy(CreditCardPaymentStrategy ccps,
CheckPaymentStrategy cps,
PayPalPaymentStrategy ppps) {
switch (paymentStrategy) {
case CREDIT_CARD: return ccps;
case CHEQUE: return cps;
case PAYPAL: return ppps;
default: return null;
}
}
Consulting ● Development ● IT Operations ● Training ● Support ● Products
17. Scopes and Contexts.
Scope determines...
✔ When a new instance of any bean with that scope is created
✔ When an existing instance of any bean with that scope is destroyed
✔ Which injected references refer to any instance of a bean with that scope
✔ CDI features an extensible context model
Built-in scopes
✔ (@Dependent)
✔ @RequestScoped
✔ @SessionScoped
✔ @ApplicationScoped
✔ @ConversationScoped
Consulting ● Development ● IT Operations ● Training ● Support ● Products
20. Interceptors - 2.
Binding
@InterceptorBinding
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface MySecurity {}
public class ShoppingCart {
@MySecurity public void checkout() { ... }
}
Consulting ● Development ● IT Operations ● Training ● Support ● Products
21. Interceptors - 3.
Implementation - business method:
@MySecurity @Interceptor
public class MySecurityInterceptor {
@AroundInvoke
public Object manageSecurity(InvocationContext ctx) throws Exception { ... }
}
Implementation - lifecycle: @PostConstruct, @PreDestroy...
Implementation - timeout: @AroundTimeout
Consulting ● Development ● IT Operations ● Training ● Support ● Products
22. Decorators .
Interceptors capture orthogonal application concerns
§
The reverse is true of decorators
@Decorator
public abstract class LargeTransactionDecorator implements Account {
@Inject @Delegate @Any Account account;
@PersistenceContext EntityManager em;
public void withdraw(BigDecimal amount) {
account.withdraw(amount);
if ( amount.compareTo(LARGE_AMOUNT)>0 ) {
em.persist( new LoggedWithdrawl(amount) );
}
}
public void deposit(BigDecimal amount);
account.deposit(amount);
if ( amount.compareTo(LARGE_AMOUNT)>0 ) {
em.persist( new LoggedDeposit(amount) );
}
}
} Consulting ● Development ● IT Operations ● Training ● Support ● Products
23. Events.
Become observable....
@Inject @Any Event<Document> documentEvent;
...
documentEvent.fire(document);
Become observer....
public void onAnyDocumentEvent(@Observes Document document) { ... }
Many conditional observations...
public void refreshOnDocumentUpdate(@Observes(receive = IF_EXISTS) @Updated Document d
public void addProduct(@Observes(during = AFTER_SUCCESS) @Created Product product) { .. }
Consulting ● Development ● IT Operations ● Training ● Support ● Products
24. Predefine scope and interceptors Stereotypes.
Declare Predefined by CDI:
@Interceptor, @Decorator
@Stateless and @Model
@Transactional(requiresNew=true)
@Secure
@Target(TYPE) @Named
@Retention(RUNTIME) @RequestScoped
@Stereotype @Documented
public @interface BusinessLogic {} @Stereotype
@Target(TYPE,METHOD,FIELD)
@Retention(RUNTIME)
Use public @interface Model {}
@BusinessLogic
public class UserService { ... }
Consulting ● Development ● IT Operations ● Training ● Support ● Products
25. JEE comp env resources.
@Produces @Resource(lookup="java:global/env/jdbc/CustomerDatasource")
@CustomerDatabase Datasource customerDatabase;
@Produces @PersistenceUnit(unitName="CustomerDatabase")
@CustomerDatabase EntityManagerFactory customerDatabasePersistenceUnit;
@Produces @WebServiceRef(lookup="java:app/service/Catalog")
Catalog catalog;
@Produces @EJB(ejbLink="../their.jar#PaymentService")
PaymentService paymentService;
Consulting ● Development ● IT Operations ● Training ● Support ● Products
26. next...
3. Advices
Consulting ● Development ● IT Operations ● Training ● Support ● Products
27. Similarities – with Seam2.
Spring IoC users: CDI more type-safe and
annotation-driven
Guice users: CDI more geared towards
enterprise development
Seam users: CDI has a lot more advanced
features
Consulting ● Development ● IT Operations ● Training ● Support ● Products
28. Similarities – with D4J .
Only five annotations!
@Inject
@Qualifier
@Named
@Scope
@Singleton
Consulting ● Development ● IT Operations ● Training ● Support ● Products
29. Personal experiences.
Good stuff
Seam improvement – no outjection, method-time injection etc.
Great for use with other frameworks – like jBPM
XML-hell is /actually/ gone
Be careful
Start off with managed beans – switch when needed
Avoid injection from ”thinner” context – use @Dependent
Weld documentation not finished
Avoid ”upgrade” JBoss AS 5.x
XML Configuration in Seam 3 Module
Annotation Frustration...
Consulting ● Development ● IT Operations ● Training ● Support ● Products
30. Get started!.
In JBoss 6.0.0.Final (Weld 1.1.0.Beta2)
In GlassFish Server 3.1 (Weld 1.1.0.Final)
Embed Weld in Tomcat, Jetty... Android almost :-)
And read more!
Dan Allens slideshare: Google ”Dan Allen slideshare cdi”
Gavin King and Bob Lee flamewar: Google ”Gavin King Bob Lee jsr"
Consulting ● Development ● IT Operations ● Training ● Support ● Products
31. End.
jens.augustsson@redpill-linpro.com
Consulting ● Development ● IT Operations ● Training ● Support ● Products