CDI and Weld

3,340 views

Published on

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

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. 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. 7. CDI - JSR299.”Context and Dependency Injection for the Java EE Platform” «Loose coupling, strong typing» Consulting ● Development ● IT Operations ● Training ● Support ● Products
  8. 8. but... Why care?Consulting ● Development ● IT Operations ● Training ● Support ● Products
  9. 9. JEE5 DI features.Resource injection in JEE5✔ @EJB, @Resource, @PersistenceContext, @PersistenceUnit✔ Servlets, JSF backing beans and other EJBsProblems✔ 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. 10. Alternative DI frameworks.PicoContainer ✔ Early oneHiveMind ✔ Howard Lewis Ship & TapestrySpring Core✔ The de facto standardSeam 2 ✔ By the Hibernate TeamGuice ✔ Crazy Bob Lee @ Google Consulting ● Development ● IT Operations ● Training ● Support ● Products
  11. 11. but Ive heard the term..... CDI WebBeans old name for... new name for... JSR-299 implements... inspired... Seam 2Weld 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. 12. next... 2. CDI FeaturesConsulting ● Development ● IT Operations ● Training ● Support ● Products
  13. 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. 14. Bean types.A user-defined class or interfaceIn 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. 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. 16. Producer methods. Run time qualifierpublic PaymentAction { @Inject @Preferred PaymentStrategy paymentStrategy; ...}@Singleton @Managedpublic 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. 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 modelBuilt-in scopes✔ (@Dependent)✔ @RequestScoped✔ @SessionScoped✔ @ApplicationScoped✔ @ConversationScoped Consulting ● Development ● IT Operations ● Training ● Support ● Products
  18. 18. 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
  19. 19. Interceptors.business method interceptionlifecycle callback interceptiontimeout method interception (ejb3) Consulting ● Development ● IT Operations ● Training ● Support ● Products
  20. 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. 21. 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
  22. 22. 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
  23. 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 dpublic void addProduct(@Observes(during = AFTER_SUCCESS) @Created Product product) { .. } Consulting ● Development ● IT Operations ● Training ● Support ● Products
  24. 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 {}@BusinessLogicpublic class UserService { ... } Consulting ● Development ● IT Operations ● Training ● Support ● Products
  25. 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. 26. next... 3. AdvicesConsulting ● Development ● IT Operations ● Training ● Support ● Products
  27. 27. Similarities – with Seam2.Spring IoC users: CDI more type-safe andannotation-drivenGuice users: CDI more geared towardsenterprise developmentSeam users: CDI has a lot more advancedfeatures Consulting ● Development ● IT Operations ● Training ● Support ● Products
  28. 28. Similarities – with D4J . Only five annotations! @Inject @Qualifier @Named @Scope @SingletonConsulting ● Development ● IT Operations ● Training ● Support ● Products
  29. 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/ goneBe 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. 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. 31. End. jens.augustsson@redpill-linpro.comConsulting ● Development ● IT Operations ● Training ● Support ● Products

×