CDI: How do I ?
-
Upload
antonio-goncalves -
Category
Software
-
view
950 -
download
3
Transcript of CDI: How do I ?
![Page 1: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/1.jpg)
CDI : How do I ?
by antonio goncalves@agoncal
![Page 2: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/2.jpg)
2 @agoncal
Antonio Goncalves
![Page 3: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/3.jpg)
What is CDI ?
![Page 4: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/4.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/5.jpg)
5 @agoncal
History of CDI
![Page 6: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/6.jpg)
6 @agoncal
Implementations
![Page 7: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/7.jpg)
Demo-
Creating a Web App
![Page 8: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/8.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/9.jpg)
9 @agoncal
Demo: Creating a Web App
![Page 10: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/10.jpg)
Dependency Injection
![Page 11: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/11.jpg)
11 @agoncal
How Do I ?
![Page 12: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/12.jpg)
12 @agoncal
Use @Inject !
![Page 13: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/13.jpg)
13 @agoncal
@Inject on Attributes
public class BookBean implements Serializable {
@Inject private NumberGenerator numberGenerator;
@Inject private ItemService itemService;
// ...}
![Page 14: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/14.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/15.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/16.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/17.jpg)
Demo-
@Inject
![Page 18: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/18.jpg)
18 @agoncal
Demo: @Inject One Implementation
![Page 19: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/19.jpg)
Qualifiers
![Page 20: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/20.jpg)
20 @agoncal
How Do I ?
![Page 21: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/21.jpg)
21 @agoncal
How Do I ?
![Page 22: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/22.jpg)
22 @agoncal
How Do I ?
@Default
![Page 23: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/23.jpg)
23 @agoncal
Use Qualifiers !
@ThirteenDigits
![Page 24: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/24.jpg)
24 @agoncal
Use Qualifiers !
@EightDigits
![Page 25: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/25.jpg)
25 @agoncal
A Qualifier
@Qualifier@Retention(RUNTIME)@Target({ METHOD, FIELD, PARAMETER, TYPE })@Documentedpublic @interface ThirteenDigits {}
![Page 26: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/26.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/27.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/28.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/29.jpg)
Demo-
Qualifiers
![Page 30: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/30.jpg)
30 @agoncal
Demo: @Inject One Implementation
![Page 31: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/31.jpg)
Producers
![Page 32: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/32.jpg)
32 @agoncal
How Do I ?
public class BookBean implements Serializable {
@Inject private EntityManager em;
@Inject private Logger logger;
// ...}
![Page 33: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/33.jpg)
33 @agoncal
How Do I ?
public class BookBean implements Serializable {
@Inject private EntityManager em;
@Inject private Logger logger;
// ...}
![Page 34: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/34.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/35.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/36.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/37.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/38.jpg)
Demo-
Producers
![Page 39: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/39.jpg)
39 @agoncal
Demo: Producers
![Page 40: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/40.jpg)
Web tier&
Service tier
![Page 41: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/41.jpg)
41 @agoncal
How Do I ?
![Page 42: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/42.jpg)
42 @agoncal
How Do I ?
![Page 43: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/43.jpg)
43 @agoncal
Use Expression Language...
![Page 44: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/44.jpg)
44 @agoncal
Use Expression Language and Scopes !
![Page 45: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/45.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/46.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/47.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/48.jpg)
48 @agoncal
Several scopes
● @Dependent (default)● @ApplicationScoped, @SessionScoped, @RequestScoped
● @ConversationScoped
● Create your own● @TransactionalScoped
● @ViewScoped
● @ThreadScoped
● @ClusterScoped
![Page 49: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/49.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/50.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/51.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/52.jpg)
Demo-
@Named & scope
![Page 53: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/53.jpg)
53 @agoncal
Demo: @Named & Scope
![Page 54: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/54.jpg)
</>
![Page 55: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/55.jpg)
Alternatives
![Page 56: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/56.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/57.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/58.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/59.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/60.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/61.jpg)
Demo-
Alternatives
![Page 62: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/62.jpg)
62 @agoncal
Demo: Alternatives
![Page 63: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/63.jpg)
Events
![Page 64: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/64.jpg)
64 @agoncal
How Do I ?
![Page 65: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/65.jpg)
65 @agoncal
How Do I ?
Still too coupled
![Page 66: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/66.jpg)
66 @agoncal
Use Events !
![Page 67: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/67.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/68.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/69.jpg)
Demo-
Events
![Page 70: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/70.jpg)
70 @agoncal
Demo: Events
![Page 71: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/71.jpg)
CDI : So Much More
![Page 72: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/72.jpg)
72 @agoncal
CDI : So Much More
![Page 73: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/73.jpg)
73 @agoncal
CDI Extension ecosystem
![Page 74: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/74.jpg)
74 @agoncal
CDI Course on PluralSight
http://www.pluralsight.com/courses/context-dependency-injection-1-1
![Page 76: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/76.jpg)
Q & A
![Page 77: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/77.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/78.jpg)
CDI : How do I ?
by antonio goncalves@agoncal
![Page 79: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/79.jpg)
2 @agoncal
Antonio Goncalves
![Page 80: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/80.jpg)
What is CDI ?
![Page 81: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/81.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/82.jpg)
5 @agoncal
History of CDI
![Page 83: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/83.jpg)
6 @agoncal
Implementations
![Page 84: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/84.jpg)
Demo-
Creating a Web App
![Page 85: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/85.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/86.jpg)
9 @agoncal
Demo: Creating a Web App
![Page 87: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/87.jpg)
Dependency Injection
![Page 88: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/88.jpg)
11 @agoncal
How Do I ?
![Page 89: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/89.jpg)
12 @agoncal
Use @Inject !
![Page 90: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/90.jpg)
13 @agoncal
@Inject on Attributes
public class BookBean implements Serializable {
@Inject private NumberGenerator numberGenerator;
@Inject private ItemService itemService;
// ...}
![Page 91: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/91.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/92.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/93.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/94.jpg)
Demo-
@Inject
![Page 95: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/95.jpg)
18 @agoncal
Demo: @Inject One Implementation
![Page 96: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/96.jpg)
Qualifiers
![Page 97: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/97.jpg)
20 @agoncal
How Do I ?
![Page 98: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/98.jpg)
21 @agoncal
How Do I ?
![Page 99: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/99.jpg)
22 @agoncal
How Do I ?
@Default
![Page 100: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/100.jpg)
23 @agoncal
Use Qualifiers !
@ThirteenDigits
![Page 101: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/101.jpg)
24 @agoncal
Use Qualifiers !
@EightDigits
![Page 102: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/102.jpg)
25 @agoncal
A Qualifier
@Qualifier@Retention(RUNTIME)@Target({ METHOD, FIELD, PARAMETER, TYPE })@Documentedpublic @interface ThirteenDigits {}
![Page 103: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/103.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/104.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/105.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/106.jpg)
Demo-
Qualifiers
![Page 107: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/107.jpg)
30 @agoncal
Demo: @Inject One Implementation
![Page 108: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/108.jpg)
Producers
![Page 109: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/109.jpg)
32 @agoncal
How Do I ?
public class BookBean implements Serializable {
@Inject private EntityManager em;
@Inject private Logger logger;
// ...}
![Page 110: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/110.jpg)
33 @agoncal
How Do I ?
public class BookBean implements Serializable {
@Inject private EntityManager em;
@Inject private Logger logger;
// ...}
![Page 111: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/111.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/112.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/113.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/114.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/115.jpg)
Demo-
Producers
![Page 116: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/116.jpg)
39 @agoncal
Demo: Producers
![Page 117: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/117.jpg)
Web tier&
Service tier
![Page 118: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/118.jpg)
41 @agoncal
How Do I ?
![Page 119: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/119.jpg)
42 @agoncal
How Do I ?
![Page 120: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/120.jpg)
43 @agoncal
Use Expression Language...
![Page 121: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/121.jpg)
44 @agoncal
Use Expression Language and Scopes !
![Page 122: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/122.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/123.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/124.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/125.jpg)
48 @agoncal
Several scopes
● @Dependent (default)● @ApplicationScoped, @SessionScoped, @RequestScoped
● @ConversationScoped
● Create your own● @TransactionalScoped
● @ViewScoped
● @ThreadScoped
● @ClusterScoped
![Page 126: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/126.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/127.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/128.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/129.jpg)
Demo-
@Named & scope
![Page 130: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/130.jpg)
53 @agoncal
Demo: @Named & Scope
![Page 131: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/131.jpg)
</>
![Page 132: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/132.jpg)
Alternatives
![Page 133: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/133.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/134.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/135.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/136.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/137.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/138.jpg)
Demo-
Alternatives
![Page 139: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/139.jpg)
62 @agoncal
Demo: Alternatives
![Page 140: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/140.jpg)
Events
![Page 141: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/141.jpg)
64 @agoncal
How Do I ?
![Page 142: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/142.jpg)
65 @agoncal
How Do I ?
Still too coupled
![Page 143: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/143.jpg)
66 @agoncal
Use Events !
![Page 144: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/144.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/145.jpg)
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 ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/146.jpg)
Demo-
Events
![Page 147: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/147.jpg)
70 @agoncal
Demo: Events
![Page 148: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/148.jpg)
CDI : So Much More
![Page 149: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/149.jpg)
72 @agoncal
CDI : So Much More
![Page 150: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/150.jpg)
73 @agoncal
CDI Extension ecosystem
![Page 151: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/151.jpg)
74 @agoncal
CDI Course on PluralSight
http://www.pluralsight.com/courses/context-dependency-injection-1-1
![Page 153: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/153.jpg)
Q & A
![Page 154: CDI: How do I ?](https://reader030.fdocuments.in/reader030/viewer/2022020116/55a5d7e31a28abf4548b4671/html5/thumbnails/154.jpg)
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.