154
CDI : How do I ? by antonio goncalves @agoncal

CDI: How do I ?

Embed Size (px)

Citation preview

Page 1: CDI: How do I ?

CDI : How do I ?

by antonio goncalves@agoncal

Page 2: CDI: How do I ?

2 @agoncal

Antonio Goncalves

Page 3: CDI: How do I ?

What is CDI ?

Page 4: CDI: How do I ?

4 @agoncal

What is CDI ?

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

Page 5: CDI: How do I ?

5 @agoncal

History of CDI

Page 6: CDI: How do I ?

6 @agoncal

Implementations

Page 7: CDI: How do I ?

Demo-

Creating a Web App

Page 8: CDI: How do I ?

8 @agoncal

Demos with JBoss Forge

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

Page 9: CDI: How do I ?

9 @agoncal

Demo: Creating a Web App

Page 10: CDI: How do I ?

Dependency Injection

Page 11: CDI: How do I ?

11 @agoncal

How Do I ?

Page 12: CDI: How do I ?

12 @agoncal

Use @Inject !

Page 13: CDI: How do I ?

13 @agoncal

@Inject on Attributes

public class BookBean implements Serializable {

@Inject private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

Page 14: CDI: How do I ?

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; }

// ...}

Page 15: CDI: How do I ?

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; } // ...}

Page 16: CDI: How do I ?

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

Page 17: CDI: How do I ?

Demo-

@Inject

Page 18: CDI: How do I ?

18 @agoncal

Demo: @Inject One Implementation

Page 19: CDI: How do I ?

Qualifiers

Page 20: CDI: How do I ?

20 @agoncal

How Do I ?

Page 21: CDI: How do I ?

21 @agoncal

How Do I ?

Page 22: CDI: How do I ?

22 @agoncal

How Do I ?

@Default

Page 23: CDI: How do I ?

23 @agoncal

Use Qualifiers !

@ThirteenDigits

Page 24: CDI: How do I ?

24 @agoncal

Use Qualifiers !

@EightDigits

Page 25: CDI: How do I ?

25 @agoncal

A Qualifier

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

Page 26: CDI: How do I ?

26 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

Page 27: CDI: How do I ?

27 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject @Default private ItemService itemService;

// ...}

Page 28: CDI: How do I ?

28 @agoncal

Qualifying a Bean

@ThirteenDigitspublic class IsbnGenerator implements NumberGenerator {

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

Page 29: CDI: How do I ?

Demo-

Qualifiers

Page 30: CDI: How do I ?

30 @agoncal

Demo: @Inject One Implementation

Page 31: CDI: How do I ?

Producers

Page 32: CDI: How do I ?

32 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Page 33: CDI: How do I ?

33 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Page 34: CDI: How do I ?

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")

Page 35: CDI: How do I ?

35 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Third party framewok

Page 36: CDI: How do I ?

36 @agoncal

Use Producers !

public class BookBean implements Serializable {

@Inject private EntityManager em;

// ...}

public class ResourceProducer {

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

}

Page 37: CDI: How do I ?

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());

}}

Page 38: CDI: How do I ?

Demo-

Producers

Page 39: CDI: How do I ?

39 @agoncal

Demo: Producers

Page 40: CDI: How do I ?

Web tier&

Service tier

Page 41: CDI: How do I ?

41 @agoncal

How Do I ?

Page 42: CDI: How do I ?

42 @agoncal

How Do I ?

Page 43: CDI: How do I ?

43 @agoncal

Use Expression Language...

Page 44: CDI: How do I ?

44 @agoncal

Use Expression Language and Scopes !

Page 45: CDI: How do I ?

45 @agoncal

Service Tier

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

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

Page 46: CDI: How do I ?

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}'/>

Page 47: CDI: How do I ?

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}'/>

Page 48: CDI: How do I ?

48 @agoncal

Several scopes

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

● @ConversationScoped

● Create your own● @TransactionalScoped

● @ViewScoped

● @ThreadScoped

● @ClusterScoped

Page 49: CDI: How do I ?

49 @agoncal

Just choose the right scope

@Named@RequestScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

Page 50: CDI: How do I ?

50 @agoncal

Just choose the right scope

@Named@SessionScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

Page 51: CDI: How do I ?

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(); }}

Page 52: CDI: How do I ?

Demo-

@Named & scope

Page 53: CDI: How do I ?

53 @agoncal

Demo: @Named & Scope

Page 54: CDI: How do I ?

</>

Page 55: CDI: How do I ?

Alternatives

Page 56: CDI: How do I ?

56 @agoncal

How Do I ?

public class MockGenerator implements NumberGenerator {

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

Page 57: CDI: How do I ?

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; // ...}

Page 58: CDI: How do I ?

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; // ...}

Page 59: CDI: How do I ?

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; // ...}

Page 60: CDI: How do I ?

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>

Page 61: CDI: How do I ?

Demo-

Alternatives

Page 62: CDI: How do I ?

62 @agoncal

Demo: Alternatives

Page 63: CDI: How do I ?

Events

Page 64: CDI: How do I ?

64 @agoncal

How Do I ?

Page 65: CDI: How do I ?

65 @agoncal

How Do I ?

Still too coupled

Page 66: CDI: How do I ?

66 @agoncal

Use Events !

Page 67: CDI: How do I ?

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()); }}

Page 68: CDI: How do I ?

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()); }}

Page 69: CDI: How do I ?

Demo-

Events

Page 70: CDI: How do I ?

70 @agoncal

Demo: Events

Page 71: CDI: How do I ?

CDI : So Much More

Page 72: CDI: How do I ?

72 @agoncal

CDI : So Much More

Page 73: CDI: How do I ?

73 @agoncal

CDI Extension ecosystem

Page 74: CDI: How do I ?

74 @agoncal

CDI Course on PluralSight

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

Page 75: CDI: How do I ?

Thanks

[email protected]

@agoncal@devoxxfr

@lescastcodeurs

Page 76: CDI: How do I ?

Q & A

Page 77: CDI: How do I ?

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.

Page 78: CDI: How do I ?

CDI : How do I ?

by antonio goncalves@agoncal

Page 79: CDI: How do I ?

2 @agoncal

Antonio Goncalves

Page 80: CDI: How do I ?

What is CDI ?

Page 81: CDI: How do I ?

4 @agoncal

What is CDI ?

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

Page 82: CDI: How do I ?

5 @agoncal

History of CDI

Page 83: CDI: How do I ?

6 @agoncal

Implementations

Page 84: CDI: How do I ?

Demo-

Creating a Web App

Page 85: CDI: How do I ?

8 @agoncal

Demos with JBoss Forge

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

Page 86: CDI: How do I ?

9 @agoncal

Demo: Creating a Web App

Page 87: CDI: How do I ?

Dependency Injection

Page 88: CDI: How do I ?

11 @agoncal

How Do I ?

Page 89: CDI: How do I ?

12 @agoncal

Use @Inject !

Page 90: CDI: How do I ?

13 @agoncal

@Inject on Attributes

public class BookBean implements Serializable {

@Inject private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

Page 91: CDI: How do I ?

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; }

// ...}

Page 92: CDI: How do I ?

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; } // ...}

Page 93: CDI: How do I ?

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

Page 94: CDI: How do I ?

Demo-

@Inject

Page 95: CDI: How do I ?

18 @agoncal

Demo: @Inject One Implementation

Page 96: CDI: How do I ?

Qualifiers

Page 97: CDI: How do I ?

20 @agoncal

How Do I ?

Page 98: CDI: How do I ?

21 @agoncal

How Do I ?

Page 99: CDI: How do I ?

22 @agoncal

How Do I ?

@Default

Page 100: CDI: How do I ?

23 @agoncal

Use Qualifiers !

@ThirteenDigits

Page 101: CDI: How do I ?

24 @agoncal

Use Qualifiers !

@EightDigits

Page 102: CDI: How do I ?

25 @agoncal

A Qualifier

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

Page 103: CDI: How do I ?

26 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject private ItemService itemService;

// ...}

Page 104: CDI: How do I ?

27 @agoncal

Qualifying an Injection Point

public class BookBean implements Serializable {

@Inject @ThirteenDigits private NumberGenerator numberGenerator;

@Inject @Default private ItemService itemService;

// ...}

Page 105: CDI: How do I ?

28 @agoncal

Qualifying a Bean

@ThirteenDigitspublic class IsbnGenerator implements NumberGenerator {

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

Page 106: CDI: How do I ?

Demo-

Qualifiers

Page 107: CDI: How do I ?

30 @agoncal

Demo: @Inject One Implementation

Page 108: CDI: How do I ?

Producers

Page 109: CDI: How do I ?

32 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Page 110: CDI: How do I ?

33 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Page 111: CDI: How do I ?

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")

Page 112: CDI: How do I ?

35 @agoncal

How Do I ?

public class BookBean implements Serializable {

@Inject private EntityManager em;

@Inject private Logger logger;

// ...}

Third party framewok

Page 113: CDI: How do I ?

36 @agoncal

Use Producers !

public class BookBean implements Serializable {

@Inject private EntityManager em;

// ...}

public class ResourceProducer {

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

}

Page 114: CDI: How do I ?

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());

}}

Page 115: CDI: How do I ?

Demo-

Producers

Page 116: CDI: How do I ?

39 @agoncal

Demo: Producers

Page 117: CDI: How do I ?

Web tier&

Service tier

Page 118: CDI: How do I ?

41 @agoncal

How Do I ?

Page 119: CDI: How do I ?

42 @agoncal

How Do I ?

Page 120: CDI: How do I ?

43 @agoncal

Use Expression Language...

Page 121: CDI: How do I ?

44 @agoncal

Use Expression Language and Scopes !

Page 122: CDI: How do I ?

45 @agoncal

Service Tier

@Transactionalpublic class BookBean implements Serializable {

@Inject private EntityManager em;

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

Page 123: CDI: How do I ?

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}'/>

Page 124: CDI: How do I ?

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}'/>

Page 125: CDI: How do I ?

48 @agoncal

Several scopes

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

● @ConversationScoped

● Create your own● @TransactionalScoped

● @ViewScoped

● @ThreadScoped

● @ClusterScoped

Page 126: CDI: How do I ?

49 @agoncal

Just choose the right scope

@Named@RequestScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

Page 127: CDI: How do I ?

50 @agoncal

Just choose the right scope

@Named@SessionScoped@Transactionalpublic class BookBean implements Serializable {

public void update() {

}

public void delete() {

}}

Page 128: CDI: How do I ?

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(); }}

Page 129: CDI: How do I ?

Demo-

@Named & scope

Page 130: CDI: How do I ?

53 @agoncal

Demo: @Named & Scope

Page 131: CDI: How do I ?

</>

Page 132: CDI: How do I ?

Alternatives

Page 133: CDI: How do I ?

56 @agoncal

How Do I ?

public class MockGenerator implements NumberGenerator {

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

Page 134: CDI: How do I ?

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; // ...}

Page 135: CDI: How do I ?

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; // ...}

Page 136: CDI: How do I ?

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; // ...}

Page 137: CDI: How do I ?

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>

Page 138: CDI: How do I ?

Demo-

Alternatives

Page 139: CDI: How do I ?

62 @agoncal

Demo: Alternatives

Page 140: CDI: How do I ?

Events

Page 141: CDI: How do I ?

64 @agoncal

How Do I ?

Page 142: CDI: How do I ?

65 @agoncal

How Do I ?

Still too coupled

Page 143: CDI: How do I ?

66 @agoncal

Use Events !

Page 144: CDI: How do I ?

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()); }}

Page 145: CDI: How do I ?

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()); }}

Page 146: CDI: How do I ?

Demo-

Events

Page 147: CDI: How do I ?

70 @agoncal

Demo: Events

Page 148: CDI: How do I ?

CDI : So Much More

Page 149: CDI: How do I ?

72 @agoncal

CDI : So Much More

Page 150: CDI: How do I ?

73 @agoncal

CDI Extension ecosystem

Page 151: CDI: How do I ?

74 @agoncal

CDI Course on PluralSight

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

Page 152: CDI: How do I ?

Thanks

[email protected]

@agoncal@devoxxfr

@lescastcodeurs

Page 153: CDI: How do I ?

Q & A

Page 154: CDI: How do I ?

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.