SPRING FRAMEWORK » История » Версия 7
Александр Александров, 29.04.2019 12:45
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 | 3 | Александр Александров | Жизненный цикл Spring бина - время существования класса. Spring бины инициализируются при инициализации Spring контейнера и происходит внедрение всех зависимостей. Когда контейнер уничтожается, то уничтожается и всё содержимое. Если нам необходимо задать какое-либо действие при инициализации и уничтожении бина, то нужно воспользоваться методами init() и destroy(). Для этого можно использовать аннотации @PostConstruct и @PreDestroy(). |
229 | |||
230 | {{dmsf_image(274)}} |
||
231 | |||
232 | {{dmsf_image(275)}} |
||
233 | |||
234 | 1 | Александр Александров | h3. Объясните работу BeanFactory в Spring. |
235 | |||
236 | 3 | Александр Александров | BeanFactory - это реализация паттерна Фабрика, его функицональность покрывает создание бинов. Так как эта фабрика знает многие об объектах приложения, то она может создавать связи между объектами на этапе создания экземпляра. Существует несколько реализаций BeanFactory, самая используемся - "org.springframework.beans.factory.xml.XmlBeanFactory". Она загружает бины на основе конфигурационного XML-файла. Чтобы создать XmlBeanFactory передайте конструктору |
237 | InputStream, например: |
||
238 | |||
239 | <pre><code class="java"> |
||
240 | BeanFactory factory = new XmlBeanFactory(new FileInputStream("myBean.xml")); |
||
241 | </code></pre> |
||
242 | |||
243 | После этой строки фабрика знает о бинах, но их экземпляры еще не созданы. Чтобы инстанцировать бин нужно вызвать метод getBean(). Например: |
||
244 | |||
245 | <pre><code class="java"> |
||
246 | myBean bean1 = (myBean) factory.getBean("myBean"); |
||
247 | </code></pre> |
||
248 | |||
249 | 5 | Александр Александров | h3. Как получить объекты ServletContext и ServletConfig внутри Spring Bean? |
250 | 1 | Александр Александров | |
251 | 3 | Александр Александров | Доступны два способа для получения основных объектов контейнера внутри бина: |
252 | |||
253 | 6 | Александр Александров | * Реализовать один из Spring*Aware (ApplicationContextAware, ServletContextAware, ServletConfigAware и др.) интерфейсов. |
254 | 3 | Александр Александров | * Использовать автоматическое связывание @Autowired в спринг. Способ работает внутри контейнера спринг. |
255 | |||
256 | <pre><code class="java"> |
||
257 | @Autowired |
||
258 | ServletContext servletContext; |
||
259 | </code></pre> |
||
260 | |||
261 | 1 | Александр Александров | h3. В чем роль ApplicationContext в Spring? |
262 | |||
263 | 3 | Александр Александров | В то время, как BeanFactory используется в простых приложениях, Application Context - это более сложный контейнер. Как и BeanFactory он может быть использован для загрузки и связывания бинов, но еще он предоставляет: |
264 | |||
265 | * возможность получения текстовых сообщений, в том числе поддержку интернационализации; |
||
266 | * общий механизм работы с ресурсами; |
||
267 | * события для бинов, которые зарегестрированы как слушатели. |
||
268 | |||
269 | Из-за большей функциональности рекомендуется использование Application Context вместо BeanFactory. Последний используется только в случаях нехватки ресурсов, например при разработке для мобильных устройств. |
||
270 | |||
271 | 1 | Александр Александров | h3. Как выглядит типичная реализция метода используя Spring? |
272 | |||
273 | 3 | Александр Александров | * Интерфейс, описывающий функционал приложения |
274 | * Реализация интерфейса, содержащая свойства, сэттеры-гэттеры, функции и т.п. |
||
275 | * Конфигурационный XML-файл Spring'а. |
||
276 | * Клиентское приложение, которое использует функцию. |
||
277 | |||
278 | 1 | Александр Александров | h3. Что такое связывание в Spring и расскажите об аннотации @Autowired? |
279 | |||
280 | 3 | Александр Александров | Процесс внедрения зависимостей в бины при инициализации называется Spring Bean Wiring. Считается хорошей практикой задавать явные связи между зависимостями, но в Spring предусмотрен дополнительный механизм связывания @Autowired. Аннотация может использоваться над полем или методом для связывания по типу. Чтобы аннотация заработала, необходимо указать небольшие настройки в конфигурационном файле спринг с помощью элемента context:annotation-config. |
281 | |||
282 | 1 | Александр Александров | h3. Каковы различные типы автоматического связывания в Spring? |
283 | |||
284 | 3 | Александр Александров | Существует четыре вида связывания в спринг: |
285 | |||
286 | * autowire byName; |
||
287 | * autowire byType; |
||
288 | * autowire by constructor; |
||
289 | 7 | Александр Александров | * autowiring by @Autowired and @Qualifier annotations. |
290 | 3 | Александр Александров | |
291 | 1 | Александр Александров | h3. Приведите пример часто используемых аннотаций Spring. |
292 | |||
293 | 3 | Александр Александров | * @Controller - класс фронт контроллера в проекте Spring MVC. |
294 | * @RequestMapping - позволяет задать шаблон маппинга URI в методе обработчике контроллера. |
||
295 | * @ResponseBody - позволяет отправлять Object в ответе. Обычно используется для отправки данных формата XML или JSON. |
||
296 | * @PathVariable - задает динамический маппинг значений из URI внутри аргументов метода обработчика. |
||
297 | * @Autowired - используется для автоматического связывания зависимостей в spring beans. |
||
298 | * @Qualifier - используется совместно с @Autowired для уточнения данных связывания, когда возможны коллизии (например одинаковых имен\типов). |
||
299 | * @Service - указывает что класс осуществляет сервисные функции. |
||
300 | * @Scope - указывает scope у spring bean. |
||
301 | * @Configuration, @ComponentScan и @Bean - для java based configurations. |
||
302 | * AspectJ аннотации для настройки aspects и advices, @Aspect, @Before, @After,@Around, @Pointcut и др. |
||
303 | |||
304 | 1 | Александр Александров | h3. Можем ли мы послать объект как ответ метода обработчика контроллера? |
305 | |||
306 | 3 | Александр Александров | Да, это возможно. Для этого используется аннотация @ResponseBody. Так можно отправлять ответы в виде JSON, XML в restful веб сервисах. |
307 | |||
308 | 1 | Александр Александров | h3. Является ли Spring бин потокобезопасным? |
309 | |||
310 | 3 | Александр Александров | По умолчанию бин задается как синглтон в Spring. Таким образом все публичные переменные класса могут быть изменены одновременно из разных мест. Так что - нет, не является. Однако поменяв область действия бина на request, prototype, session он станет потокобезопасным, но это скажется на производительности. |
311 | |||
312 | 1 | Александр Александров | h3. Как создать ApplicationContext в программе Java? |
313 | |||
314 | 3 | Александр Александров | В независимой Java программе ApplicationContext можно создать следующим образом: AnnotationConfigApplicationContext - при использовании Spring в качестве автономного приложения можно создать инициализировать контейнер с помощью аннотаций. Пример: |
315 | |||
316 | <pre><code class="java"> |
||
317 | ApplicationContext context = new AnnotationConfigApplicationContext("bean.xml"); |
||
318 | </code></pre> |
||
319 | |||
320 | ClassPathXmlApplicationContext - получает информацию из xml-файла, находящегося в classpath. Пример: |
||
321 | |||
322 | <pre><code class="java"> |
||
323 | ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); |
||
324 | </code></pre> |
||
325 | |||
326 | FileSystemXmlApplicationContext - получает информацию из xml-файла, но с возможностью загрузки файла конфигурации из любого места файловой системы. Пример: |
||
327 | |||
328 | <pre><code class="java"> |
||
329 | ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml"); |
||
330 | </code></pre> |
||
331 | |||
332 | XmlWebApplicationContext - получает информацию из xml-файла за пределами webприложения. |
||
333 | |||
334 | 1 | Александр Александров | h3. Можем ли мы иметь несколько файлов конфигурации Spring? |
335 | |||
336 | 3 | Александр Александров | С помощью указания contextConfigLocation можно задать несколько файлов конфигурации Spring. Параметры указываются через запятую или пробел: |
337 | |||
338 | {{dmsf_image(276)}} |
||
339 | |||
340 | Поддерживается возможность указания нескольких корневых файлов конфигурации Spring: |
||
341 | |||
342 | {{dmsf_image(277)}} |
||
343 | |||
344 | Файл конфигурации можно импортировать: |
||
345 | |||
346 | <pre> |
||
347 | <beans:import resource="spring-jdbc.xml"/> |
||
348 | </pre> |
||
349 | |||
350 | 1 | Александр Александров | h3. Как внедрить java.util.Properties в Spring Bean? |
351 | |||
352 | 3 | Александр Александров | Для возможности использования Spring EL для внедрения свойств (properties) в различные бины необходимо определить propertyConfigure bean, который будет загружать файл свойств. |
353 | |||
354 | {{dmsf_image(278)}} |
||
355 | |||
356 | Или через аннотации: |
||
357 | |||
358 | <pre><code class="java"> |
||
359 | @Value("${maxReadResults}") |
||
360 | private int maxReadResults; |
||
361 | </code></pre> |
||
362 | |||
363 | 1 | Александр Александров | h3. Как настраивается соединение с БД в Spring? |
364 | |||
365 | 3 | Александр Александров | Используя datasource "org.springframework.jdbc.datasource.DriverManagerDataSource". Пример: |
366 | |||
367 | {{dmsf_image(279)}} |
||
368 | |||
369 | 1 | Александр Александров | h3. Как сконфигурировать JNDI не через datasource в applicationContext.xml? |
370 | |||
371 | 3 | Александр Александров | Используя "org.springframework.jndi.JndiObjectFactoryBean". Пример |
372 | |||
373 | {{dmsf_image(280)}} |
||
374 | |||
375 | 1 | Александр Александров | h3. Каким образом можно управлять транзакциями в Spring? |
376 | |||
377 | 3 | Александр Александров | Транзакциями в Spring управляют с помощью Declarative Transaction Management (программное управление). Используется аннотация @Transactional для описания необходимости управления транзакцией. В файле конфигурации нужно добавить настройку transactionManager для DataSource. |
378 | |||
379 | {{dmsf_image(281)}} |
||
380 | |||
381 | 1 | Александр Александров | h3. Каким образом Spring поддерживает DAO? |
382 | |||
383 | 3 | Александр Александров | Spring DAO предоставляет возможность работы с доступом к данным с помощью технологий вроде JDBC, Hibernate в удобном виде. Существуют специальные классы: JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport, JpaDaoSupport. |
384 | |||
385 | Класс HibernateDaoSupport является подходящим суперклассом для Hibernate DAO. Он содержит методы для получения сессии или фабрики сессий. Самый популярный метод - getHibernateTemplate(), который возвращает HibernateTemplate. Этот темплейт оборачивает checked-исключения Hibernate в runtime-исключения, позволяя вашим DAO оставаться независимыми от исключений Hibernate. |
||
386 | |||
387 | Пример: |
||
388 | |||
389 | {{dmsf_image(282)}} |
||
390 | |||
391 | 1 | Александр Александров | h3. Как интегрировать Spring и Hibernate? |
392 | |||
393 | 3 | Александр Александров | Для интеграции Hibernate в Spring необходимо подключить зависимости, а так женастроить файл конфигурации Spring. Т.к. настройки несколько отличаются между проектами и версиями, то смотрите официальную документацию Spring и Hibernate для уточнения настроек для конкретных технологий. |
394 | |||
395 | 1 | Александр Александров | h3. Как задаются файлы маппинга Hibernate в Spring? |
396 | |||
397 | 3 | Александр Александров | Через applicationContext.xml в web/WEB-INF. Например: |
398 | |||
399 | {{dmsf_image(283)}} |
||
400 | |||
401 | 1 | Александр Александров | h3. Как добавить поддержку Spring в web-приложение |
402 | |||
403 | 3 | Александр Александров | Достаточно просто указать ContextLoaderListener в web.xml файле приложения: |
404 | |||
405 | {{dmsf_image(284)}} |
||
406 | |||
407 | 1 | Александр Александров | h3. Можно ли использовать xyz.xml вместо applicationContext.xml? |
408 | 3 | Александр Александров | |
409 | ContextLoaderListener - это ServletContextListener, который инициализируется когда ваше web-приложение стартует. По-умолчанию оно загружает файл WEBINF/applicationContext.xml. Вы можете изменить значение по-умолчанию, указав параметр contextConfigLocation. Пример: |
||
410 | |||
411 | {{dmsf_image(285)}} |
||
412 | 1 | Александр Александров | |
413 | h3. Что такое контроллер в Spring MVC? |
||
414 | |||
415 | 4 | Александр Александров | Ключевым интерфейсом в Spring MVC является Controller. Контроллер обрабатывает запросы к действиям, осуществляемые пользователями в пользовательском интерфейсе, взаимодействуя с уровнем обслуживания, обновляя модель и направляя пользователей на соответствующие представления в зависимости от результатов выполнения. Controller - управление, связь между моделью и видом. |
416 | |||
417 | {{dmsf_image(286)}} |
||
418 | |||
419 | Основным контроллером в Spring MVC является org.springframework.web.servlet.DispatcherServlet. Задается аннотацией @Controller и часто используется с аннотацией @RequestMapping, которая указывает какие запросы будут обрабатываться этим контроллером. |
||
420 | |||
421 | 1 | Александр Александров | h3. Какая разница между аннотациями @Component, @Repository и @Service в Spring? |
422 | |||
423 | 4 | Александр Александров | * @Component - используется для указания класса в качестве компонента spring. При использовании поиска аннотаций, такой класс будет сконфигурирован как spring bean. |
424 | * @Controller - специальный тип класса, применяемый в MVC приложениях. Обрабатывает запросы и часто используется с аннотацией @RequestMapping. |
||
425 | * @Repository - указывает, что класс используется для работы с поиском, получением и хранением данных. Аннотация может использоваться для реализации шаблона DAO. |
||
426 | * @Service - указывает, что класс является сервисом для реализации бизнес логики (на самом деле не отличается от Component, но просто помогает разработчику указать смысловую нагрузку класса). |
||
427 | |||
428 | Для указания контейнеру на класс-бин можно использовать любую из этих аннотаций. Но различные имена позволяют различать назначение того или иного класса. |
||
429 | |||
430 | 1 | Александр Александров | h3. Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener. |
431 | |||
432 | 4 | Александр Александров | DispatcherServlet - сервлет диспатчер. Этот сервлет анализирует запросы и направляет их соответствующему контроллеру для обработки. В Spring MVC класс DispatcherServlet является центральным сервлетом, который получает запросы и направляет их соответствующим контроллерам. В приложении Spring MVC может существовать произвольное количество экземпляров DispatcherServlet, предназначенных для разных целей (например, для обработки запросов пользовательского интерфейса, запросов веб-служб REST и т.д.). Каждый экземпляр DispatcherServlet имеет собственную конфигурацию WebApplicationContext, которая сервлет, отображение обработчиков, распознавание представлений, интернационализация, оформление темами, проверка достоверности, преобразование типов и форматирование и т.п. |
433 | |||
434 | ContextLoaderListener - слушатель при старте и завершении корневого класса Spring WebApplicationContext. Основным назначением является связывание жизненного цикла ApplicationContext и ServletContext, а так же автоматического создания ApplicationContext. Можно использовать этот класс для доступа к бинам из различных контекстов спринг. Настраивается в web.xml: |
||
435 | |||
436 | {{dmsf_image(287)}} |
||
437 | |||
438 | 1 | Александр Александров | h3. Что такое ViewResolver в Spring? |
439 | |||
440 | 4 | Александр Александров | ViewResolver - распознаватель представлений. Интерфейс ViewResolver в Spring MVC (из пакета org.springframework.web.servlet) поддерживает распознавание представлений на основе логического имени, возвращаемого контроллером. Для |
441 | поддержки различных механизмов распознавания представлений предусмотрено множество классов реализации. Например, класс UrlBasedViewResolver поддерживает прямое преобразование логических имен в URL. Класс ContentNegotiatingViewResolver поддерживает динамическое распознавание представлений в зависимости от типа медиа, поддерживаемого клиентом (XML, PDF, JSON и т.д.). Существует также несколько реализаций для интеграции с различными технологиями представлений, такими как FreeMarker (FreeMarkerViewResolver), Velocity (VelocityViewResolver) и JasperReports (JasperReportsViewResolver). |
||
442 | |||
443 | {{dmsf_image(288)}} |
||
444 | |||
445 | InternalResourceViewResolver - реализация ViewResolver, которая позволяет находить представления, которые возвращает контроллер для последующего перехода к нему. Ищет по заданному пути, префиксу, суффиксу и имени. |
||
446 | |||
447 | 1 | Александр Александров | h3. Что такое MultipartResolver и когда его использовать? |
448 | |||
449 | 4 | Александр Александров | Интерфейс MultipartResolver используется для загрузки файлов. Существуют две реализации: CommonsMultipartResolver и StandardServletMultipartResolver, которые позволяют фреймворку загружать файлы. По умолчанию этот интерфейс не включается в приложении и необходимо указывать его в файле конфигурации. После настройки любой запрос о загрузке будет отправляться этому интерфейсу. |
450 | |||
451 | {{dmsf_image(289)}} |
||
452 | |||
453 | 1 | Александр Александров | h3. Как загрузить файл в Spring MVC? |
454 | |||
455 | 4 | Александр Александров | Внутри спринг предусмотрен интерфейс MultipartResolver для обеспечения загрузки файлов. Фактически нужно настроить файл конфигурации для указания обработчика загрузки файлов, а затем задать необходимый метод в контроллере spring. |
456 | |||
457 | 1 | Александр Александров | h3. Как обрабатывать исключения в Spring MVC Framework? |
458 | |||
459 | 4 | Александр Александров | В Spring MVC интерфейс HandlerExceptionResolver (из пакета org.springframework.web.servlet) предназначен для работы с непредвиденными исключениями, возникающими во время выполнения обработчиков. По умолчанию DispatcherServlet регистрирует класс DefaultHandlerExceptionResolver (из пакета org.springframework.web.servlet.mvc.support). Этот распознаватель обрабатывает определенные стандартные исключения Spring MVC, устанавливая специальный код состояния ответа. Можно также реализовать собственный обработчик исключений, аннотировав метод контроллера с помощью аннотации @ExceptionHandler и передав ей в качестве атрибута тип исключения. В общем случае обработку исключений можно |
460 | описать таким образом: |
||
461 | |||
462 | Controller Based - указать методы для обработки исключения в классе контроллере. Для этого нужно пометить такие методы аннотацией @ExceptionHandler. |
||
463 | Global Exception Handler - для обработки глобальных исключений spring предоставляет аннотацию @ControllerAdvice. |
||
464 | HandlerExceptionResolver implementation – общие исключений большая часть времени обслуживают статические страницы. Spring Framework предоставляет интерфейс HandlerExceptionResolver, который позволяет задать глобального обработчика исключений. Реализацию этого интерфейса можно использовать для создания собственных глобальных обработчиков исключений в приложении |
||
465 | |||
466 | 1 | Александр Александров | h3. Каковы минимальные настройки, чтобы создать приложение Spring MVC? |
467 | |||
468 | 4 | Александр Александров | Для создания простого Spring MVC приложения необходимо пройти следующие шаги: |
469 | |||
470 | * Добавить зависимости spring-context и spring-webmvc в проект. |
||
471 | * Указать DispatcherServlet в web.xml для обработки запросов внутри приложения. |
||
472 | * Задать определение spring bean (аннотацией или в xml). |
||
473 | * Добавить определение view resolver для представлений. |
||
474 | * Настроить класс контроллер для обработки клиентских запросов. |
||
475 | |||
476 | 1 | Александр Александров | h3. Как бы вы связали Spring MVC Framework и архитектуру MVC? |
477 | |||
478 | 4 | Александр Александров | Модель (Model) - выступает любой Java bean в Spring. Внутри класса могут быть заданы различные атрибуты и свойства для использования в представлении. Преставление (View) - JSP страница, HTML файл и т.п. служат для отображения необходимой информации пользователю. Представление передает обработку запросов к диспетчеру сервлетов (контроллеру). DispatcherServlet (Controller) - это главный контроллер в приложении Spring MVC, который обрабатывает все входящие запросы и передает их для обработки в различные методы в контроллеры. |
479 | |||
480 | 1 | Александр Александров | h3. Как добиться локализации в приложениях Spring MVC? |
481 | |||
482 | 4 | Александр Александров | Spring MVC предоставляет очень простую и удобную возможность локализации приложения. Для этого необходимо сделать следующее: |
483 | |||
484 | * Создать файл resource bundle, в котором будут заданы различные варианты локализированной информации. |
||
485 | * Определить messageSource в конфигурации Spring используя классы ResourceBundleMessageSource или ResourceBundleMessageSource. |
||
486 | * Определить localceResolver класса CookieLocaleResolver для включения возможности переключения локали. |
||
487 | * С помощью элемента spring:message DispatcherServlet будет определять в каком месте необходимо подставлять локализированное сообщение в ответе. |
||
488 | |||
489 | {{dmsf_image(290)}} |
||
490 | |||
491 | 1 | Александр Александров | h3. Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON? |
492 | |||
493 | 4 | Александр Александров | Spring Framework позволяет создавать Resful веб сервисы и возвращать данные в формате JSON. Spring обеспечивает интеграцию с Jackson JSON API для возможности отправки JSON ответов в resful web сервисе. Для отправки ответа в формате JSON из Spring MVC приложения необходимо произвести следующие настройки. |
494 | |||
495 | Добавить зависимости Jackson JSON. С помощью maven это делается так: |
||
496 | |||
497 | {{dmsf_image(291)}} |
||
498 | |||
499 | Настроить бин RequestMappingHandlerAdapter в файле конфигурации Spring и задать свойство messageConverters на использование бина |
||
500 | |||
501 | {{dmsf_image(292)}} |
||
502 | |||
503 | В контроллере указать с помощью аннотации @ResponseBody возвращение Object: |
||
504 | |||
505 | {{dmsf_image(293)}} |
||
506 | |||
507 | 1 | Александр Александров | h3. Как проверить (валидировать) данные формы в Spring Web MVC Framework? |
508 | |||
509 | 4 | Александр Александров | Spring поддерживает аннотации валидации из JSR-303, а так же возможность создания своих реализаций классов валидаторов. Пример использования аннотаций: |
510 | |||
511 | {{dmsf_image(294)} |
||
512 | |||
513 | 1 | Александр Александров | h3. Что вы знаете Spring MVC Interceptor и как он используется? |
514 | |||
515 | 4 | Александр Александров | Перехватчики в Spring (Spring Interceptor) являются аналогом Servlet Filter и позволяют перехватывать запросы клиента и обрабатывать их. Перехватить запрос клиента можно в трех местах: preHandle, postHandle и afterCompletion. |
516 | |||
517 | * preHandle - метод используется для обработки запросов, которые еще не были переданы в метода обработчик контроллера. Должен вернуть true для передачи следующему перехватчику или в handler method. False укажет на обработку запроса самим обработчиком и отсутствию необходимости передавать его дальше. Метод имеет возможность выкидывать исключения и пересылать ошибки к представлению. |
||
518 | * postHandle - вызывается после handler method, но до обработки DispatcherServlet для передачи представлению. Может использоваться для добавления параметров в объект ModelAndView. |
||
519 | * afterCompletion - вызывается после отрисовки представления. |
||
520 | |||
521 | Для создания обработчика необходимо расширить абстрактный класс HandlerInterceptorAdapter или реализовать интерфейс HandlerInterceptor. Так же нужно указать перехватчики в конфигурационном файле Spring. |
||
522 | |||
523 | {{dmsf_image(295)} |
||
524 | |||
525 | 1 | Александр Александров | h3. Расскажите о Spring Security. |
526 | 4 | Александр Александров | |
527 | Проект Spring Security предоставляет широкие возможности для защиты приложения. Кроме стандартных настроек для аутентификации, авторизации и распределения ролей и маппинга доступных страниц, ссылок и т.п., предоставляет защиту от различных вариантов атак (например CSRF). Имеет множество различных настроек, но остается легким в использовании. |