cdi in jee6

20
Presenter Prasanna Kumar.S Contexts and Dependency Injection (CDI) in JEE 6 JUGChennai JTech Day Sep'12

Upload: prasanna-kumar

Post on 15-Jan-2015

1.613 views

Category:

Technology


2 download

DESCRIPTION

this slide has been presented in JUGChennai JTechDay held on Sep 15 2012

TRANSCRIPT

Page 1: CDI in JEE6

Presenter Prasanna Kumar.S

Contexts and Dependency Injection (CDI)in JEE 6

JUGChennai JTech Day Sep'12

Page 2: CDI in JEE6

About me

A Java developer (now interested in Scala as well ...)

Active member in JUG Chennai

Creator & Co-Founder of scalaxia.com (a site which lists out the popular tweets about scala)

Contributed for ScalaFX project

Contact

Mail me [email protected]

Follow me @prasonscala

I blog @ [email protected]

Page 3: CDI in JEE6

Agenda

What is & Why DI ?

What is CDI

Features of CDI

Advantages of CDI

Injecting Beans (with some EJB tit-bits !!!)

Types of Injection

Qualifiers – Built in & custom qualifiers

Scope – Types of Scopes

CDI options....

Questions

Page 4: CDI in JEE6

What is Dependency Injection

PHONE ==> SIM ==> TOWER

Page 5: CDI in JEE6

Why Dependency Injection

user just relies (on)ly the Phonestreamlining dependent objects injection by

“Don't call your service, let service call you”

Achieve loose coupling of objects

Well proven practise

Page 6: CDI in JEE6

What is CDI

JSR 299

Provides a unifying Dependency Injection and contextual life cycle model for Java EE

A completely new, richer dependency management model

Type-safe dependency injection

Designed for use with stateful objects (scoped objects)

Page 7: CDI in JEE6

Advantages of CDI

Decouple server and client– Using well-defined types and qualifiers – Allows server implementations to vary

Decouple lifecycle of collaborating components– Automatic contextual lifecycle management by the CDI runtime

Decouple orthogonal concerns (AOP) – Interceptors & Decorators

NO XML !!!!

Can be used in both JAVA SE and JAVA EE applications

Page 8: CDI in JEE6

Injecting Beans

CDI is all about DI

CDI makes use of annotations

3 Types of injection points Field Method Parameter

Methods can be Constructor Initializer Setter Producer Observer

Page 9: CDI in JEE6

Basic CDI Beans

public interface Greeting {public String greet(String greet);

}

@Defaultpublic class PlainGreetingCDI implements Greeting {

public String greet(String greet) {return "greetings to " + greet;

}}

// client code@Injectprivate Greeting greeting;public String sayGreeting(String whomToGreet) {

return greeting.greet(whomToGreet);}

Page 10: CDI in JEE6

Qualifiers – Built in & custom quali-fiers

public interface CurrencyConverter {public Double convert(Double howMuchToConvert);

}

@Qualifier@Retention(RUNTIME)@Target({ TYPE, METHOD, FIELD, PARAMETER })public @interface CurrencyType {

VariousCurrencies type() default VariousCurrencies.DOLLAR;}

@CurrencyType(type = VariousCurrencies.DOLLAR)public class DollarConverter implements CurrencyConverter {

@Overridepublic Double convert(Double howMuchToConvert) {

return howMuchToConvert * 55;}

}

public enum VariousCurrencies { DOLLAR,EURO,POUNDS }

Page 11: CDI in JEE6

Qualifier in CDI

public interface CurrencyConverter {public Double convert(Double howMuchToConvert);

}

@Qualifier@Retention(RUNTIME)@Target({ TYPE, METHOD, FIELD, PARAMETER })public @interface CurrencyType {

VariousCurrencies type() default VariousCurrencies.DOLLAR;}

@CurrencyType(type = VariousCurrencies.DOLLAR)public class DollarConverter implements CurrencyConverter {

@Overridepublic Double convert(Double howMuchToConvert) {

return howMuchToConvert * 55;}

}

public enum VariousCurrencies { DOLLAR,EURO,POUNDS }

Page 12: CDI in JEE6

Qualifier in CDI (Contd)

// client code@Inject @CurrencyTypeprivate CurrencyConverter def_converter;

@Inject @CurrencyType(type=VariousCurrencies.EURO)private CurrencyConverter euroConverter;

Page 13: CDI in JEE6

Scoped Beans – Request Scope

@RequestScopedpublic class RequestScopedCurrencyConverterCDI {

private double currValue;

@Inject@CurrencyType(type=VariousCurrencies.DOLLAR)private CurrencyConverter currencyConverter;

// setters and getter for currencyConverter

public double convert() {return currencyConverter.convert(currValue);

}}

Page 14: CDI in JEE6

Scoped Beans – Request Scope

@Statelesspublic class ScopedCurrencyConverterEJB {

@Inject private RequestScopedCurrencyConverterCDI currencyConverterCDI@EJB private FormattedCurrencyConverter formattedCurrencyConverter;

public String getConvertedValue(double valueToConvert) {currencyConverterCDI.setCurrValue(valueToConvert);return formattedCurrencyConverter.getFormattedCurrency();

}}

@Stateless @LocalBeanpublic class FormattedCurrencyConverter {

@Inject private RequestScopedCurrencyConverterCDI currencyConverter;public String getFormattedCurrency() {

return "The converted "+ currencyConverter.getCurrValue() +" to " + currencyConverter.convert();

}}

Page 15: CDI in JEE6

Scoped Beans – Request Scope

// client code @EJBprivate ScopedCurrencyConverterEJB converterEJB;converterEJB.getConvertedValue(2) // "The converted 2.0 to 110.0"

Page 16: CDI in JEE6

Scoped Beans – Application Scope

@ApplicationScopedpublic class ApplicationScopedCDI {

private double currValue;

public void setCurrValue(double currValue) {this.currValue = currValue;

}

public double getCurrValue() {return currValue;

}

}// client codepublic void setValueToConvert(double value) {

applicationScopedCurrencyConverterCDI.setCurrValue(2);}

public double getValueToConvert() {return applicationScopedCurrencyConverterCDI.getCurrValue();

}

Page 17: CDI in JEE6

Scoped Beans – Application Scope

@ApplicationScopedpublic class ApplicationScopedCDI {

private double currValue;

public void setCurrValue(double currValue) {this.currValue = currValue;

}

public double getCurrValue() {return currValue;

}

}// client codepublic void setValueToConvert(double value) {

applicationScopedCurrencyConverterCDI.setCurrValue(2);}

public double getValueToConvert() {return applicationScopedCurrencyConverterCDI.getCurrValue();

}

Page 18: CDI in JEE6

CDI options

Reference Implementations

JBoss Weld

http://seamframework.org/Weld

Apache OpenWebBeans

http://openwebbeans.apache.org/owb/indexhtml

Caucho

http://www.caucho.com/

Supported App Containers

Jboss AS 7,GlassFish 3.1x ,Caucho, TomEE !!! &

all JEE6 containers

Page 19: CDI in JEE6

How do I learn / adopt

All code presented here are available under

https://github.com/prassee/JTechDayCDIExamples

You are welcome to contribute your own examples -

(Shameless sales pitch !!!!)

Project using CDI

AGORAVA project - http://agorava.org/

Feel free to contribute

JavaPassion site

http://javapassion.com/jugtalks

TomEE examples Trunk

http://tomee.apache.org/examples-trunk/index.html

Page 20: CDI in JEE6

Q&A