CDI and Weld

1,426 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,426
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
18
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

CDI and Weld

  1. 1. CDI .Dependency Injection in JEE6 jens.augustsson@redpill-linpro.comConsulting ● Development ● IT Operations ● Training ● Support ● Products
  2. 2. Today. 1. What it is 2. Features 3. AdvicesConsulting ● Development ● IT Operations ● Training ● Support ● Products
  3. 3. next... 1. What it isConsulting ● Development ● IT Operations ● Training ● Support ● Products
  4. 4. Example.public class TextTranslator {   private final SentenceParser sentenceParser;   private final Translator sentenceTranslator;   @Inject   public TextTranslator(SentenceParser sentenceParser,  Translator sentenceTranslator) {      this.sentenceParser = sentenceParser;      this.sentenceTranslator = sentenceTranslator;   }   public String translate(String text) {      StringBuilder sb = new StringBuilder();      for (String sentence: sentenceParser.parse(text)) {          sb.append(sentenceTranslator.translate(sentence));      }      return sb.toString();   }} Consulting ● Development ● IT Operations ● Training ● Support ● Products
  5. 5. Example - 2.@Statelesspublic class SentenceTranslator implements Translator {   public String translate(String sentence) { ... }}public class SentenceParser {   public List<String> parse(String text) { ... }}Injection of: Managed Bean, EJB session beansInjection to: MDB, interceptor, Servlet, JAX-WS SE, JSP (tag h / ev lis) Consulting ● Development ● IT Operations ● Training ● Support ● Products
  6. 6. «but Ive 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 2Seam 3 JSR-330 created by... Spring Core name for... created by... Guice D4J Consulting ● Development ● IT Operations ● Training ● Support ● Products
  7. 7. next... 2. CDI FeaturesConsulting ● Development ● IT Operations ● Training ● Support ● Products
  8. 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. 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? @InjectCreditCardPaymentService ps; PaymentService ps;... ... ...«there can be only one»... Consulting ● Development ● IT Operations ● Training ● Support ● Products
  10. 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. 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. 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 modelBuilt-in scopes✔ (@Dependent)✔ @RequestScoped✔ @SessionScoped JEE defined✔ @ApplicationScoped✔ @ConversationScoped Defined by you Consulting ● Development ● IT Operations ● Training ● Support ● Products
  13. 13. Conversation Scope.@ConversationScoped @Statefulpublic class OrderBuilder {   private Order order;   private @Inject Conversation conversation;   private @PersistenceContext EntityManager em;   public Order createOrder() {      order = new Order();      conversation.begin();      return order;   }      public void addLineItem(Product product, int quantity) {      order.add(new LineItem(product, quantity));   }   public void saveOrder() {      em.persist(order);      conversation.end();   }   @Remove   public void destroy() {}} Consulting ● Development ● IT Operations ● Training ● Support ● Products
  14. 14. Interceptors.business method interceptionlifecycle callback interceptiontimeout method interception (ejb3) Consulting ● Development ● IT Operations ● Training ● Support ● Products
  15. 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. 16. Interceptors - 3. Implementation - business method:@MySecurity @Interceptorpublic 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. 17. Decorators . Interceptors capture orthogonal application concerns § The reverse is true of decorators@Decoratorpublic 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. 18. Events.Become observable.... @Inject @Updated Event<Document> documentEvent; ... document.setLastModified(new Date()); documentEvent.fire(document); Optional qualifierBecome 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. 19. Predefine scope and interceptors Stereotypes. Declare Predefined by CDI: @ModelEJB @Stateless @Transactional(requiresNew=true) @Namedyour @Secure @RequestScopedCDI @Stereotype @Documented @Target(TYPE) @StereotypeJSE @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. 20. next... 3. AdvicesConsulting ● Development ● IT Operations ● Training ● Support ● Products
  21. 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/ goneBe 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. 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 M2EclipseAnd 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. 23. End. jens.augustsson@redpill-linpro.comConsulting ● Development ● IT Operations ● Training ● Support ● Products

×