Skip to content

Commit 78517a4

Browse files
committed
Part 25: update ModularizingSpringBootApp.md
1 parent 381663c commit 78517a4

File tree

1 file changed

+60
-77
lines changed

1 file changed

+60
-77
lines changed

Spring_part_25/DOC/HandMade_SB_Starter/ModularizingSpringBootApp.txt renamed to Spring_part_25/DOC/HandMade_SB_Starter/ModularizingSpringBootApp.md

Lines changed: 60 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
См. исходники и дополнения (ENG): https://reflectoring.io/spring-boot-starter/
22
________________________________________________________________________________________________________________________
3-
****** Разбиение Spring Boot приложения на модули ******
3+
### Разбиение Spring Boot приложения на модули
44

55
Каждый программный проект подходит к моменту, когда код необходимо разбить на модули. Это могут быть модули внутри
66
одной кодовой базы или модули, каждый из которых живет в своей собственной кодовой базе. В этой статье объясняются
77
некоторые функции Spring Boot, которые помогают разделить приложение Spring Boot на несколько модулей.
88

9-
Пример кода на GitHub - https://github.com/thombergs/code-examples/tree/master/spring-boot/modular
9+
Пример [кода на GitHub](https://github.com/thombergs/code-examples/tree/master/spring-boot/modular)
1010

1111
________________________________________________________________________________________________________________________
12-
*** Что такое модуль в Spring Boot? ***
12+
#### Что такое модуль в Spring Boot?
1313

1414
Модуль в понимании этой статьи — это набор компонентов Spring, загружаемых в контекст приложения.
1515

@@ -20,72 +20,64 @@ ________________________________________________________________________________
2020
того пожелаем - https://reflectoring.io/spring-boot-gradle-multi-module/.
2121

2222
________________________________________________________________________________________________________________________
23-
*** Варианты создания модулей ***
23+
#### Варианты создания модулей
2424

2525
Основой модуля Spring является @Configuration аннотированный класс, аналогичный функции конфигурации Java Spring.
26-
Существует несколько способов определить, какие bean-компоненты должны быть загружены таким классом конфигурации -
27-
https://docs.spring.io/spring-framework/reference/core/beans/java.html.
26+
Существует несколько способов определить, какие [bean-компоненты должны быть загружены таким классом конфигурации](https://docs.spring.io/spring-framework/reference/core/beans/java.html).
2827

2928
________________________________________________________________________________________________________________________
30-
*** @ComponentScan ***
29+
#### @ComponentScan
3130

3231
Самый простой способ создать модуль — использовать аннотацию @ComponentScan к классу конфигурации:
3332

34-
************************************************************************************************************************
35-
@Configuration
36-
@ComponentScan(basePackages = "io.reflectoring.booking")
37-
public class BookingModuleConfiguration {
38-
}
39-
************************************************************************************************************************
33+
@Configuration
34+
@ComponentScan(basePackages = "io.reflectoring.booking")
35+
public class BookingModuleConfiguration {
36+
}
4037

4138
Если этот класс конфигурации выбран одним из механизмов импорта (описано ниже), он просмотрит все классы в пакете
42-
io.reflectoring.booking и загрузит экземпляр каждого класса, который помечен одной из стереотипных аннотаций Spring,
43-
в контекст приложения, см.
44-
https://github.com/spring-projects/spring-framework/tree/main/spring-context/src/main/java/org/springframework/stereotype.
39+
io.reflectoring.booking и загрузит экземпляр каждого класса, который помечен [одной из стереотипных аннотаций Spring,
40+
в контекст приложения](https://github.com/spring-projects/spring-framework/tree/main/spring-context/src/main/java/org/springframework/stereotype).
4541

4642
Этот способ подходит, если вы всегда хотите загружать все классы пакета и его подпакеты в контекст приложения. Если
4743
вам нужно больше контроля над тем, что загружать, читайте дальше.
4844

4945
________________________________________________________________________________________________________________________
50-
*** Определения @Bean ***
46+
#### Определения @Bean
5147

5248
Функция конфигурации Java в Spring также предоставляет @Bean аннотацию для создания bean-компонентов, загружаемых в
5349
контекст приложения:
5450

55-
************************************************************************************************************************
56-
@Configuration
57-
public class BookingModuleConfiguration {
58-
59-
@Bean
60-
public BookingService bookingService(){
61-
return new BookingService();
62-
}
63-
64-
// potentially more @Bean definitions ...
65-
66-
}
67-
************************************************************************************************************************
51+
@Configuration
52+
public class BookingModuleConfiguration {
53+
54+
@Bean
55+
public BookingService bookingService(){
56+
return new BookingService();
57+
}
58+
59+
// potentially more @Bean definitions ...
60+
61+
}
6862

6963
Когда этот класс конфигурации импортируется, экземпляр BookingService будет создан и вставлен в контекст приложения.
7064
Использование этого способа создания модуля дает более четкое представление о том, какие bean-компоненты на самом деле
7165
загружены, поскольку у вас есть одно место для просмотра - в отличие от использования, @ComponentScan когда вам нужно
7266
смотреть на стереотипные аннотации всех классов в пакете, чтобы увидеть, что происходит.
7367

7468
________________________________________________________________________________________________________________________
75-
*** Аннотации @ConditionalOn... ***
69+
#### Аннотации @ConditionalOn...
7670

7771
Если вам нужен еще более детальный контроль над тем, какие компоненты следует загружать в контекст приложения, вы
7872
можете использовать @ConditionalOn... аннотации Spring Boot:
7973

80-
************************************************************************************************************************
81-
@Configuration
82-
@ConditionalOnProperty(name = "io.reflectoring.security.enabled",
83-
havingValue = "true",
84-
matchIfMissing = true)
85-
public class SecurityModuleConfiguration {
86-
// @Bean definitions ...
87-
}
88-
************************************************************************************************************************
74+
@Configuration
75+
@ConditionalOnProperty(name = "io.reflectoring.security.enabled",
76+
havingValue = "true",
77+
matchIfMissing = true)
78+
public class SecurityModuleConfiguration {
79+
// @Bean definitions ...
80+
}
8981

9082
Установка свойства io.reflectoring.security.enabled теперь - false полностью отключит этот модуль.
9183

@@ -98,102 +90,93 @@ bean-компонента в контексте приложения, см. http
9890
@ConditionalOn...
9991

10092
________________________________________________________________________________________________________________________
101-
*** Варианты импорта модулей ***
93+
#### Варианты импорта модулей
10294

10395
Создав модуль, нам необходимо импортировать его в приложение.
10496

10597
________________________________________________________________________________________________________________________
106-
*** @Import ***
98+
#### @Import
10799

108100
Самый простой способ — использовать аннотацию @Import:
109101

110-
************************************************************************************************************************
111-
@SpringBootApplication
112-
@Import(BookingModuleConfiguration.class)
113-
public class ModularApplication {
114-
// ...
115-
}
116-
************************************************************************************************************************
102+
@SpringBootApplication
103+
@Import(BookingModuleConfiguration.class)
104+
public class ModularApplication {
105+
// ...
106+
}
117107

118108
Это приведет к импорту класса BookingModuleConfiguration и всех связанных с ним bean-компонентов - независимо от того,
119109
объявлены ли они с помощью аннотаций @ComponentScan или @Bean.
120110

121111
________________________________________________________________________________________________________________________
122-
*** Аннотации @Enable... ***
112+
#### Аннотации @Enable...
123113

124114
Spring Boot предоставляет набор аннотаций, каждая из которых импортирует определенный модуль. Примером является,
125115
аннотация @EnableScheduling которая импортирует все Bean-компоненты, необходимые для работы подсистемы планирования и
126116
ее аннотаций @Scheduled.
127117

128118
Мы можем использовать это сами, определив собственную аннотацию @EnableBookingModule:
129119

130-
************************************************************************************************************************
131-
@Retention(RetentionPolicy.RUNTIME)
132-
@Target({ElementType.TYPE})
133-
@Documented
134-
@Import(BookingModuleConfiguration.class)
135-
@Configuration
136-
public @interface EnableBookingModule {
137-
}
138-
************************************************************************************************************************
120+
@Retention(RetentionPolicy.RUNTIME)
121+
@Target({ElementType.TYPE})
122+
@Documented
123+
@Import(BookingModuleConfiguration.class)
124+
@Configuration
125+
public @interface EnableBookingModule {
126+
}
139127

140128
Аннотация используется следующим образом:
141129

142-
************************************************************************************************************************
143-
@SpringBootApplication
144-
@EnableBookingModule
145-
public class ModularApplication {
146-
// ...
147-
}
148-
************************************************************************************************************************
130+
@SpringBootApplication
131+
@EnableBookingModule
132+
public class ModularApplication {
133+
// ...
134+
}
149135

150136
Аннотация @EnableBookingModule на самом деле является просто оберткой вокруг аннотации @Import, которая импортирует наш
151137
объект, BookingModuleConfiguration как и раньше. Однако если у нас есть модуль, состоящий более чем из одной
152138
конфигурации, это удобный и выразительный способ объединить эти конфигурации в один модуль.
153139

154140
________________________________________________________________________________________________________________________
155-
*** Авто-конфигурация ***
141+
#### Авто-конфигурация
156142

157143
Если мы хотим загрузить модуль автоматически вместо жесткого связывания импорта с исходным кодом, мы можем использовать
158144
функцию автоматической настройки Spring Boot.
159145

160146
Чтобы включить модуль для автоматической настройки, поместите файл META-INF/spring.factories в путь к классам:
161147

162-
************************************************************************************************************************
163-
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
164-
io.reflectoring.security.SecurityModuleConfiguration
165-
************************************************************************************************************************
148+
org.springframework.boot.autoconfigure.EnableAutoConfiguration = io.reflectoring.security.SecurityModuleConfiguration
166149

167150
Это импортирует класс SecurityModuleConfiguration и все его компоненты в контекст приложения.
168151

169152
Автоматическая настройка особенно удобна, если мы создаем сквозную задачу, которая будет использоваться во многих
170153
приложениях Spring Boot. В этом случае мы можем даже построить на основе конфигурации отдельный стартовый модуль.
171154

172155
________________________________________________________________________________________________________________________
173-
*** Настройка модуля ***
156+
#### Настройка модуля
174157

175158
Благодаря @ConfigurationProperties аннотации Spring Boot обеспечивает первоклассную поддержку для привязки внешних
176159
параметров конфигурации к bean-компоненту Spring типобезопасным способом, см.
177160
https://reflectoring.io/spring-boot-configuration-properties/
178161

179162
________________________________________________________________________________________________________________________
180-
*** Когда использовать какую стратегию импорта? ***
163+
#### Когда использовать какую стратегию импорта?
181164

182165
В этой статье представлены основные возможности создания и импорта модулей в приложении Spring Boot. Но когда нам
183166
следует использовать какой из этих вариантов?
184167

185168
________________________________________________________________________________________________________________________
186-
*** Использование @Import для бизнес-модулей ***
169+
#### Использование @Import для бизнес-модулей
187170

188171
Для модулей, содержащих бизнес-логику, таких, как BookingModuleConfiguration из приведенных выше фрагментов кода, в
189172
большинстве случаев достаточно статического импорта с аннотацией @Import. Обычно не имеет смысла не загружать
190173
бизнес-модуль, поэтому нам не требуется никакого контроля над условиями его загрузки.
191174

192-
!!! Обратите внимание: даже если модуль всегда загружен, он все равно имеет право существовать как модуль, поскольку,
193-
будучи модулем, он может жить в своем собственном пакете или даже в своем собственном JAR-файле.
175+
!!! Обратите внимание: даже если модуль всегда загружен, он все равно имеет право существовать как модуль, поскольку,
176+
будучи модулем, он может жить в своем собственном пакете или даже в своем собственном JAR-файле.
194177

195178
________________________________________________________________________________________________________________________
196-
*** Используйте автоматическую настройку для технических модулей ***
179+
#### Используйте автоматическую настройку для технических модулей
197180

198181
С другой стороны, технические модули, как и SecurityModuleConfiguration вышеописанные, обычно обеспечивают некоторые
199182
сквозные задачи, такие как ведение журнала, обработка исключений, авторизация или функции мониторинга, без которых

0 commit comments

Comments
 (0)