6. «but I've heard.....»
CDI
WebBeans
old name for... new name for...
Hibernate
JSR-299 standardized
implements...
Weld
part of... JPA
inspired...
includes... next project...
uses... Java EE 6
Seam 2
Seam 3 JSR-330 created by... Spring Core
name for... created by...
Guice
D4J
Consulting ● Development ● IT Operations ● Training ● Support ● Products
7. next...
2. CDI Features
Consulting ● Development ● IT Operations ● Training ● Support ● Products
8. 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
9. Injectable bean types.
A user-defined class or interface
In a JEE module with a /META-INF/beans.xml
public class CreditCardPaymentService
declare implements PaymentService {
...
}
use
... ...
@Inject or? @Inject
CreditCardPaymentService ps; PaymentService ps;
... ...
...«there can be only one»...
Consulting ● Development ● IT Operations ● Training ● Support ● Products
10. Non-default qualifiers.
Your custom annotations...
CDI anno @Qualifier
@Retention(RUNTIME)
JavaSE annos @Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Preferred {}
...links a declared injection point...
...
Your anno @Inject @Preferred PaymentService ps;
...
...to a qualified bean
@Preferred
public class CreditCardPaymentService implements PaymentService {
public void process(Payment payment) { ... }
}
Consulting ● Development ● IT Operations ● Training ● Support ● Products
11. Producer methods.
Run time qualifier
public PaymentAction {
@Inject @Preferred PaymentService userPaymentService;
...
}
public AnyClass {
@Inject
User user;
@Produces @Preferred
public PaymentService getUserPaymentService() {
return user.getPaymentServices().get(0);
}
}
Consulting ● Development ● IT Operations ● Training ● Support ● Products
12. 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 JEE defined
✔ @ApplicationScoped
✔ @ConversationScoped Defined by you
Consulting ● Development ● IT Operations ● Training ● Support ● Products
15. Interceptors - 2.
Binding
@InterceptorBinding
@Target({METHOD, TYPE})
CDI anno @Retention(RUNTIME)
public @interface MySecurity {}
public class ShoppingCart {
Your anno @MySecurity public void checkout() { ... }
}
Consulting ● Development ● IT Operations ● Training ● Support ● Products
16. 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
17. 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
18. Events.
Become observable....
@Inject @Updated Event<Document> documentEvent;
...
document.setLastModified(new Date());
documentEvent.fire(document);
Optional qualifier
Become observer....
public void handleDocs(@Observes @Updated Document document) { ... }
Conditional observations...
public void handleDocs(@Observes(during = AFTER_SUCCESS) @Updated Document doc) {
..
}
Consulting ● Development ● IT Operations ● Training ● Support ● Products
19. Predefine scope and interceptors Stereotypes.
Declare Predefined by CDI:
@Model
EJB @Stateless
@Transactional(requiresNew=true) @Named
your @Secure @RequestScoped
CDI @Stereotype @Documented
@Target(TYPE) @Stereotype
JSE @Retention(RUNTIME) @Target(TYPE,METHOD,FIELD)
public @interface BusinessLogic {} @Retention(RUNTIME)
public @interface Model {}
Use
@BusinessLogic
public class UserService { ... }
Consulting ● Development ● IT Operations ● Training ● Support ● Products
20. next...
3. Advices
Consulting ● Development ● IT Operations ● Training ● Support ● Products
21. 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
Annotations are adjectives (@Preferred), not nouns (@CreditCardPayment)
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... IT Operations ● Training ● Support ● Products
Consulting ● Development ●
22. 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 :-)
Generate project using Seam Forge or M2Eclipse
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
23. End.
jens.augustsson@redpill-linpro.com
Consulting ● Development ● IT Operations ● Training ● Support ● Products