Skip to content

Commit 0adc4fa

Browse files
committed
Add CDI workshop section
1 parent b0b64f3 commit 0adc4fa

File tree

1 file changed

+159
-0
lines changed

1 file changed

+159
-0
lines changed

tp/injection.adoc

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
= Travaux pratiques - Context and Dependency Injection
2+
Nicolas Frankel
3+
:doctype: article
4+
:encoding: utf-8
5+
:lang: fr
6+
:toc:
7+
:toc-title: Table des matières
8+
:toc-placement!:
9+
:sectanchors:
10+
:numbered:
11+
:experimental:
12+
:icons: font
13+
:imagesdir: ./images/injection
14+
:toc:
15+
16+
include::../license.adoc[]
17+
18+
toc::[]
19+
20+
== Références
21+
22+
En français : ::
23+
* <<../cours/injection.adoc#,Slides>>
24+
* http://rmannibucau.developpez.com/tutoriels/cdi/introduction-cdi/[Tutoriel sur une introduction à CDI]
25+
+
26+
En anglais : ::
27+
* https://docs.oracle.com/javaee/7/tutorial/cdi-basic.htm[Introduction to Contexts and Dependency Injection for Java EE^]
28+
* http://cdi-spec.org/[CDI specifications^]
29+
* https://openwebbeans.apache.org/documentation.html[OpenWebBeans (CDI implementation used by TomEE)^]
30+
31+
== Premiers pas avec l'injection
32+
33+
=== Injection dans un servlet
34+
35+
. Créer un servlet
36+
. Dans celui-ci, injecter :
37+
+
38+
* Une source de données `DataSource`
39+
* Un gestionnaire d'entités `EntityManager`
40+
* Un objet d'un type quelconque _e.g._ `Person`
41+
+
42+
. S'assurer que les objets ne sont pas `null` à l'exécution.
43+
44+
=== Injection dans un EJB
45+
46+
. Créer un EJB
47+
. Dans celui-ci, injecter :
48+
+
49+
* Une source de données `DataSource`
50+
* Un gestionnaire d'entités `EntityManager`
51+
* Un objet d'un type quelconque _e.g._ `Person`
52+
+
53+
. S'assurer que les objets ne sont pas `null` à l'exécution.
54+
55+
=== Injection dans un objet quelconque
56+
57+
. Créer un type quelconque _e.g._ `Person`
58+
. Dans celui-ci, injecter :
59+
+
60+
* Une source de données `DataSource`
61+
* Un gestionnaire d'entités `EntityManager`
62+
* Un objet d'un autre type quelconque _e.g._ `Adress`
63+
+
64+
. S'assurer que les objets ne sont pas `null` à l'exécution.
65+
66+
[TIP]
67+
.Rappel
68+
====
69+
Seuls les objets dont le cycle de vie est géré par le serveur d'applications sont la cible potentielle de l'injection.
70+
====
71+
72+
== Travail sur les _scopes_
73+
74+
=== Singleton applicatif
75+
76+
* Dans l'exemple précédent, combien d'instances de `Person` sont créées ?
77+
* Comment faire pour qu'une unique instance soit créée (et qu'elle soit chacune injectée dans le servlet et l'EJB) ?
78+
79+
=== _Scope_ de requête
80+
81+
. Créer un bean qui a pour _scope_ la requête
82+
. Vérifier qu'un nouvel objet est créé à chaque requête
83+
. Vérifier que le même objet est injecté tout au long de la chaîne de requête
84+
85+
=== Gestion de la session
86+
87+
Soit le code suivant :
88+
89+
[source,java]
90+
----
91+
@WebServlet("/preferences")
92+
public class PreferencesServlet extends HttpServlet {
93+
94+
private static final String PREFS_KEY = "ch.frankel.preferences";
95+
96+
@Override
97+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
98+
Enumeration<String> parameterNames = req.getParameterNames();
99+
HttpSession session = req.getSession();
100+
Object o = session.getAttribute(PREFS_KEY);
101+
Map<String, String> preferences;
102+
if (o == null) {
103+
preferences = new HashMap<>();
104+
} else {
105+
preferences = (Map) o;
106+
}
107+
while (parameterNames.hasMoreElements()) {
108+
String parameterName = parameterNames.nextElement();
109+
if (parameterName.startsWith("preferences")) {
110+
String value = req.getParameter(parameterName);
111+
preferences.put(parameterName, value);
112+
}
113+
}
114+
session.setAttribute(PREFS_KEY, preferences);
115+
resp.sendRedirect("/preferences");
116+
}
117+
118+
@Override
119+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
120+
HttpSession session = req.getSession();
121+
Object o = session.getAttribute(PREFS_KEY);
122+
if (o == null) {
123+
o = new HashMap<String, String>();
124+
}
125+
req.setAttribute(PREFS_KEY, o);
126+
req.getRequestDispatcher("/WEB-INF/preferences.jsp").forward(req, resp);
127+
}
128+
}
129+
----
130+
131+
. Analyser le code précédent
132+
. Ré-écrire celui-ci en utilisant un _bean_ injecté lié à la session
133+
134+
== Aller plus loin
135+
136+
TIP: Il est plus aisé de vérifier l'injection dans un servlet
137+
138+
=== _Producer_ simple
139+
140+
* Dans un objet quelconque, injecter le temps système
141+
+
142+
NOTE: Utiliser la méthode `System.currentTimeMillis()`
143+
+
144+
* Vérifier
145+
146+
=== _Producer_ complexe
147+
148+
* Dans un object quelconque, injecter un objet de type `Random`
149+
** Si la propriété système `secure` vaut `true`, le type concret de l'objet doit être `SecureRandom`
150+
+
151+
NOTE: Utiliser la méthode `System.getProperty()`
152+
+
153+
** Sinon, le type concret doit être simplement `Random`
154+
* Vérifier
155+
156+
=== Désambiguïsation
157+
158+
* Dans un object quelconque, injecter d'une part le jour de la semaine (p.e. `"LUNDI"`), d'autre part, le mois (p.e. `"JANVIER"`).
159+
* Vérifier

0 commit comments

Comments
 (0)