Skip to content

Commit 03ff92b

Browse files
committed
Add DOC folder
1 parent 1e981bc commit 03ff92b

8 files changed

+279
-0
lines changed
80.6 KB
Loading

Spring_part_3/DOC/BeanLifeCycle.jpg

84.8 KB
Loading

Spring_part_3/DOC/ComponentScans.jpg

37.9 KB
Loading
Loading
20.6 KB
Loading

Spring_part_3/DOC/JSR330.txt

Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,279 @@
1+
****** Использование стандартных аннотаций JSR 330 ******
2+
3+
Начиная со Spring 3.0, Spring предлагает поддержку аннотаций из JSR-330 (Внедрение зависимостей).
4+
Эти аннотации сканируются так же, как и аннотации Spring. Чтобы использовать их, нам необходимо
5+
иметь соответствующие jar-файлы в пути классов (или в файлах настройках Gradle или Maven).
6+
7+
*** Внедрение зависимостей с помощью @Inject и @Named ***
8+
9+
Вместо @Autowired мы можем использовать @javax.inject.Inject следующим образом:
10+
11+
Java:
12+
13+
*************************************************************************************************
14+
import javax.inject.Inject;
15+
public class SimpleMovieLister {
16+
private MovieFinder movieFinder;
17+
@Inject
18+
public void setMovieFinder(MovieFinder movieFinder) {
19+
this.movieFinder = movieFinder;
20+
}
21+
public void listMovies() {
22+
this.movieFinder.findMovies(...);
23+
// ...
24+
}
25+
}
26+
*************************************************************************************************
27+
28+
Kotlin:
29+
30+
*************************************************************************************************
31+
import javax.inject.Inject
32+
class SimpleMovieLister {
33+
@Inject
34+
lateinit var movieFinder: MovieFinder
35+
fun listMovies() {
36+
movieFinder.findMovies(...)
37+
// ...
38+
}
39+
}
40+
*************************************************************************************************1
41+
42+
Как и в случае с @Autowired, мы можем использовать @Inject на уровне поля, метода и аргумента
43+
конструктора. Более того, вы можете объявить свою точку внедрения как Provider, что позволит
44+
получить доступ по требованию к bean-ам с более узкой областью видимости или отложенный доступ
45+
к другим bean-ам через вызов Provider.get().
46+
47+
В следующем примере предложен вариант предыдущего примера:
48+
49+
Java:
50+
51+
*************************************************************************************************
52+
import javax.inject.Inject;
53+
import javax.inject.Provider;
54+
public class SimpleMovieLister {
55+
private Provider<MovieFinder> movieFinder;
56+
@Inject
57+
public void setMovieFinder(Provider<MovieFinder> movieFinder) {
58+
this.movieFinder = movieFinder;
59+
}
60+
public void listMovies() {
61+
this.movieFinder.get().findMovies(...);
62+
// ...
63+
}
64+
}
65+
*************************************************************************************************
66+
67+
Kotlin:
68+
69+
*************************************************************************************************
70+
import javax.inject.Inject
71+
class SimpleMovieLister {
72+
@Inject
73+
lateinit var movieFinder: Provider<MovieFinder>
74+
fun listMovies() {
75+
movieFinder.get().findMovies(...)
76+
// ...
77+
}
78+
}
79+
*************************************************************************************************
80+
81+
Если необходимо использовать полное имя для зависимости, которую нужно внедрить, нам потребуется
82+
использовать аннотацию @Named, как показано в следующем примере:
83+
84+
Java:
85+
86+
*************************************************************************************************
87+
import javax.inject.Inject;
88+
import javax.inject.Named;
89+
public class SimpleMovieLister {
90+
private MovieFinder movieFinder;
91+
@Inject
92+
public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
93+
this.movieFinder = movieFinder;
94+
}
95+
// ...
96+
}
97+
*************************************************************************************************
98+
99+
Kotlin:
100+
101+
*************************************************************************************************
102+
import javax.inject.Inject
103+
import javax.inject.Named
104+
class SimpleMovieLister {
105+
private lateinit var movieFinder: MovieFinder
106+
@Inject
107+
fun setMovieFinder(@Named("main") movieFinder: MovieFinder) {
108+
this.movieFinder = movieFinder
109+
}
110+
// ...
111+
}
112+
*************************************************************************************************
113+
114+
Как и @Autowired, @Inject также можно использовать с java.util.Optional или @Nullable. Это тем более
115+
применимо в данном случае, поскольку @Inject не имеет required атрибута. Следующая пара примеров
116+
показывает, как использовать @Inject и @Nullable:
117+
118+
*************************************************************************************************
119+
public class SimpleMovieLister {
120+
@Inject
121+
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
122+
// ...
123+
}
124+
}
125+
*************************************************************************************************
126+
127+
Java:
128+
129+
*************************************************************************************************
130+
public class SimpleMovieLister {
131+
@Inject
132+
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
133+
// ...
134+
}
135+
}
136+
*************************************************************************************************
137+
138+
Kotlin:
139+
140+
*************************************************************************************************
141+
class SimpleMovieLister {
142+
@Inject
143+
var movieFinder: MovieFinder? = null
144+
}
145+
*************************************************************************************************
146+
147+
*** @Named и @ManagedBean: Стандартные эквиваленты аннотации @Component ***
148+
149+
Вместо @Component можно использовать @javax.inject.Named или javax.annotation.ManagedBean, как
150+
показано в следующем примере:
151+
152+
Java:
153+
154+
*************************************************************************************************
155+
import javax.inject.Inject;
156+
import javax.inject.Named;
157+
@Named("movieListener") // можно также использовать @ManagedBean("movieListener")
158+
public class SimpleMovieLister {
159+
private MovieFinder movieFinder;
160+
@Inject
161+
public void setMovieFinder(MovieFinder movieFinder) {
162+
this.movieFinder = movieFinder;
163+
}
164+
// ...
165+
}
166+
*************************************************************************************************
167+
168+
Kotlin:
169+
170+
*************************************************************************************************
171+
import javax.inject.Inject
172+
import javax.inject.Named
173+
@Named("movieListener") // можно также использовать @ManagedBean("movieListener")
174+
class SimpleMovieLister {
175+
@Inject
176+
lateinit var movieFinder: MovieFinder
177+
// ...
178+
}
179+
*************************************************************************************************
180+
181+
Очень часто используется @Component без указания имени компонента. Аналогичным образом можно
182+
использовать @Named, как показано в следующем примере:
183+
184+
Java:
185+
186+
*************************************************************************************************
187+
import javax.inject.Inject;
188+
import javax.inject.Named;
189+
@Named
190+
public class SimpleMovieLister {
191+
private MovieFinder movieFinder;
192+
@Inject
193+
public void setMovieFinder(MovieFinder movieFinder) {
194+
this.movieFinder = movieFinder;
195+
}
196+
// ...
197+
}
198+
*************************************************************************************************
199+
200+
Kotlin:
201+
202+
*************************************************************************************************
203+
import javax.inject.Inject
204+
import javax.inject.Named
205+
@Named
206+
class SimpleMovieLister {
207+
@Inject
208+
lateinit var movieFinder: MovieFinder
209+
// ...
210+
}
211+
*************************************************************************************************
212+
213+
Если мы задействуем @Named или @ManagedBean, то использовать сканирование компонентов можно точно
214+
так же, как и при использовании аннотаций Spring, как показано в следующем примере:
215+
216+
Java:
217+
218+
*************************************************************************************************
219+
@Configuration
220+
@ComponentScan(basePackages = "org.example")
221+
public class AppConfig {
222+
// ...
223+
}
224+
*************************************************************************************************
225+
226+
Kotlin:
227+
228+
*************************************************************************************************
229+
@Configuration
230+
@ComponentScan(basePackages = ["org.example"])
231+
class AppConfig {
232+
// ...
233+
}
234+
*************************************************************************************************
235+
236+
В отличие от @Component, аннотации @Named из JSR-330 и @ManagedBean из JSR-250 не являются составными.
237+
Для создания специальных аннотаций компонентов следует использовать модель стереотипов Spring.
238+
239+
*** Ограничения стандартных аннотаций JSR-330 ***
240+
241+
При работе со стандартными аннотациями следует знать, что некоторые важные функции будут недоступны,
242+
как показано в следующей таблице:
243+
244+
Spring | javax.inject.* | ограничения/комментарии javax.inject
245+
-------------------------------------------------------------------------------------------------------
246+
@Autowired | @Inject | У @Inject нет атрибута "required". Вместо этого
247+
| | можно использовать Optional из Java 8
248+
-------------------------------------------------------------------------------------------------------
249+
@Component | @Named / @ManagedBean | JSR-330 не предоставляет составную модель, только
250+
| | способ идентификации именованных компонентов.
251+
-------------------------------------------------------------------------------------------------------
252+
@Scope("singleton") | @Singleton | Область доступности по умолчанию из JSR-330 похожа
253+
| | на область доступности на уровне prototype из Spring.
254+
| | Однако для того, чтобы соответствовать общим настройкам
255+
| | Spring, бин из JSR-330, объявленный в контейнере Spring,
256+
| | по умолчанию является singleton. Чтобы использовать
257+
| | область доступности, отличную от singleton, необходимо
258+
| | использовать аннотацию @Scope из Spring. javax.inject
259+
| | также предоставляет возможность использовать аннотацию
260+
| | @Scope. Тем не менее, она предназначена только для
261+
| | создания собственных аннотаций.
262+
-------------------------------------------------------------------------------------------------------
263+
@Qualifier | @Qualifier / @Named | javax.inject.Qualifier – это просто мета-аннотация для
264+
| | создания кастомных квалификаторов. Конкретные String
265+
| | квалификаторы (наподобие @Qualifier из Spring с некоторым
266+
| | значением) могут быть связаны через javax.inject.Named.
267+
-------------------------------------------------------------------------------------------------------
268+
@Value | - | без эквивалента
269+
-------------------------------------------------------------------------------------------------------
270+
@Required | - | без эквивалента
271+
-------------------------------------------------------------------------------------------------------
272+
@Lazy | - | без эквивалента
273+
-------------------------------------------------------------------------------------------------------
274+
ObjectFactory | Provider | javax.inject.Provider является прямой альтернативой
275+
| | ObjectFactory из Spring, только с более коротким именем
276+
| | метода get(). Его также можно использовать в сочетании с
277+
| | @Autowired из Spring или с неаннотированными
278+
| | конструкторами и сеттерами.
279+
-------------------------------------------------------------------------------------------------------

Spring_part_3/DOC/JSR_330.jpg

74.4 KB
Loading

Spring_part_3/DOC/TypeFilters.jpg

100 KB
Loading

0 commit comments

Comments
 (0)