CDI: How do I ?

Post on 15-Jul-2015

950 views 3 download

Transcript of CDI: How do I ?

CDI : How do I ?

by antonio goncalves@agoncal

2 @agoncal

Antonio Goncalves

What is CDI ?

4 @agoncal

What is CDI ?

● Dependency injection● Lose coupling, strong typing● Context management● Interceptors and decorators● Event bus● Extensions

5 @agoncal

History of CDI

6 @agoncal

Implementations

Demo-

Creating a Web App

8 @agoncal

Demos with JBoss Forge

● Java EE scaffolding tool● Shell commands● CRUD application● Gets you start quickly● Takes care of integration● Plugin based

9 @agoncal

Demo: Creating a Web App

Dependency Injection

11 @agoncal

How Do I ?

12 @agoncal

Use @Inject !

13 @agoncal

@Inject on Attributes

public class BookBean implements Serializable {

@Inject private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

14 @agoncal

@Inject on Constructor

public class BookBean implements Serializable {

private NumberGenerator numberGenerator; private ItemService itemService;

@Inject public BookBean(NumberGenerator numberGenerator, ItemService srv){ this.numberGenerator = numberGenerator; this.itemService = srv; }

// ...}

15 @agoncal

@Inject on Setters

public class BookBean implements Serializable {

private NumberGenerator numberGenerator; private ItemService itemService;

@Inject public void setNumberGenerator(NumberGenerator numGen){ this.numberGenerator = numGen; }

@Inject public void setItemService(ItemService itemService) { this.itemService = itemService; } // ...}

16 @agoncal

Activate CDI

● In CDI 1.0 beans.xml in archive● Since CDI 1.1 it's activated by default

● All classes having a bean definition annotation● beans.xml to deactivate or activate all

● Archive vs Bean archive

Demo-

@Inject

18 @agoncal

Demo: @Inject One Implementation

Qualifiers

20 @agoncal

How Do I ?

21 @agoncal

How Do I ?

22 @agoncal

How Do I ?

@Default

23 @agoncal

Use Qualifiers !

@ThirteenDigits

24 @agoncal

Use Qualifiers !

@EightDigits

25 @agoncal

A Qualifier

@Qualifier@Retention(RUNTIME)@Target({ METHOD, FIELD, PARAMETER, TYPE })@Documentedpublic @interface ThirteenDigits {}

26 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

27 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject @Default private ItemService itemService;

// ...}

28 @agoncal

Qualifying a Bean

@ThirteenDigitspublic class IsbnGenerator implements NumberGenerator {

@Override public String generateNumber() { return "13-" + Math.abs(new Random().nextInt()); }}

Demo-

Qualifiers

30 @agoncal

Demo: @Inject One Implementation

Producers

32 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

33 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

34 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Several persistence units@PersistenceContext(unitName = "myPU1")@PersistenceContext(unitName = "myPU2")

35 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Third party framewok

36 @agoncal

Use Producers !

public class BookBean implements Serializable {

@Inject private EntityManager em;

// ...}

public class ResourceProducer {

@Produces @PersistenceContext(unitName = "myPU") private EntityManager entityManager;

}

37 @agoncal

Use Producers !

public class BookBean implements Serializable {

@Inject private Logger logger;

// ...}

public class ResourceProducer {

@Produces private Logger produceLogger(InjectionPoint ip) { return Logger.getLogger(ip.getMember().getDeclaringClass().getName());

}}

Demo-

Producers

39 @agoncal

Demo: Producers

Web tier&

Service tier

41 @agoncal

How Do I ?

42 @agoncal

How Do I ?

43 @agoncal

Use Expression Language...

44 @agoncal

Use Expression Language and Scopes !

45 @agoncal

Service Tier

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

public void update() { em.persist(book); }}

46 @agoncal

Service Tier + Web Tier

@Named

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

public void update() { em.persist(book); }}

<h:commandLink value="Create" action='#{bookBean.update}'/>

47 @agoncal

Service Tier + Web Tier

@Named("service")

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

public void update() { em.persist(book); }}

<h:commandLink value="Create" action='#{service.update}'/>

48 @agoncal

Several scopes

● @Dependent (default)● @ApplicationScoped, @SessionScoped, @RequestScoped

● @ConversationScoped

● Create your own● @TransactionalScoped

● @ViewScoped

● @ThreadScoped

● @ClusterScoped

49 @agoncal

Just choose the right scope

@Named@RequestScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

50 @agoncal

Just choose the right scope

@Named@SessionScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

51 @agoncal

Just choose the right scope

@Named@ConversationScoped@Transactionalpublic class BookBean implements Serializable {

@Inject private Conversation conversation;

public void update() { conversation.begin(); }

public void delete() { conversation.end(); }}

Demo-

@Named & scope

53 @agoncal

Demo: @Named & Scope

</>

Alternatives

56 @agoncal

How Do I ?

public class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

57 @agoncal

How Do I ?

@Mockpublic class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

public class BookBean implements Serializable {

@Inject @Mock private NumberGenerator numberGenerator; // ...}

58 @agoncal

How Do I ?

@Mockpublic class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

public class BookBean implements Serializable {

@Inject @Mock private NumberGenerator numberGenerator; // ...}

59 @agoncal

Use an Alternative !

@Alternative@EightDigitspublic class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

public class BookBean implements Serializable {

@Inject @EightDigits private NumberGenerator numberGenerator; // ...}

60 @agoncal

Activate the Alternative

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" ... version="1.1" bean-discovery-mode="all">

<alternatives> <class>com.foo.MockGenerator</class> </alternatives></beans>

Demo-

Alternatives

62 @agoncal

Demo: Alternatives

Events

64 @agoncal

How Do I ?

65 @agoncal

How Do I ?

Still too coupled

66 @agoncal

Use Events !

67 @agoncal

Fire and Observe

public class BookBean implements Serializable {

@Inject private Event<Book> boughtEvent;

public void update() { boughtEvent.fire(book); }}

public class InventoryService {

private void observeBooks (@Observes Book book) { logger.info("Book recevied " + book.getTitle()); }}

68 @agoncal

Fire and Observe with Qualifier

public class BookBean implements Serializable {

@Inject @Paper private Event<Book> boughtEvent;

public void update() { boughtEvent.fire(book); }}

public class InventoryService {

private void observeBooks (@Observes @Paper Book book) { logger.info("Book recevied " + book.getTitle()); }}

Demo-

Events

70 @agoncal

Demo: Events

CDI : So Much More

72 @agoncal

CDI : So Much More

73 @agoncal

CDI Extension ecosystem

74 @agoncal

CDI Course on PluralSight

http://www.pluralsight.com/courses/context-dependency-injection-1-1

Thanks

www.antoniogoncalves.organtonio.goncalves@gmail.com

@agoncal@devoxxfr

@lescastcodeurs

Q & A

77 @agoncal

Creative Commons

● Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).

● Noncommercial — You may not use this work for commercial purposes.

● Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.

CDI : How do I ?

by antonio goncalves@agoncal

2 @agoncal

Antonio Goncalves

What is CDI ?

4 @agoncal

What is CDI ?

● Dependency injection● Lose coupling, strong typing● Context management● Interceptors and decorators● Event bus● Extensions

5 @agoncal

History of CDI

6 @agoncal

Implementations

Demo-

Creating a Web App

8 @agoncal

Demos with JBoss Forge

● Java EE scaffolding tool● Shell commands● CRUD application● Gets you start quickly● Takes care of integration● Plugin based

9 @agoncal

Demo: Creating a Web App

Dependency Injection

11 @agoncal

How Do I ?

12 @agoncal

Use @Inject !

13 @agoncal

@Inject on Attributes

public class BookBean implements Serializable {

@Inject private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

14 @agoncal

@Inject on Constructor

public class BookBean implements Serializable {

private NumberGenerator numberGenerator; private ItemService itemService;

@Inject public BookBean(NumberGenerator numberGenerator, ItemService srv){ this.numberGenerator = numberGenerator; this.itemService = srv; }

// ...}

15 @agoncal

@Inject on Setters

public class BookBean implements Serializable {

private NumberGenerator numberGenerator; private ItemService itemService;

@Inject public void setNumberGenerator(NumberGenerator numGen){ this.numberGenerator = numGen; }

@Inject public void setItemService(ItemService itemService) { this.itemService = itemService; } // ...}

16 @agoncal

Activate CDI

● In CDI 1.0 beans.xml in archive● Since CDI 1.1 it's activated by default

● All classes having a bean definition annotation● beans.xml to deactivate or activate all

● Archive vs Bean archive

Demo-

@Inject

18 @agoncal

Demo: @Inject One Implementation

Qualifiers

20 @agoncal

How Do I ?

21 @agoncal

How Do I ?

22 @agoncal

How Do I ?

@Default

23 @agoncal

Use Qualifiers !

@ThirteenDigits

24 @agoncal

Use Qualifiers !

@EightDigits

25 @agoncal

A Qualifier

@Qualifier@Retention(RUNTIME)@Target({ METHOD, FIELD, PARAMETER, TYPE })@Documentedpublic @interface ThirteenDigits {}

26 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

27 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject @Default private ItemService itemService;

// ...}

28 @agoncal

Qualifying a Bean

@ThirteenDigitspublic class IsbnGenerator implements NumberGenerator {

@Override public String generateNumber() { return "13-" + Math.abs(new Random().nextInt()); }}

Demo-

Qualifiers

30 @agoncal

Demo: @Inject One Implementation

Producers

32 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

33 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

34 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Several persistence units@PersistenceContext(unitName = "myPU1")@PersistenceContext(unitName = "myPU2")

35 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Third party framewok

36 @agoncal

Use Producers !

public class BookBean implements Serializable {

@Inject private EntityManager em;

// ...}

public class ResourceProducer {

@Produces @PersistenceContext(unitName = "myPU") private EntityManager entityManager;

}

37 @agoncal

Use Producers !

public class BookBean implements Serializable {

@Inject private Logger logger;

// ...}

public class ResourceProducer {

@Produces private Logger produceLogger(InjectionPoint ip) { return Logger.getLogger(ip.getMember().getDeclaringClass().getName());

}}

Demo-

Producers

39 @agoncal

Demo: Producers

Web tier&

Service tier

41 @agoncal

How Do I ?

42 @agoncal

How Do I ?

43 @agoncal

Use Expression Language...

44 @agoncal

Use Expression Language and Scopes !

45 @agoncal

Service Tier

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

public void update() { em.persist(book); }}

46 @agoncal

Service Tier + Web Tier

@Named

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

public void update() { em.persist(book); }}

<h:commandLink value="Create" action='#{bookBean.update}'/>

47 @agoncal

Service Tier + Web Tier

@Named("service")

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

public void update() { em.persist(book); }}

<h:commandLink value="Create" action='#{service.update}'/>

48 @agoncal

Several scopes

● @Dependent (default)● @ApplicationScoped, @SessionScoped, @RequestScoped

● @ConversationScoped

● Create your own● @TransactionalScoped

● @ViewScoped

● @ThreadScoped

● @ClusterScoped

49 @agoncal

Just choose the right scope

@Named@RequestScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

50 @agoncal

Just choose the right scope

@Named@SessionScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

51 @agoncal

Just choose the right scope

@Named@ConversationScoped@Transactionalpublic class BookBean implements Serializable {

@Inject private Conversation conversation;

public void update() { conversation.begin(); }

public void delete() { conversation.end(); }}

Demo-

@Named & scope

53 @agoncal

Demo: @Named & Scope

</>

Alternatives

56 @agoncal

How Do I ?

public class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

57 @agoncal

How Do I ?

@Mockpublic class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

public class BookBean implements Serializable {

@Inject @Mock private NumberGenerator numberGenerator; // ...}

58 @agoncal

How Do I ?

@Mockpublic class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

public class BookBean implements Serializable {

@Inject @Mock private NumberGenerator numberGenerator; // ...}

59 @agoncal

Use an Alternative !

@Alternative@EightDigitspublic class MockGenerator implements NumberGenerator {

public String generateNumber() { return "mock-" + Math.abs(new Random().nextInt()); }}

public class BookBean implements Serializable {

@Inject @EightDigits private NumberGenerator numberGenerator; // ...}

60 @agoncal

Activate the Alternative

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" ... version="1.1" bean-discovery-mode="all">

<alternatives> <class>com.foo.MockGenerator</class> </alternatives></beans>

Demo-

Alternatives

62 @agoncal

Demo: Alternatives

Events

64 @agoncal

How Do I ?

65 @agoncal

How Do I ?

Still too coupled

66 @agoncal

Use Events !

67 @agoncal

Fire and Observe

public class BookBean implements Serializable {

@Inject private Event<Book> boughtEvent;

public void update() { boughtEvent.fire(book); }}

public class InventoryService {

private void observeBooks (@Observes Book book) { logger.info("Book recevied " + book.getTitle()); }}

68 @agoncal

Fire and Observe with Qualifier

public class BookBean implements Serializable {

@Inject @Paper private Event<Book> boughtEvent;

public void update() { boughtEvent.fire(book); }}

public class InventoryService {

private void observeBooks (@Observes @Paper Book book) { logger.info("Book recevied " + book.getTitle()); }}

Demo-

Events

70 @agoncal

Demo: Events

CDI : So Much More

72 @agoncal

CDI : So Much More

73 @agoncal

CDI Extension ecosystem

74 @agoncal

CDI Course on PluralSight

http://www.pluralsight.com/courses/context-dependency-injection-1-1

Thanks

www.antoniogoncalves.organtonio.goncalves@gmail.com

@agoncal@devoxxfr

@lescastcodeurs

Q & A

77 @agoncal

Creative Commons

● Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).

● Noncommercial — You may not use this work for commercial purposes.

● Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.