Проект

Общее

Профиль

SPRING FRAMEWORK » История » Версия 2

Александр Александров, 22.04.2019 22:49

1 1 Александр Александров
h1. SPRING FRAMEWORK
2
3
h2. Вопросы
4
5
# Объясните суть паттерна DI или IoC.
6
# Какие преимущества применения Dependency Injection (DI)?
7
# Какие IoC контейнеры вы знаете?
8
# Как реализуется DI в Spring Framework?
9
# Какие существуют виды DI? Приведите примеры.
10
# Что такое Spring? Из каких частей состоит Spring Framework?
11
# Назовите некоторые из шаблонов проектирования, используемых в Spring Framework?
12
# Каковы некоторые из важных особенностей и преимуществ Spring Framework?
13
# Каковы преимущества использования Spring Tool Suite?
14
# Что такое AOP? Как это относиться к IoC?
15
# Что такое Aspect, Advice, Pointcut, JointPoint и Advice Arguments в АОП?
16
# В чем разница между Spring AOP и AspectJ АОП?
17
# Что такое IoC контейнер Spring?
18
# Что такое Spring бин?
19
# Какое значение имеет конфигурационный файл Spring Bean?
20
# Каковы различные способы настроить класс как Spring Bean?
21
# Какие вы знаете scope у Spring Bean?
22
# Что такое жизненный цикл Spring Bean?
23
# Объясните работу BeanFactory в Spring.
24
# Как получить объекты ServletContext и ServletConÙg внутри Spring Bean?
25
# В чем роль ApplicationContext в Spring?
26
# Как выглядит типичная реализция метода используя Spring?
27
# Что такое связывание в Spring и расскажите об аннотации @Autowired?
28
# Каковы различные типы автоматического связывания в Spring?
29
# Приведите пример часто используемых аннотаций Spring.
30
# Можем ли мы послать объект как ответ метода обработчика контроллера?
31
# Является ли Spring бин потокобезопасным?
32
# Как создать ApplicationContext в программе Java?
33
# Можем ли мы иметь несколько файлов конфигурации Spring?
34
# Как внедрить java.util.Properties в Spring Bean?
35
# Как настраивается соединение с БД в Spring?
36
# Как сконфигурировать JNDI не через datasource в applicationContext.xml?
37
# Каким образом можно управлять транзакциями в Spring?
38
# Каким образом Spring поддерживает DAO?
39
# Как интегрировать Spring и Hibernate?
40
# Как задаются файлы маппинга Hibernate в Spring?
41
# Как добавить поддержку Spring в web-приложение
42
# Можно ли использовать xyz.xml вместо applicationContext.xml?
43
# Что такое контроллер в Spring MVC?
44
# Какая разница между аннотациями @Component, @Repository и @Service в Spring?
45
# Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener.
46
# Что такое ViewResolver в Spring?
47
# Что такое MultipartResolver и когда его использовать?
48
# Как загрузить файл в Spring MVC?
49
# Как обрабатывать исключения в Spring MVC Framework?
50
# Каковы минимальные настройки, чтобы создать приложение Spring MVC?
51
# Как бы вы связали Spring MVC Framework и архитектуру MVC?
52
# Как добиться локализации в приложениях Spring MVC?
53
# Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON?
54
# Как проверить (валидировать) данные формы в Spring Web MVC Framework?
55
# Что вы знаете Spring MVC Interceptor и как он используется?
56
# Расскажите о Spring Security.
57
58
h2. Ответы
59
60
h3. Объясните суть паттерна DI или IoC.
61
62 2 Александр Александров
Dependency injection (DI) - паттерн проектирования и архитектурная модель, так же известная как Inversion of Control (IoC). DI описывает ситуацию, когда один объект реализует свой функционал через другой объект. Например, соединение с базой данных передается конструктору объекта через аргумент, вместо того чтобы конструктор сам устанавливал соединение. Существуют три формы внедрения (но не типа) зависимостей: сэттер, конструктор и внедрение путем интерфейса. DI - это способ достижения слабой связанности. IoC предоставляет возможность объекту получать ссылки на свои зависимости. Обычно это реализуется через lookupметод. Преимущество IoC в том, что эта модель позволяет отделить объекты от реализации механизмов, которые он использует. В результате мы получаем большую гибкость как при разработке приложений, так и при их тестировании.
63
64 1 Александр Александров
h3. Какие преимущества применения Dependency Injection (DI)?
65
66 2 Александр Александров
К преимуществам DI можно отнести:
67
68
* Сокращение объема связующего кода. Одним из самых больших плюсов DI является возможность значительного сокращения объема кода, который должен быть написан для связывания вместе различных компонентов приложения. Зачастую этот код очень прост - при создании зависимости должен создаваться новый экземпляр соответствующего объекта.
69
* Упрощенная конфигурация приложения. За счет применения DI процесс конфигурирования приложения значительно упрощается. Для конфигурирования классов, которые могут быть внедрены в другие классы, можно использовать аннотации или XML-файлы.
70
* Возможность управления общими зависимостями в единственном репозитории. При традиционном подходе к управлению зависимостями в общих службах, к которым относятся, например, подключение к источнику данных, транзакция, удаленные службы и т.п., вы создаете экземпляры (или получаете их из определенных фабричных классов) зависимостей там, где они нужны - внутри зависимого класса. Это приводит к распространению зависимостей по множеству классов в приложении, что может затруднить их изменение. В случае использования DI вся информация об общих зависимостях содержится в единственном репозитории (в Spring есть возможность хранить эту информацию в XML-файлах или Java классах).
71
* Улучшенная возможность тестирования. Когда классы проектируются для DI, становится возможной простая замена зависимостей. Это особенно полезно при тестировании приложения.
72
* Стимулирование качественных проектных решений для приложений. Вообще говоря, проектирование для DI означает проектирование с использованием интерфейсов. Используя Spring, вы получаете в свое распоряжение целый ряд средств DI и можете сосредоточиться на построении логики приложения, а не на поддерживающей DI платформе.
73
74 1 Александр Александров
h3. Какие IoC контейнеры вы знаете?
75
76 2 Александр Александров
Spring является IoC контейнером. Помимо него существуют HiveMind, Avalon, PicoContainer и т.д.
77
78 1 Александр Александров
h3. Как реализуется DI в Spring Framework?
79
80 2 Александр Александров
Реализация DI в Spring основана на двух ключевых концепциях Java - компонентах JavaBean и интерфейсах. При использовании Spring в качестве поставщика DI вы получаете гибкость определения конфигурации зависимостей внутри своих
81
приложений разнообразными путями (т.е. внешне в XML-файлах, с помощью конфигурационных Java классов Spring или посредством аннотаций Java в коде). Компоненты JavaBean (также называемые POJO (Plain Old Java Object — простой старый объект Java)) предоставляют стандартный механизм для создания ресурсов Java, которые являются конфигурируемыми множеством способов. За счет применения DI объем кода, который необходим при проектировании приложения на основе интерфейсов, снижается почти до нуля. Кроме того, с помощью интерфейсов можно получить максимальную отдачу от DI, потому что бины могут использовать любую реализацию интерфейса для удовлетворения их зависимости.
82
83 1 Александр Александров
h3. Какие существуют виды DI? Приведите примеры.
84
85 2 Александр Александров
Существует два типа DI: через сэттер и через конструктор.
86
87
Через сэттер. Обычно во всех java beans используются гэттеры и сэттеры для их свойств:
88
89
{{dmsf_image(265)}}
90
91
Мы создаем экземпляр бина NameBean (например, bean1) и устанавливаем нужное свойство, например:
92
93
<pre>
94
bean1.setName("Marfa");
95
</pre>
96
97
Используя Spring реализация была бы такой:
98
99
{{dmsf_image(266)}}
100
101
Это и называет DI через сэттер. Пример внедрения зависимости между объектами:
102
103
{{dmsf_image(267)}}
104
105
Через конструктор: используется конструктор с параметрами. Например:
106
107
{{dmsf_image(268)}}
108
109
Теперь мы внедряем объект на этапе создания экземпляра класса, т.е.
110
111
<pre>
112
bean1 = new NameBean("Marfs");
113
</pre>
114
115
Используя Spring это выглядело бы так:
116
117
{{dmsf_image(269)}}
118
119 1 Александр Александров
h3. Что такое Spring? Из каких частей состоит Spring Framework?
120
121 2 Александр Александров
Spring - фреймворк с открытым исходным кодом, предназначеный для упрощения разработки enterprise-приложений. Одним из главным преимуществом Spring является его слоистая архитектура, позволяющая вам самим определять какие компоненты будут использованы в вашем приложении. Модули Spring построены на базе основного контейнера, который определяет создание, конфигурация и менеджмент бинов.
122
123
Основные модули:
124
125
* Основной контейнер - предоставляет основной функционал Spring. Главным компонентом контейнера является BeanFactory - реализация паттерна Фабрика. BeanFactory позволяет разделить конфигурацию приложения и информацию о зависимостях от кода.
126
* Spring context - конфигурационный файл, который предоставляет информация об окружающей среде для Spring. Сюда входят такие enterprise-сервисы, как JNDI, EJB, интернационализация, валиадция и т.п. Spring AOP - отвечает за интеграцию аспектно-ориентированного программирования во фреймворк. Spring AOP обеспечивает сервис управления транзакциями для Spring-приложения.
127
* Spring DAO - абстрактный уровень Spring JDBC DAO предоставляет иерархию исключений и множество сообщений об ошибках для разных БД. Эта иерархия упрощает обработку исключений и значительно уменьшает количество кода, которое вам нужно было бы написать для таких операций, как, например, открытие и закрытие соединения.
128
* Spring ORM - отвечает за интеграцию Spring и таких популярных ORMфреймворков, как Hibernate, iBatis и JDO.
129
* Spring Web module - классы, которые помогают упростить разработку Web (авторизация, доступ к бинам Spring-а из web).
130
* Spring MVC framework - реализация паттерна MVC для построения Webприложений.
131
132 1 Александр Александров
h3. Назовите некоторые из шаблонов проектирования, используемых в Spring Framework?
133
134 2 Александр Александров
Spring Framework использует множество шаблонов проектирования, например:
135
136
* Singleton Pattern: Creating beans with default scope.
137
* Factory Pattern: Bean Factory classes
138
* Prototype Pattern: Bean scopes
139
* Adapter Pattern: Spring Web and Spring MVC
140
* Proxy Pattern: Spring Aspect Oriented Programming support
141
* Template Method Pattern: JdbcTemplate, HibernateTemplate etc
142
* Front Controller: Spring MVC DispatcherServlet
143
* Data Access Object: Spring DAO support
144
* Dependency Injection and Aspect Oriented Programming
145
146 1 Александр Александров
h3. Каковы некоторые из важных особенностей и преимуществ Spring Framework?
147
148 2 Александр Александров
Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.
149
150
* Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
151
* Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в команднойразработке, переносимости модулей и т.д.
152
* Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
153
* Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.
154
155 1 Александр Александров
h3. Каковы преимущества использования Spring Tool Suite?
156
157 2 Александр Александров
Для упрощения процесса разработки основанных на Spring приложений в Eclipse (наиболее часто используемая IDE-среда для разработки Java-приложений), в рамках Spring создан проект Spring IDE. Проект бесплатный. Он интегрирован в Eclipse IDE, Spring IDE, Mylyn (среда разработки в Eclipse, основанная на задачах), Maven for Eclipse, AspectJ Development Tool.
158
159 1 Александр Александров
h3. Что такое AOP? Как это относиться к IoC?
160
161 2 Александр Александров
Аспектно-ориентированное программирование (АОП) - парадигма программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули. AOP и Spring - взаимодополняющие технологии,которые позволяют решать сложные проблемы путем разделения функционала на отдельные модули. АОП предоставляет возможность реализации сквозной логики - т.е. логики, которая применяется к множеству частей приложения - в одном месте и обеспечения автоматического применения этой логики по всему приложению. Подход Spring к АОП заключается в создании "динамических прокси" для целевых объектов и "привязывании" объектов к конфигурированному совету для выполнения сквозной логики.
162
163 1 Александр Александров
h3. Что такое Aspect, Advice, Pointcut, JointPoint и Advice Arguments в АОП?
164
165 2 Александр Александров
Основные понятия АОП:
166
167
* Аспект (англ. aspect) - модуль или класс, реализующий сквозную функциональность. Аспект изменяет поведение остального кода, применяя совет в точках соединения, определённых некоторым срезом.
168
* Совет (англ. advice) - фрагмент кода, который должен выполняться в отдельной точке соединения. Существует несколько типов советов, совет может быть выполнен до, после или вместо точки соединения.
169
* Точка соединения (англ. joinpoint) - это четко определенная точка в выполняемой программе, где следует применить совет. Типовые примеры точек соединения включают обращение к методу, собственно Method Invocation, инициализацию класса и создание экземпляра объекта. Многие реализации АОП позволяют использовать вызовы методов и обращения к полям объекта в качестве точек соединения.
170
* Срез (англ. pointcut) - набор точек соединения. Срез определяет, подходит ли данная точка соединения к данному совету. Самые удобные реализации АОП используют для определения срезов синтаксис основного языка (например, в AspectJ применяются Java-сигнатуры) и позволяют их повторное использование с помощью переименования и комбинирования.
171
* Связывание(англ. weaving) представляет собой процесс действительной вставки аспектов в определенную точку кода приложения. Для решений АОП времени компиляции это делается на этапе компиляции, обычно в виде дополнительного шага процесса сборки. Аналогично, для решений АОП времени выполнения связывание происходит динамически во время выполнения. В AspectJ поддерживается еще один механизм связывания под названием связывание во время загрузки (load-time weaving - LTW), который перехватывает лежащий в основе загрузчик классов JVM и обеспечивает связывание с байт-кодом, когда он загружается загрузчиком классов.
172
* Цель(англ. target) - это объект, поток выполнения которого изменяется каким-то процессом АОП. На целевой объект часто ссылаются как на объект, снабженный советом.
173
* Внедрение (англ. introduction, введение) - представляет собой процесс, посредством которого можно изменить структуру объекта за счет введения в него дополнительных методов или полей, изменение иерархии наследования для добавления функциональности аспекта в инородный код. Обычно реализуется с помощью некоторого метаобъектного протокола (англ. metaobject protocol, MOP).
174
175 1 Александр Александров
h3. В чем разница между Spring AOP и AspectJ АОП?
176
177 2 Александр Александров
AspectJ де-факто является стандартом реализации АОП. Реализация АОП от Spring имеет некоторые отличия:
178
179
* Spring AOP немного проще, т.к. нет необходимости следить за процессом связывания.
180
* Spring AOP поддерживает аннотации AspectJ, таким образом мы можем работать в спринг проекте похожим образом с AspectJ проектом.
181
* Spring AOP поддерживает только proxy-based АОП и может использовать только один тип точек соединения - Method Invocation. AspectJ поддерживает все виды точек соединения.
182
* Недостатком Spring AOP является работа только со своими бинами, которые существуют в Spring Context.
183
184 1 Александр Александров
h3. Что такое IoC контейнер Spring?
185
186 2 Александр Александров
По своей сути IoC, а, следовательно, и DI, направлены на то, чтобы предложить простой механизм для предоставления зависимостей компонента (часто называемых коллабораторами объекта) и управления этими зависимостями на протяжении всего их жизненного цикла. Компонент, который требует определенных зависимостей, зачастую называют зависимым объектом или, в случае IoC, целевым объектом. IoC предоставляет службы, через которые компоненты могут получать доступ к своим зависимостям, и службы для взаимодействия с зависимостями в течение их времени жизни. В общем случае IoC может быть расщеплена на два подтипа: инверсия управления (Dependency Injection) и инверсия поиска (Dependency Lookup). Инверсия управления — это крупная часть того, делает Spring, и ядро реализации Spring основано на инверсии управления, хотя также предоставляются и средства Dependency Lookup. Когда платформа Spring предоставляет коллабораторы зависимому объекту автоматически, она делает это с использованием инверсии управления (Dependency Injection). В приложении, основанном на Spring, всегда предпочтительнее применять Dependency Injection для передачи коллабораторов зависимым объектам вместо того, чтобы заставлять зависимые объекты получать коллабораторы через поиск.
187
188 1 Александр Александров
h3. Что такое Spring бин?
189
190 2 Александр Александров
Термин бин (англ. Bean) - в Spring используется для ссылки на любой компонент, управляемый контейнером. Обычно бины на определенном уровне придерживаются спецификации JavaBean, но это не обязательно особенно если для связывания бинов друг с другом планируется применять Constructor Injection. Для получения экземпляра бина используется ApplicationContext. IoC контейнер управляет жизненным циклом спринг бина, областью видимости и внедрением.
191
192 1 Александр Александров
h3. Какое значение имеет конфигурационный файл Spring Bean?
193
194 2 Александр Александров
Конфигурационный файл спринг определяет все бины, которые будут инициализированы в Spring Context. При создании экземпляра Spring ApplicationContext будет прочитан конфигурационный xml файл и выполнены указанные в нем необходимые инициализации. Отдельно от базовой конфигурации, в файле могут содержаться описание перехватчиков (interceptors), view resolvers, настройки локализации и др.
195
196 1 Александр Александров
h3. Каковы различные способы настроить класс как Spring Bean?
197
198 2 Александр Александров
Существует несколько способов работы с классами в Spring. 
199
200
XML конфигурация:
201
202
{{dmsf_image(270)}}
203
204
Java based конфигурация. Все настройки и указания бинов прописываются в java коде:
205
206
{{dmsf_image(271)}}
207
208
Для извлечения бина из контекста используется следующий подход:
209
210
{{dmsf_image(272)}}
211
212
Annotation based конфигурация. Можно использовать внутри кода аннотации @Component, @Service, @Repository, @Controller для указания классов в качестве спринг бинов. Для их поиска и управления контейнером прописывается настройка в xml файле:
213
214
{{dmsf_image(273)}}
215
216 1 Александр Александров
h3. Какие вы знаете scope у Spring Bean?
217 2 Александр Александров
218
В Spring предусмотрены различные области времени действия бинов:
219
220
* singleton - может быть создан только один экземпляр бина. Этот тип используется спрингом по умолчанию, если не указано другое. Следует осторожно использовать публичные свойства класса, т.к. они не будут потокобезопасными.
221
* prototype - создается новый экземпляр при каждом запросе.
222
* request - аналогичен prototype, но название служит пояснением к использованию бина в веб приложении. Создается новый экземпляр при каждом HTTP request.
223
* session - новый бин создается в контейнере при каждой новой HTTP сессии.
224
* global-session: используется для создания глобальных бинов на уровне сессии для Portlet приложений.
225 1 Александр Александров
226
h3. Что такое жизненный цикл Spring Bean?
227
228
h3. Объясните работу BeanFactory в Spring.
229
230
h3. Как получить объекты ServletContext и ServletConÙg внутри Spring Bean?
231
232
h3. В чем роль ApplicationContext в Spring?
233
234
h3. Как выглядит типичная реализция метода используя Spring?
235
236
h3. Что такое связывание в Spring и расскажите об аннотации @Autowired?
237
238
h3. Каковы различные типы автоматического связывания в Spring?
239
240
h3. Приведите пример часто используемых аннотаций Spring.
241
242
h3. Можем ли мы послать объект как ответ метода обработчика контроллера?
243
244
h3. Является ли Spring бин потокобезопасным?
245
246
h3. Как создать ApplicationContext в программе Java?
247
248
h3. Можем ли мы иметь несколько файлов конфигурации Spring?
249
250
h3. Как внедрить java.util.Properties в Spring Bean?
251
252
h3. Как настраивается соединение с БД в Spring?
253
254
h3. Как сконфигурировать JNDI не через datasource в applicationContext.xml?
255
256
h3. Каким образом можно управлять транзакциями в Spring?
257
258
h3. Каким образом Spring поддерживает DAO?
259
260
h3. Как интегрировать Spring и Hibernate?
261
262
h3. Как задаются файлы маппинга Hibernate в Spring?
263
264
h3. Как добавить поддержку Spring в web-приложение
265
266
h3. Можно ли использовать xyz.xml вместо applicationContext.xml?
267
268
h3. Что такое контроллер в Spring MVC?
269
270
h3. Какая разница между аннотациями @Component, @Repository и @Service в Spring?
271
272
h3. Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener.
273
274
h3. Что такое ViewResolver в Spring?
275
276
h3. Что такое MultipartResolver и когда его использовать?
277
278
h3. Как загрузить файл в Spring MVC?
279
280
h3. Как обрабатывать исключения в Spring MVC Framework?
281
282
h3. Каковы минимальные настройки, чтобы создать приложение Spring MVC?
283
284
h3. Как бы вы связали Spring MVC Framework и архитектуру MVC?
285
286
h3. Как добиться локализации в приложениях Spring MVC?
287
288
h3. Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON?
289
290
h3. Как проверить (валидировать) данные формы в Spring Web MVC Framework?
291
292
h3. Что вы знаете Spring MVC Interceptor и как он используется?
293
294
h3. Расскажите о Spring Security.
Go to top