From 66b6a942a53d6b6cc9df22ededee79ddc66929af Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Sat, 10 Jul 2021 15:40:04 +0400 Subject: [PATCH 01/10] Update README.md --- README.md | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7065c6c..acd6520 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ + [Основы CSS](#Основы-css) ![icon][done] + [Основы Web](#Основы-web) ![icon][done] + [Дополнительные материалы](#Дополнительные-материалы) ![icon][done] - ++ [Spring](#Spring) ![icon][done] [done]:done.png ## ООП @@ -754,6 +754,53 @@ + [Top Spring Framework Interview Questions](https://www.baeldung.com/spring-interview-questions) + [Spring Interview Questions](https://www.interviewbit.com/spring-interview-questions/) +## Spring +1. Расскажите о Spring Framework. +2. Какие некоторые из важных особенностей и преимуществ Spring Framework? +3. Что вы понимаете под Dependency Injection (DI)? +4. Как реализуется DI в Spring Framework? +5. Какие преимущества использования Spring Tool Suite? +6. Приведите названия некоторых важных Spring модулей. +7. Что вы понимаете под аспектно-ориентированным программированием (Aspect Oriented Programming — AOP)? +8. Что такое Aspect, Advice, Pointcut, JoinPoint и Advice Arguments в АОП? +9. В чем разница между Spring AOP и AspectJ АОП? +10. Что такое IoC контейнер Spring? +11. Что такое Spring бин? +12. Какое значение имеет конфигурационный файл Spring Bean? +13. Какие различные способы настроить класс как Spring Bean? +14. Какие вы знаете различные scope у Spring Bean? +15. Что такое жизненный цикл Spring Bean? +16. Как получить объекты ServletContext и ServletConfig внутри Spring Bean? +17. Что такое связывание в Spring и расскажите об аннотации @Autowired? +18. Какие различные типы автоматического связывания в Spring? +19. Является ли Spring бин потокобезопасным? +20. Что такое контроллер в Spring MVC? +21. Какая разница между аннотациями @Component, @Repository и @Service в Spring? +22. Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener. +23. Что такое ViewResolver в Spring? +24. Что такое MultipartResolver и когда его использовать? +25. Как обрабатывать исключения в Spring MVC Framework? +26. Как создать ApplicationContext в программе Java? +27. Можем ли мы иметь несколько файлов конфигурации Spring? +28. Какие минимальные настройки, чтобы создать приложение Spring MVC? +29. Как бы вы связали Spring MVC Framework и архитектуру MVC? +30. Как добиться локализации в приложениях Spring MVC? +31. 31. Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON? +32. Приведите пример часто используемых аннотаций Spring. +33. Можем ли мы послать объект как ответ метода обработчика контроллера? +34. Как загрузить файл в Spring MVC? +35. Как проверить (валидировать) данные формы в Spring Web MVC Framework? +36. Что вы знаете Spring MVC Interceptor и как он используется? +37. Spring JdbcTemplate класс и его применение. +38. Как использовать Tomcat JNDI DataSource в веб-приложении Spring? +39. Каким образом можно управлять транзакциями в Spring? +40. Расскажите о Spring DAO. +41. Как интегрировать Spring и Hibernate? +42. Расскажите о Spring Security. +43. Как внедрить java.util.Properties в Spring Bean? +44. Назовите некоторые из шаблонов проектирования, используемых в Spring Framework? +45. Best Practices в Spring Framework. + [к оглавлению](#Вопросы-для-собеседования-на-java-developer) ## Источники From 2f20b5bcde6b094ebf37b2cfc8fd9422743bc53d Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Sat, 10 Jul 2021 15:47:42 +0400 Subject: [PATCH 02/10] Create spring.md --- spring.md | 407 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 407 insertions(+) create mode 100644 spring.md diff --git a/spring.md b/spring.md new file mode 100644 index 0000000..1787aef --- /dev/null +++ b/spring.md @@ -0,0 +1,407 @@ +### 1. Расскажите о Spring Framework. +Spring Framework (или коротко Spring) — универсальный фреймворк с открытым исходным кодом для Java-платформы. Несмотря на то, что Spring Framework не обеспечивает какую-либо конкретную модель программирования, он стал широко распространённым в Java-сообществе главным образом как альтернатива и замена модели Enterprise JavaBeans. Spring Framework предоставляет бо́льшую свободу Java-разработчикам в проектировании; кроме того, он предоставляет хорошо документированные и лёгкие в использовании средства решения проблем, возникающих при создании приложений корпоративного масштаба. Обычно Spring описывают как облегченную платформу для построения Java-приложений, но с этим утверждением связаны два интересных момента. Во-первых, Spring можно использовать для построения любого приложения на языке Java (т.е. автономных, веб приложений, приложений JEE и т.д.), что отличает Spring от многих других платформ, таких как Apache Struts, которая ограничена только веб-приложениями. Во-вторых, характеристика “облегченная” в действительности не имеет никакого отношения к количеству классов или размеру дистрибутива; напротив, она определяет принцип всей философии Spring — минимальное воздействие. Платформа Spring является облегченной в том смысле, что для использования ядра Spring вы должны вносить минимальные (если вообще какие-либо) изменения в код своего приложения, а если в какой-то момент вы решите больше не пользоваться Spring, то и это сделать очень просто. Обратите внимание, что речь идет только о ядре Spring — многие дополнительные компоненты Spring, такие как доступ к +данным, требуют более тесной привязки к Spring Framework. + +### 2. Какие некоторые из важных особенностей и преимуществ Spring Framework? +Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности. + +Spring Framework, вероятно, наиболее известен как источник расширений (features), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности. Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java. Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести: + +Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения. +Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д.. +Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска). +Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения. +### 3. Что вы понимаете под Dependency Injection (DI)? +Внедрение зависимости (Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» ( Inversion of control, IoC), когда она применяется к управлению зависимостями. В полном соответствии с принципом единой обязанности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму. К достоинствам применения DI можно отнести: + +Сокращение объема связующего кода. Одним из самых больших плюсов DI является возможность значительного сокращения объема кода, который должен быть написан для связывания вместе различных компонентов приложения. Зачастую этот код очень прост — при создании зависимости должен создаваться новый экземпляр соответствующего объекта. +Упрощенная конфигурация приложения. За счет применения DI процесс конфигурирования приложения значительно упрощается. Для конфигурирования классов, которые могут быть внедрены в другие классы, можно использовать аннотации или XML-файлы. +Возможность управления общими зависимостями в единственном репозитории. При традиционном подходе к управлению зависимостями в общих службах, к которым относятся, например, подключение к источнику данных, транзакция, удаленные службы и т.п., вы создаете экземпляры (или получаете их из определенных фабричных классов) зависимостей там, где они нужны — внутри зависимого класса. Это приводит к распространению зависимостей по множеству классов в приложении, что может затруднить их изменение. В случае использования DI вся информация об общих зависимостях содержится в единственном репозитории (в Spring есть возможность хранить эту информацию в XML-файлах или Java классах), что существенно упрощает управление зависимостями и снижает количество возможных ошибок. +Улучшенная возможность тестирования. Когда классы проектируются для DI, становится возможной простая замена зависимостей. Это особенно полезно при тестировании приложения. +Стимулирование качественных проектных решений для приложений. Вообще говоря, проектирование для DI означает проектирование с использованием интерфейсов. Используя Spring, вы получаете в свое распоряжение целый ряд средств DI и можете сосредоточиться на построении логики приложения, а не на поддерживающей DI платформе. +### 4. Как реализуется DI в Spring Framework? +Реализация DI в Spring основана на двух ключевых концепциях Java — компонентах JavaBean и интерфейсах. При использовании Spring в качестве поставщика DI вы получаете гибкость определения конфигурации зависимостей внутри своих приложений разнообразными путями (т.е. внешне в XML-файлах, с помощью конфигурационных Java классов Spring или посредством аннотаций Java в коде). Компоненты JavaBean (также называемые POJO (Plain Old Java Object — простой старый объект Java)) предоставляют стандартный механизм для создания ресурсов Java, которые являются конфигурируемыми множеством способов. За счет применения DI объем кода, который необходим при проектировании приложения на основе интерфейсов, снижается почти до нуля. Кроме того, с помощью интерфейсов можно получить максимальную отдачу от DI, потому что бины могут использовать любую реализацию интерфейса для удовлетворения их зависимости. + +К типам реализации внедрения зависимостей в Spring относят: + +Constructor Dependency Injection — это тип внедрения зависимостей, при котором зависимости компонента предоставляются ему в его конструкторе (или конструкторах). + +public class ConstructorInjection { + +private Dependency dependency; + + public ConstructorInjection(Dependency dependency) { + this.dependency = dependency; + } +} + +public class ConstructorInjection { + +private Dependency dependency; + + public ConstructorInjection(Dependency dependency) { + this.dependency = dependency; + } +} +Setter Dependency Injection – контейнер IoC внедряет зависимости компонента в компонент через методы установки в стиле JavaBean. + +public class SetterInjection { +private Dependency dependency; + public void setDependency(Dependency dependency) { + this.dependency = dependency; + } +} + +public class SetterInjection { +private Dependency dependency; + public void setDependency(Dependency dependency) { + this.dependency = dependency; + } +} +### 5. Какие преимущества использования Spring Tool Suite? +Для упрощения процесса разработки основанных на Spring приложений в Eclipse (наиболее часто используемая бесплатная IDE-среда для разработки Java-приложений), в рамках Spring создан проект Spring IDE. Проект бесплатный. Он интегрирован в Eclipse IDE, Spring IDE, Mylyn (среда разработки в Eclipse, основанная на задачах), Maven for Eclipse, AspectJ Development Tool. + +### 6. Приведите названия некоторых важных Spring модулей. +Inversion of Control-контейнер: конфигурирование компонентов приложений и управление жизненным циклом Java-объектов. +Фреймворк аспектно-ориентированного программирования: работает с функциональностью, которая не может быть реализована возможностями объектно-ориентированного программирования на Java без потерь. +Фреймворк доступа к данным: работает с системами управления реляционными базами данных на Java-платформе, используя JDBC- и ORM-средства и обеспечивая решения задач, которые повторяются в большом числе Java-based environments. +Фреймворк управления транзакциями: координация различных API управления транзакциями и инструментарий настраиваемого управления транзакциями для объектов Java. +Фреймворк MVC: каркас, основанный на HTTP и сервлетах, предоставляющий множество возможностей для расширения и настройки (customization). +Фреймворк удалённого доступа: конфигурируемая передача Java-объектов через сеть в стиле RPC, поддерживающая RMI, CORBA,HTTP-based протоколы, включая web-сервисы (SOAP). +Фреймворк аутентификации и авторизации: конфигурируемый инструментарий процессов аутентификации и авторизации, поддерживающий много популярных и ставших индустриальными стандартами протоколов, инструментов, практик через дочерний проект Spring Security (ранее известный как Acegi). +Фреймворк удалённого управления: конфигурируемое представление и управление Java-объектами для локальной или удалённой конфигурации с помощью JMX. +Фреймворк работы с сообщениями: конфигурируемая регистрация объектов-слушателей сообщений для прозрачной обработки сообщений из очереди сообщений с помощью JMS, улучшенная отправка сообщений по стандарту JMS API. +Тестирование: каркас, поддерживающий классы для написания модульных и интеграционных тестов. +### 7. Что вы понимаете под аспектно-ориентированным программированием (Aspect Oriented Programming — AOP)? +Аспектно-ориентированное программирование (АОП) — это одна из “моделей программирования текущего момента” в мире Java. АОП предоставляет возможность реализации сквозной логики — т.е. логики, которая применяется к множеству частей приложения — в одном месте и обеспечения автоматического применения этой логики по всему приложению. Подход Spring к АОП заключается в создании “динамических прокси” для целевых объектов и “привязывании” объектов к конфигурированному совету для выполнения сквозной логики. + +### 8. Что такое Aspect, Advice, Pointcut, JoinPoint и Advice Arguments в АОП? +Точки соединения. Точка соединения (joinpoint) — это четко определенная точка во время выполнения приложения. Типовые примеры точек соединения включают обращение к методу, собственно Method Invocation, инициализацию класса и создание экземпляра объекта. Точки соединения являются ключевой концепцией АОП и определяют места в приложении, в которые можно вставлять дополнительную логику с использованием АОП. +Советы (advice). Фрагмент кода, который должен выполняться в отдельной точке соединения, представляет собой совет (advice). Существует несколько типов советов, среди которых перед, когда совет выполняется до точки соединения, и после, когда совет выполняется после точки соединения. В ООП совет принимает форму метода внутри класса. +Срезы. Срез (pointcut) — это коллекция точек соединения, которая используется для определения ситуации, когда совет должен быть выполнен. Создавая срезы, вы получаете точный контроль над тем, как применять совет к компонентам приложения. Как упоминалось ранее, типичной точкой соединения является Method Invocation. А типичный срез представляет собой коллекцию всех точек соединения Method Invocation в отдельном классе. Часто между срезами можно установить сложные отношения, чтобы обеспечить дополнительные ограничения на то, когда будет выполнен совет. +Аспекты. Аспект (aspect) — это комбинация совета и срезов. Такая комбинация дает в результате определение логики, которая должна быть включена в приложение, и указание мест, где она должна выполняться. +Связывание. Связывание (weaving) представляет собой процесс действительной вставки аспектов в определенную точку кода приложения. Для решений АОП времени компиляции это делается на этапе компиляции, обычно в виде дополнительного шага процесса сборки. Аналогично, для решений АОП времени выполнения связывание происходит динамически во время выполнения. В AspectJ поддерживается еще один механизм связывания под названием связывание во время загрузки (load-time weaving — LTW), который перехватывает лежащий в основе загрузчик классов JVM и обеспечивает связывание с байт-кодом, когда он загружается загрузчиком классов. +Цель. Цель (target) — это объект, поток выполнения которого изменяется каким-то процессом АОП. На целевой объект часто ссылаются как на объект, снабженный советом. +Введение. Введение (introduction) представляет собой процесс, посредством которого можно изменить структуру объекта за счет введения в него дополнительных методов или полей. Введение можно использовать для обеспечения реализации любым объектом определенного интерфейса без необходимости в том, чтобы класс этого объекта реализовывал такой интерфейс явно. +### 9. В чем разница между Spring AOP и AspectJ АОП? +AspectJ де-факто является стандартом реализации АОП. Реализация АОП от Spring имеет некоторые отличия: + +Spring AOP немного проще, т.к. нет необходимости следить за процессом связывания. +Spring AOP поддерживает аннотации AspectJ, таким образом мы можем работать в спринг проекте похожим образом с AspectJ проектом. +Spring AOP поддерживает только proxy-based АОП и может использовать только один тип точек соединения – Method Invocation. AspectJ поддерживает все виды точек соединения. +Недостатком Spring AOP является работа только со своими бинами, которые существуют в Spring Context. +### 10. Что такое IoC контейнер Spring? +По своей сути IoC, а, следовательно, и DI, направлены на то, чтобы предложить простой механизм для предоставления зависимостей компонента (часто называемых коллабораторами объекта) и управления этими зависимостями на протяжении всего их жизненного цикла. Компонент, который требует определенных зависимостей, зачастую называют зависимым объектом или, в случае IoC, целевым объектом. Вполне уместно сейчас заявить, что IoC предоставляет службы, через которые компоненты могут получать доступ к своим зависимостям, и службы для взаимодействия с зависимостями в течение их времени жизни. В общем случае IoC может быть расщеплена на два подтипа: инверсия управления (Dependency Injection) и поиск зависимости (Dependency Lookup). Инверсия управления — это крупная часть того, делает Spring, и ядро реализации Spring основано на инверсии управления, хотя также предоставляются и средства Dependency Lookup. Когда платформа Spring предоставляет коллабораторы зависимому объекту автоматически, она делает это с использованием инверсии управления (Dependency Injection). В приложении, основанном на Spring, всегда предпочтительнее применять Dependency Injection для передачи коллабораторов зависимым объектам вместо того, чтобы заставлять зависимые объекты получать коллабораторы через поиск. + +### 11. Что такое Spring бин? +Термин бин в Spring используется для ссылки на любой компонент, управляемый контейнером. Обычно бины на определенном уровне придерживаются спецификации JavaBean, но это не обязательно особенно если для связывания бинов друг с другом планируется применять Constructor Injection. Для получения экземпляра бина используется ApplicationContext. IoC контейнер управляет жизненным циклом спринг бина, областью видимости и внедрением. + +### 12. Какое значение имеет конфигурационный файл Spring Bean? +Конфигурационный файл спринг определяет все бины, которые будут инициализированы в Spring Context. При создании экземпляра Spring ApplicationContext будет прочитан конфигурационный xml файл и выполнены указанные в нем необходимые инициализации. Отдельно от базовой конфигурации, в файле могут содержаться описание перехватчиков (interceptors), view resolvers, настройки локализации и др.. + +### 13. Какие различные способы настроить класс как Spring Bean? +Существует несколько способов работы с классами в Spring: + +XML конфигурация: + + +1 + +Java based конфигурация. Все настройки и указания бинов прописываются в java коде: + +@Configuration +@ComponentScan(value="ru.javastudy.spring.main") +public class MyConfiguration { + + @Bean + public MyService getService(){ + return new MyService(); + } +} + +@Configuration +@ComponentScan(value="ru.javastudy.spring.main") +public class MyConfiguration { + + @Bean + public MyService getService(){ + return new MyService(); + } +} +Для извлечения бина из контекста используется следующий подход: + +AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( + MyConfiguration.class); +MyService service = ctx.getBean(MyService.class); + +AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( + MyConfiguration.class); +MyService service = ctx.getBean(MyService.class); +Annotation based конфигурация. Можно использовать внутри кода аннотации @Component, @Service, @Repository, @Controller для указания классов в качестве спринг бинов. Для их поиска и управления контейнером прописывается настройка в xml файле: + + +1 + +### 14. Какие вы знаете различные scope у Spring Bean? +В Spring предусмотрены различные области времени действия бинов: + +singleton – может быть создан только один экземпляр бина. Этот тип используется спрингом по умолчанию, если не указано другое. Следует осторожно использовать публичные свойства класса, т.к. они не будут потокобезопасными. +prototype – создается новый экземпляр при каждом запросе. +request – аналогичен prototype, но название служит пояснением к использованию бина в веб приложении. Создается новый экземпляр при каждом HTTP request. +session – новый бин создается в контейнере при каждой новой HTTP сессии. +global-session: используется для создания глобальных бинов на уровне сессии для Portlet приложений. +### 15. Что такое жизненный цикл Spring Bean? +Жизненный цикл Spring бина – время существования класса. Spring бины инициализируются при инициализации Spring контейнера и происходит внедрение всех зависимостей. Когда контейнер уничтожается, то уничтожается и всё содержимое. Если нам необходимо задать какое-либо действие при инициализации и уничтожении бина, то нужно воспользоваться методами init() и destroy(). Для этого можно использовать аннотации @PostConstruct и @PreDestroy(). + + @PostConstruct + public void init(){ + System.out.println("Bean init method called"); + } + + + @PreDestroy + public void destroy(){ + System.out.println("Bean destroy method called"); + } + + @PostConstruct + public void init(){ + System.out.println("Bean init method called"); + } + + + @PreDestroy + public void destroy(){ + System.out.println("Bean destroy method called"); + } +Или через xml конфигурацию: + + + + + + + + +### 16. Как получить объекты ServletContext и ServletConfig внутри Spring Bean? +Доступны два способа для получения основных объектов контейнера внутри бина: + +Реализовать один из Spring*Aware (ApplicationContextAware, ServletContextAware, ServletConfigAware и др.) интерфейсов. +Использовать автоматическое связывание @Autowired в спринг. Способ работает внутри контейнера спринг. +@Autowired +ServletContext servletContext; +1 +2 +@Autowired +ServletContext servletContext; +### 17. Что такое связывание в Spring и расскажите об аннотации @Autowired? +Процесс внедрения зависимостей в бины при инициализации называется Spring Bean Wiring. Считается хорошей практикой задавать явные связи между зависимостями, но в Spring предусмотрен дополнительный механизм связывания @Autowired. Аннотация может использоваться над полем или методом для связывания по типу. Чтобы аннотация заработала, необходимо указать небольшие настройки в конфигурационном файле спринг с помощью элемента context:annotation-config. + +### 18. Какие различные типы автоматического связывания в Spring? +Существует четыре вида связывания в спринг: + +autowire byName, +autowire byType, +autowire by constructor, +autowiring by @Autowired and @Qualifier annotations +### 19. Является ли Spring бин потокобезопасным? +По умолчанию бин задается как синглтон в Spring. Таким образом все публичные переменные класса могут быть изменены одновременно из разных мест. Так что – нет, не является. Однако поменяв область действия бина на request, prototype, session он станет потокобезопасным, но это скажется на производительности. + +### 20. Что такое контроллер в Spring MVC? +Ключевым интерфейсом в Spring MVC является Controller. Контроллер обрабатывает запросы к действиям, осуществляемые пользователями в пользовательском интерфейсе, взаимодействуя с уровнем обслуживания, обновляя модель и направляя пользователей на соответствующие представления в зависимости от результатов выполнения. Controller — управление, связь между моделью и видом. + +Dispatcher-servlet-diagram + +Основным контроллером в Spring MVC является org.springframework.web.servlet.DispatcherServlet. Задается аннотацией @Controller и часто используется с аннотацией @RequestMapping, которая указывает какие запросы будут обрабатываться этим контроллером. + +Читайте так же – Spring MVC — основные понятия, архитектура. + +### 21. Какая разница между аннотациями @Component, @Repository и @Service в Spring? +@Component используется для указания класса в качестве компонента спринг. При использовании поиска аннотаций, такой класс будет сконфигурирован как spring bean. + +@Controller специальный тип класса, применяемый в MVC приложениях. Обрабатывает запросы и часто используется с аннотацией @RequestMapping. + +@Repository указывает, что класс используется для работы с поиском, получением и хранением данных. Аннотация может использоваться для реализации шаблона DAO. + +@Service указывает, что класс является сервисом для реализации бизнес логики (на самом деле не отличается от Component, но просто помогает разработчику указать смысловую нагрузку класса). + +Для указания контейнеру на класс-бин можно использовать любую из этих аннотаций. Но различные имена позволяют различать назначение того или иного класса. + +### 22. Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener. +DispatcherServlet – сервлет диспетчера. Этот сервлет анализирует запросы и направляет их соответствующему контроллеру для обработки. В Spring MVC класс DispatcherServlet является центральным сервлетом, который получает запросы и направляет их соответствующим контроллерам. В приложении Spring MVC может существовать произвольное количество экземпляров DispatcherServlet, предназначенных для разных целей (например, для обработки запросов пользовательского интерфейса, запросов веб-служб REST и т.д.). Каждый экземпляр DispatcherServlet имеет собственную конфигурацию WebApplicationContext, которая определяет характеристики уровня сервлета, такие как контроллеры, поддерживающие сервлет, отображение обработчиков, распознавание представлений, интернационализация, оформление темами, проверка достоверности, преобразование типов и форматирование и т.п. + +ContextLoaderListener – слушатель при старте и завершении корневого класса Spring WebApplicationContext. Основным назначением является связывание жизненного цикла ApplicationContext и ServletContext, а так же автоматического создания ApplicationContext. Можно использовать этот класс для доступа к бинам из различных контекстов спринг. Настраивается в web.xml: + + + contextConfigLocation + /WEB-INF/spring/root-context.xml + + + + org.springframework.web.context.ContextLoaderListener + + + + contextConfigLocation + /WEB-INF/spring/root-context.xml + + + + org.springframework.web.context.ContextLoaderListener + +### 23. Что такое ViewResolver в Spring? +ViewResolver – распознаватель представлений. Интерфейс ViewResolver в Spring MVC (из пакета org.springframework.web.servlet) поддерживает распознавание представлений на основе логического имени, возвращаемого контроллером. Для поддержки различных механизмов распознавания представлений предусмотрено множество классов реализации. Например, класс UrlBasedViewResolver поддерживает прямое преобразование логических имен в URL. Класс ContentNegotiatingViewResolver поддерживает динамическое распознавание представлений в зависимости от типа медиа, поддерживаемого клиентом (XML, PDF, JSON и т.д.). Существует также несколько реализаций для интеграции с различными технологиями представлений, такими как FreeMarker (FreeMarkerViewResolver), Velocity (VelocityViewResolver) и JasperReports (JasperReportsViewResolver). + + + + + + + + + + + + +InternalResourceViewResolver – реализация ViewResolver, которая позволяет находить представления, которые возвращает контроллер для последующего перехода к нему. Ищет по заданному пути, префиксу, суффиксу и имени. + +Дополнительная информация – Spring MVC — описание интерфейса ViewResolver. + +### 24. Что такое MultipartResolver и когда его использовать? +Интерфейс MultipartResolver используется для загрузки файлов. Существуют две реализации: CommonsMultipartResolver и StandardServletMultipartResolver, которые позволяют фреймворку загружать файлы. По умолчанию этот интерфейс не включается в приложении и необходимо указывать его в файле конфигурации. После настройки любой запрос о загрузке будет отправляться этому интерфейсу. + + + + + + + + + + + + + + +Пример – Spring MVC — загрузка файла + +### 25. Как обрабатывать исключения в Spring MVC Framework? +В Spring MVC интерфейс HandlerExceptionResolver (из пакета org.springframework.web.servlet) предназначен для работы с непредвиденными исключениями, возникающими во время выполнения обработчиков. По умолчанию DispatcherServlet регистрирует класс DefaultHandlerExceptionResolver (из пакета org.springframework.web.servlet.mvc.support). Этот распознаватель обрабатывает определенные стандартные исключения Spring MVC, устанавливая специальный код состояния ответа. Можно также реализовать собственный обработчик исключений, аннотировав метод контроллера с помощью аннотации @ExceptionHandler и передав ей в качестве атрибута тип исключения. В общем случае обработку исключений можно описать таким образом: + +Controller Based – указать методы для обработки исключения в классе контроллера. Для этого нужно пометить такие методы аннотацией @ExceptionHandler. + +Global Exception Handler – для обработки глобальных исключений спринг предоставляет аннотацию @ControllerAdvice. + +HandlerExceptionResolver implementation – Spring Framework предоставляет интерфейс HandlerExceptionResolver, который позволяет задать глобального обработчика исключений. Реализацию этого интерфейса можно использовать для создания собственных глобальных обработчиков исключений в приложении. + +### 26. Как создать ApplicationContext в программе Java? +В независимой Java программе ApplicationContext можно создать следующим образом: + +AnnotationConfigApplicationContext: при использовании Spring в качестве автономного приложения можно создать, инициализировать контейнер с помощью аннотаций. +ClassPathXmlApplicationContext: второй подход использует xml файл, в котором задаются необходимые настройки, а затем используем класс для загрузки файла и получения объекта контейнера. +FileSystemXmlApplicationContext: аналогичен варианту с xml, но с возможностью загрузки файла конфигурации из любого места файловой системы. +### 27. Можем ли мы иметь несколько файлов конфигурации Spring? +С помощью указания contextConfigLocation можно задать несколько файлов конфигурации Spring. Параметры указываются через запятую или пробел: + + + appServlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + /WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml + + 1 + + + + appServlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + /WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml + + 1 + +Поддерживается возможность указания нескольких корневых файлов конфигурации Spring: + + + contextConfigLocation + /WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml + + + + contextConfigLocation + /WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml + +Файл конфигурации можно импортировать: + + +1 + +### 28. Какие минимальные настройки, чтобы создать приложение Spring MVC? +Для создания простого Spring MVC приложения необходимо пройти следующие шаги: + +Добавить зависимости spring-context и spring-webmvc в проект. +Указать DispatcherServlet в web.xml для обработки запросов внутри приложения. +Задать определение spring bean (аннотацией или в xml). Добавить определение view resolver для представлений. +Настроить класс контроллер для обработки клиентских запросов. +Смотрите пример Spring MVC — Hello World, пример приложения. + +### 29. Как бы вы связали Spring MVC Framework и архитектуру MVC? +Моделью (Model) выступает любой Java bean в Spring. Внутри класса могут быть заданы различные атрибуты и свойства для использования в представлении. +Преставление (View) – JSP страница, HTML файл и т.п. служат для отображения необходимой информации пользователю. Представление передает обработку запросов к диспетчеру сервлетов (контроллеру). +DispatcherServlet (Controller) – это главный контроллер в приложении Spring MVC, который обрабатывает все входящие запросы и передает их для обработки в различные методы в контроллеры. +30. Как добиться локализации в приложениях Spring MVC? +Spring MVC предоставляет очень простую и удобную возможность локализации приложения. Для этого необходимо сделать следующее: + +Создать файл resource bundle, в котором будут заданы различные варианты локализированной информации. +Определить messageSource в конфигурации Spring используя классы ResourceBundleMessageSource или ReloadableResourceBundleMessageSource. +Определить localeResolver класса CookieLocaleResolver для включения возможности переключения локали. +С помощью элемента spring:message DispatcherServlet будет определять в каком месте необходимо подставлять локализированное сообщение в ответе. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 1fb4e07f5d280e36faf4d105a0dbaaf2e9dd49c3 Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Sat, 10 Jul 2021 15:52:27 +0400 Subject: [PATCH 03/10] Update spring.md --- spring.md | 339 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 338 insertions(+), 1 deletion(-) diff --git a/spring.md b/spring.md index 1787aef..42a9d5f 100644 --- a/spring.md +++ b/spring.md @@ -359,7 +359,7 @@ FileSystemXmlApplicationContext: аналогичен варианту с xml, Моделью (Model) выступает любой Java bean в Spring. Внутри класса могут быть заданы различные атрибуты и свойства для использования в представлении. Преставление (View) – JSP страница, HTML файл и т.п. служат для отображения необходимой информации пользователю. Представление передает обработку запросов к диспетчеру сервлетов (контроллеру). DispatcherServlet (Controller) – это главный контроллер в приложении Spring MVC, который обрабатывает все входящие запросы и передает их для обработки в различные методы в контроллеры. -30. Как добиться локализации в приложениях Spring MVC? +### 30. Как добиться локализации в приложениях Spring MVC? Spring MVC предоставляет очень простую и удобную возможность локализации приложения. Для этого необходимо сделать следующее: Создать файл resource bundle, в котором будут заданы различные варианты локализированной информации. @@ -405,3 +405,340 @@ Spring MVC предоставляет очень простую и удобну +### 31. Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON? +Spring Framework позволяет создавать Restful веб сервисы и возвращать данные в формате JSON. Spring обеспечивает интеграцию с Jackson JSON API для возможности отправки JSON ответов в restful web сервисе. Для отправки ответа в формате JSON из Spring MVC приложения необходимо произвести следующие настройки: + +Добавить зависимости Jackson JSON. С помощью maven это делается так: + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.databind-version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.databind-version} + +Настроить бин RequestMappingHandlerAdapter в файле конфигурации Spring и задать свойство messageConverters на использование бина MappingJackson2HttpMessageConverter. + + + + + + + + + + + + + + + + + + + + + + + + + +В контроллере указать с помощью аннотации @ResponseBody возвращение Object: +@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET) +public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) { + logger.info("Start getEmployee. ID="+empId); + + return empData.get(empId); +} + +@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET) +public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) { + logger.info("Start getEmployee. ID="+empId); + + return empData.get(empId); +} +### 32. Приведите пример часто используемых аннотаций Spring. +@Controller – класс фронт контроллера в проекте Spring MVC. +@RequestMapping – позволяет задать шаблон маппинга URI в методе обработчике контроллера. +@ResponseBody – позволяет отправлять Object в ответе. Обычно используется для отправки данных формата XML или JSON. +@PathVariable – задает динамический маппинг значений из URI внутри аргументов метода обработчика. +@Autowired – используется для автоматического связывания зависимостей в spring beans. +@Qualifier – используется совместно с @Autowired для уточнения данных связывания, когда возможны коллизии (например одинаковых имен\типов). +@Service – указывает что класс осуществляет сервисные функции. +@Scope – указывает scope у spring bean. +@Configuration, @ComponentScan и @Bean – для java based configurations. +AspectJ аннотации для настройки aspects и advices, @Aspect, @Before, @After,@Around, @Pointcut и др. +### 33. Можем ли мы послать объект как ответ метода обработчика контроллера? +Да, это возможно. Для этого используется аннотация @ResponseBody. Так можно отправлять ответы в виде JSON, XML в restful веб сервисах. + +### 34. Как загрузить файл в Spring MVC? +Внутри спринг предусмотрен интерфейс MultipartResolver для обеспечения загрузки файлов. Фактически нужно настроить файл конфигурации для указания обработчика загрузки файлов, а затем задать необходимый метод в контроллере spring. + +Смотрите пример – Spring MVC — загрузка файла или Spring MVC — загрузка файла с валидацией. + +### 35. Как проверить (валидировать) данные формы в Spring Web MVC Framework? +Spring поддерживает аннотации валидации из JSR-303, а так же возможность создания своих реализаций классов валидаторов. Пример использования аннотаций: + + @Size(min=2, max=30) + private String name; + + @NotEmpty @Email + private String email; + + @NotNull @Min(18) @Max(100) + private Integer age; + + @NotNull + private Gender gender; + + @DateTimeFormat(pattern="MM/dd/yyyy") + @NotNull @Past + private Date birthday; + + @Size(min=2, max=30) + private String name; + + @NotEmpty @Email + private String email; + + @NotNull @Min(18) @Max(100) + private Integer age; + + @NotNull + private Gender gender; + + @DateTimeFormat(pattern="MM/dd/yyyy") + @NotNull @Past + private Date birthday; +### 36. Что вы знаете о Spring MVC Interceptor и как он используется? +Перехватчики в Spring (Spring Interceptor) являются аналогом Servlet Filter и позволяют перехватывать запросы клиента и обрабатывать их. Перехватить запрос клиента можно в трех местах: preHandle, postHandle и afterCompletion. + +preHandle – метод используется для обработки запросов, которые еще не были переданы в метода обработчик контроллера. Должен вернуть true для передачи следующему перехватчику или в handler method. False укажет на обработку запроса самим обработчиком и отсутствию необходимости передавать его дальше. Метод имеет возможность выкидывать исключения и пересылать ошибки к представлению. +postHandle – вызывается после handler method, но до обработки DispatcherServlet для передачи представлению. Может использоваться для добавления параметров в объект ModelAndView. +afterCompletion – вызывается после отрисовки представления. +Для создания обработчика необходимо расширить абстрактный класс HandlerInterceptorAdapter или реализовать интерфейс HandlerInterceptor. Так же нужно указать перехватчики в конфигурационном файле Spring. + + + + + + + + + + + + + + + + +### 37. Spring JdbcTemplate класс и его применение. +Spring предоставляет отличную поддержку JDBC API и предлагает класс утилиту JdbcTemplate, с помощью которого можно избавиться от многократного повторения похожего кода в приложении (вроде операций open \ closing connection; ResultSet, PreparedStatement и др.). Для подключения необходимо настроить файл конфигурации spring и получить объект JdbcTemplate. Например. + +spring.xml: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Пример использования JdbcTemplate: + + @Override + public void save(Employee employee) { + String query = "insert into Employee (id, name, role) values (?,?,?)"; + + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + + Object[] args = new Object[] {employee.getId(), employee.getName(), employee.getRole()}; + + int out = jdbcTemplate.update(query, args); + + if(out !=0){ + System.out.println("Employee saved with id="+employee.getId()); + }else System.out.println("Employee save failed with id="+employee.getId()); + } + + @Override + public void save(Employee employee) { + String query = "insert into Employee (id, name, role) values (?,?,?)"; + + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + + Object[] args = new Object[] {employee.getId(), employee.getName(), employee.getRole()}; + + int out = jdbcTemplate.update(query, args); + + if(out !=0){ + System.out.println("Employee saved with id="+employee.getId()); + }else System.out.println("Employee save failed with id="+employee.getId()); + } +### 38. Как использовать Tomcat JNDI DataSource в веб-приложении Spring? +Для использования контейнера сервлетов настроенного на использование JNDI DataSource, необходимо задать соответствующее свойство в файле конфигурации и затем внедрять его как зависимость. Далее мы можем использовать объект JdbcTemplate для выполнения операций с базами данных. + + + + + + + + +39. Каким образом можно управлять транзакциями в Spring? +Транзакциями в Spring управляют с помощью Declarative Transaction Management (программное управление). Используется аннотация @Transactional для описания необходимости управления транзакцией. В файле конфигурации нужно добавить настройку transactionManager для DataSource. + + + + + + + + +### 40. Расскажите о Spring DAO. +Spring DAO предоставляет возможность работы с доступом к данным с помощью технологий вроде JDBC, Hibernate в удобном виде. Существуют специальные классы: JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport, JpaDaoSupport. + +В Spring DAO поддерживается иерархия исключений, что помогает не обрабатывать некоторые исключения. + +import java.util.List; +import org.springframework.jdbc.core.support.JdbcDaoSupport; + +public class PersonDao extends JdbcDaoSupport{ + +public void insert(Person person){ +String insertSql ="INSERT INTO PERSON (NAME, EMAIL) VALUES(?,?);"; +String name = person.getName(); +String email = person.getEmail(); + +getJdbcTemplate().update(insertSql,new Object[]{name,email}); +} + +public List selectAll(){ +String selectAllSql = "SELECT * FROM PERSON;"; + +return getJdbcTemplate().query(selectAllSql, new PersonRowMapper()); +} + +} + + +import java.util.List; +import org.springframework.jdbc.core.support.JdbcDaoSupport; + +public class PersonDao extends JdbcDaoSupport{ + +public void insert(Person person){ +String insertSql ="INSERT INTO PERSON (NAME, EMAIL) VALUES(?,?);"; +String name = person.getName(); +String email = person.getEmail(); + +getJdbcTemplate().update(insertSql,new Object[]{name,email}); +} + +public List selectAll(){ +String selectAllSql = "SELECT * FROM PERSON;"; + +return getJdbcTemplate().query(selectAllSql, new PersonRowMapper()); +} + +} +### 41. Как интегрировать Spring и Hibernate? +Для интеграции Hibernate в Spring необходимо подключить зависимости, а так же настроить файл конфигурации Spring. Т.к. настройки несколько отличаются между проектами и версиями, то смотрите официальную документацию Spring и Hibernate для уточнения настроек для конкретных технологий. + +Читайте (spring 4, hibernate 5) – Spring Data JPA — пример приложения Hello World. Настройки Spring Data + JPA + Hibernate + MySQL. + +### 42. Расскажите о Spring Security. +Проект Spring Security предоставляет широкие возможности для защиты приложения. Кроме стандартных настроек для аутентификации, авторизации и распределения ролей и маппинга доступных страниц, ссылок и т.п., предоставляет защиту от различных вариантов атак (например CSRF). Имеет множество различных настроек, но остается легким в использовании. + +Смотрите различные статьи в разделе Spring Security. + +### 43. Как внедрить java.util.Properties в Spring Bean? +Для возможности использования Spring EL для внедрения свойств (properties) в различные бины необходимо определить propertyConfigure bean, который будет загружать файл свойств. + + + + + + + + + + + + + + + + +Или через аннотации: + +@Value("${maxReadResults}") +private int maxReadResults; +1 +2 +@Value("${maxReadResults}") +private int maxReadResults; +### 44. Назовите некоторые из шаблонов проектирования, используемых в Spring Framework? +Spring Framework использует множество шаблонов проектирования, например: + +Singleton Pattern: Creating beans with default scope. +Factory Pattern: Bean Factory classes +Prototype Pattern: Bean scopes +Adapter Pattern: Spring Web and Spring MVC +Proxy Pattern: Spring Aspect Oriented Programming support +Template Method Pattern: JdbcTemplate, HibernateTemplate etc +Front Controller: Spring MVC DispatcherServlet +Data Access Object: Spring DAO support +Dependency Injection and Aspect Oriented Programming +### 45. Best Practices в Spring Framework. ++ Избегайте указания версий в пространстве имен, чтобы быть уверенным в использовании последних версий. ++ Разделяйте конфигурации спринг согласно их деятельности, например: spring-jdbc.xml, spring-security.xml. ++ Spring бины, которые будут использованы в различных контекстах, необходимо указывать в root context и инициализировать с помощью listener. ++ Настраивайте зависимости бинов где это возможно и избегайте автоматического связывания там, где в этом нет строгой надобности. ++ Создавайте файл свойств и считывайте его в файле конфигурации Spring для использования application level properties. ++ Для больших приложений предпочтительнее использовать настройки с помощью xml файлов конфигурации, а не аннотаций. ++ Используйте подходящие по смыслу аннотации при указании бина, например: @Service для классов бизнес логики и @Repository для классов для работы с данными. ++ Spring framework имеет в проекте множество модулей. Удалите все лишние зависимости, которые могут быть загружены автоматически при указании корневой библиотеки. ++ Если вы используете аспекты, убедитесь, что используете точку присоединения как можно более близко, чтобы избежать случайных проблем с обработкой лишних методов. ++ Пользовательские аннотации могут принести существенные преимущества при использовании AOP. ++ Используйте dependency injection там, где это принесет явную пользу. Внедрение зависимостей повсюду может добавить сложностей при поддержке проекта. From f4bf9b53a5628c9309e43146d8647f271540179a Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Sat, 10 Jul 2021 15:58:21 +0400 Subject: [PATCH 04/10] Update README.md --- README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/README.md b/README.md index acd6520..08529e0 100644 --- a/README.md +++ b/README.md @@ -800,6 +800,34 @@ 43. Как внедрить java.util.Properties в Spring Bean? 44. Назовите некоторые из шаблонов проектирования, используемых в Spring Framework? 45. Best Practices в Spring Framework. +46. Для чего нужен Component Scan? +47. Как вы добавите Component Scan в Spring Boot? В чём отличие между @Component и @ComponentScan? +48. Для чего используется аннотация @Bean? +49. В чём разница между @Bean и @Component? +50. В чём разница между @Component, @Service и @Repository аннотациями? +51. Можем ли мы использовать @Component вместо @Service для бизнес логики? +52. В чем различие между web.xml и the Spring Context - servlet.xml? +53. Что предпочитаете использовать для конфигурации Spring - xml или аннотирование? +54. Можем ли мы применить @Autowired с не сеттерами и не конструкторами методами? +55. В чем разница между Сквозной Функциональностью (Cross Cutting Concerns) и АОП (аспектно оринтированное программирование)? +56. В чем разница между IOC (Inversion of Control) и Application Context? +57. В чем разница между classPathXmlApplicationContext и annotationConfigApplicationContext? +58. Почему возвращаемое значение при применении аспекта @Around может потеряться? Назовите причины. +59. Как вы решаете какой бин инжектить, если у вас несколько подходящих бинов. Расскажите о @Primary и @Qualifier? +60. Что нового в Spring Framework 5.0? +61. Сравните Application Context, IOC Container, vs Web Container и EJB Container. Нужен ли Web Container для запуска Spring Boot приложения? +62. Как мы можем выбрать подходящий бин при помощи application.properties? +63. Какая минимальная версия Java поддерживается в Spring Boot 2 и Spring 5? +64. В чём разница между @Controller и @RestController? +65. Почему иногда мы используем @ResponseBody, а иногда ResponseEntity? +66. В чем разница между Filters, Listeners and Interceptors? +67. В чем разница между ModelMap и ModelAndView? +68. В чем разница между model.put() и model.addAttribute()? +69. Что можете рассказать про Form Binding? +70. Почему мы используем Hibernate Validator? +71. Где должны располагаться статические (css, js, html) ресурсы в Spring MVC приложении? +72. Почему для конфиденциальных данных рекомендуется использовать POST, а не GET запросы? +73. Можно ли передать в запросе один и тот же параметр несколько раз? [к оглавлению](#Вопросы-для-собеседования-на-java-developer) From 75b59f4fba9c25b1937d1463be656a934e70e219 Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Sat, 10 Jul 2021 16:02:14 +0400 Subject: [PATCH 05/10] Update spring.md --- spring.md | 279 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) diff --git a/spring.md b/spring.md index 42a9d5f..f6af27b 100644 --- a/spring.md +++ b/spring.md @@ -742,3 +742,282 @@ Dependency Injection and Aspect Oriented Programming + Если вы используете аспекты, убедитесь, что используете точку присоединения как можно более близко, чтобы избежать случайных проблем с обработкой лишних методов. + Пользовательские аннотации могут принести существенные преимущества при использовании AOP. + Используйте dependency injection там, где это принесет явную пользу. Внедрение зависимостей повсюду может добавить сложностей при поддержке проекта. + +### 1 Для чего нужен Component Scan? +Если вы понимаете как работает Component Scan, то вы понимаете Spring +Первый шаг для описания Spring Beans это добавление аннотации — @Component, или @Service, или @Repository. +Однако, Spring ничего не знает об этих бинах, если он не знает где искать их. То, что скажет Spring где искать эти бины и называется Component Scan. В @ComponentScan вы указываете пакеты, которые должны сканироваться. +Spring будет искать бины не только в пакетах для сканирования, но и в их подпакетах. +### 2 Как вы добавите Component Scan в Spring Boot? +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} + +@SpringBootApplication определяет автоматическое сканирование пакета, где находится класс Application + +Всё будет в порядке, ваш код целиком находится в указанном пакете или его подпакетах. +Однако, если необходимый вам компонент находится в другом пакете, вы должны использовать дополнительно аннотацию @ComponentScan, где перечислите все дополнительные пакеты для сканирования + +### 3 В чём отличие между @Component и @ComponentScan? +@Component и @ComponentScan предназначены для разных целей + + +@Component помечает класс в качестве кандидата для создания Spring бина. +@ComponentScan указывает где Spring искать классы, помеченные аннотацией @Component или его производной + + +### 4 Для чего используется аннотация @Bean? +В классах конфигурации Spring, @Bean используется для определения компонентов с кастомной логикой. + + +### 5 В чём разница между @Bean и @Component? +@Bean используется в конфигурационных классах Spring. Он используется для непосредственного создания бина. + + +@Component используется со всеми классами, которыми должен управлять Spring. Когда Spring видит класс с @Component, Spring определяет этот класс как кандидата для создания bean. + + +### 6 В чём разница между @Component, @Service и @Repository аннотациями? +Все они определяют бины Spring. Однако между ними всё же есть разница. + + +@Component — универсальный компонент +@Repository — компонент, который предназначен для хранения, извлечения и поиска. Как правило, используется для работы с базами данных. +@Service — фасад для некоторой бизнес логики + + +Пользовательские аннотации, производные от @Component, могут добавлять специальную логику в бинах. + + +Например, бины, получившиеся при помощи @Repository, дополнительно имеют обработку для JDBC Exception + + +### 7 Можем ли мы использовать @Component вместо @Service для бизнес логики? +Да. конечно. + + +Если @Component является универсальным стереотипом для любого Spring компонента, то @Service в настоящее время является его псевдонимом. Однако, в официальной документации Spring рекомендуется использовать именно @Service для бизнес логики. Вполне возможно, что в будущих версиях фреймворка, для данного стереотипа добавится дополнительная семантика, и его бины станут обладать дополнительной логикой. + + +### 8 В чем различие между web.xml и the Spring Context - servlet.xml? +web.xml — Метаданные и конфигурация любого веб-приложения, совместимого с Java EE. Java EE стандарт для веб-приложений. +servlet.xml — файл конфигурации, специфичный для Spring Framework. + + +### 9 Что предпочитаете использовать для конфигурации Spring - xml или аннотирование? +Предпочитаю аннотации, если кодовая база хорошо описывается такими элементами, как @Service, @Component, @Autowired + + +Однако когда дело доходит до конфигурации, у меня нет каких-либо предпочтений. Я бы оставил этот вопрос команде. + + +### 10 Можем ли мы применить @Autowired с не сеттерами и не конструкторами методами? +Да, конечно. + + +@Autowired может использоваться вместе с конструкторами, сеттерами или любым другими методами. Когда Spring находит @Autowired на методе, Spring автоматически вызовет этот метод, после создания экземпляра бина. В качестве аргументов, будут подобраны подходящие объекты из контекста Spring. + + +### 11 В чем разница между Сквозной Функциональностью (Cross Cutting Concerns) и АОП (аспектно оринтированное программирование)? +Сквозная Функциональность — функциональность, которая может потребоваться вам на нескольких различных уровнях — логирование, управление производительностью, безопасность и т.д. +АОП — один из подходов к реализации данной проблемы + + +### 12 В чем разница между IOC (Inversion of Control) и Application Context? +IOC — инверсия управления. Вместо ручного внедрения зависимостей, фреймворк забирает ответственность за это. +ApplicationContext — реализация IOC спрингом. + + +Bean Factory — это базовая версия IOC контейнера + + +Application Context также включает дополнительные функции, которые обычно нужны для разработки корпоративных приложений + + +### 13 В чем разница между classPathXmlApplicationContext и annotationConfigApplicationContext? +classPathXmlApplicationContext — если вы хотите инициализировать контекст Spring при помощи xml +annotationConfigApplicationContext — если вы хотите инициализировать контекст Spring при помощи конфигурационного класса java + + +### 14 Почему возвращаемое значение при применении аспекта @Around может потеряться? Назовите причины. +Метод, помеченный аннотацией @Around, должен возвращать значение, которое он (метод) получил из joinpoint.proceed() + + +@Around("trackTimeAnnotation()") +public Object around(ProceedingJoinPoint joinPoint) throws Throwable{ + long startTime = System.currentTimeMillis(); + Object retVal = joinPoint.proceed(); + long timeTaken = System.currentTimeMillis() - startTime; + logger.info("Time taken by {} is equal to {}",joinPoint, timeTaken); + return retVal; +} + +### 15 Как вы решаете какой бин инжектить, если у вас несколько подходящих бинов. Расскажите о @Primary и @Qualifier? +Если есть бин, который вы предпочитаете большую часть времени по сравнению с другими, то используйте @Primary, и используйте @Qualifier для нестандартных сценариев. + + +Если все бины имеют одинаковый приоритет, мы всегда будем использовать @Qualifier + + +Если бин надо выбрать во время исполнения программы, то эти аннотации вам не подойдут. Вам надо в конфигурационном классе создать метод, пометить его аннотацией @Bean, и вернуть им требуемый бин. + + +### 16 Что нового в Spring Framework 5.0? +На мой взгляд это Functional Web Framework, Kotlin и и поддержка реактивного программирования. + + +### 17 Сравните Application Context, IOC Container, vs Web Container и EJB Container. Нужен ли Web Container для запуска Spring Boot приложения? +Web Container и EJB Containers являются частью приложения/веб-сервера, таких как Tomcat, Websphere, Weblogic. Они добавляют свою дополнительную функциональность к ним. Java EE определяет контракт для веб-приложений, эти контейнеры являются реализацией этих контрактов. + + +Spring контейнер может являться частью любого приложения, которое вы делаете на java. Spring может работать внутри веб-контейнера, ejb контейнера или даже без них. + + +### 18 Как мы можем выбрать подходящий бин при помощи application.properties? +Рассмотрим пример: + + +interface GreetingService { + public String sayHello(); +} + +И два компонента + + +@Component(value="real") +class RealGreetingService implements GreetingService { + public String sayHello() { + return "I'm real"; + } +} + +@Component(value="mock") +class MockGreetingService implements GreetingService { + public String sayHello() { + return "I'm mock"; + } +} + +Тогда в application.properties добавим свойство +application.greeting: real + + +Воспользуемся данным решением: + + +@RestController +public class WelcomeController { + @Resource(name="${application.greeting}") + private GreeterService service1; +} + +### 19 Какая минимальная версия Java поддерживается в Spring Boot 2 и Spring 5? +Spring 5.0 и Spring Boot 2.0 поддерживают Java 8 и более поздней версии. + + +### 20 В чём разница между @Controller и @RestController? +@RestController = @Controller + @ResponseBody + + +@RestController превращает помеченный класс в Spring-бин. Этот бин для конвертации входящих/исходящих данных использует Jackson message converter. Как правило целевые данные представлены в json или xml. + + +### 21 Почему иногда мы используем @ResponseBody, а иногда ResponseEntity? +ResponseEntity необходим, только если мы хотим кастомизировать ответ, добавив к нему статус ответа. Во всех остальных случаях будем использовать @ResponseBody. + + +@GetMapping(value=”/resource”) +@ResponseBody +public Resource sayHello() { return resource; } + +@PostMapping(value=”/resource”) +public ResponseEntity createResource() { + …. +return ResponseEntity.created(resource).build(); +} + +Стандартные HTTP коды статусов ответов, которые можно использовать. +200 — SUCCESS +201 — CREATED +404 — RESOURCE NOT FOUND +400 — BAD REQUEST +401 — UNAUTHORIZED +500 — SERVER ERROR + + +Для @ResponseBody единственные состояния статуса это SUCCESS(200), если всё ок и SERVER ERROR(500), если произошла какая-либо ошибка. + + +Допустим мы что-то создали и хотим отправить статус CREATED(201). В этом случае мы используем ResponseEntity. + + +### 22 В чем разница между Filters, Listeners and Interceptors? +Концептуально всё просто, фильтры сервлетов могут перехватывать только HTTPServlets. Listeners могут перехватывать специфические события. Как перехватить события которые относятся ни к тем не другим? + + +Фильтры и перехватчики делают по сути одно и тоже: они перехватывают какое-то событие, и делают что-то до или после. + + +Java EE использует термин Filter, Spring называет их Interceptors. + + +Именно здесь AOP используется в полную силу, благодаря чему возможно перехватывание вызовов любых объектов + + +### 23 В чем разница между ModelMap и ModelAndView? +Model — интерфейс, ModelMap его реализация.. + + +ModelAndView является контейнером для пары, как ModelMap и View. + + +Обычно я люблю использовать ModelAndView. Однако есть так же способ когда мы задаем необходимые атрибуты в ModelMap, и возвращаем название View обычной строкой из метода контроллера. + + +### 24 В чем разница между model.put() и model.addAttribute()? +Метод addAttribute отделяет нас от работы с базовой структурой hashmap. По сути addAttribute это обертка над put, где делается дополнительная проверка на null. Метод addAttribute в отличии от put возвращает modelmap. +model.addAttribute(“attribute1”,”value1”).addAttribute(“attribute2”,”value2”); + + +### 25 Что можете рассказать про Form Binding? +Нам это может понадобиться, если мы, например, захотим взять некоторое значение с HTML страницы и сохранить его в БД. Для этого нам надо это значение переместить в контроллер Спринга. + + +Если мы будем использовать Spring MVC form tags, Spring автоматически свяжет переменные на HTML странице с Бином Спринга. + + +Если мне придется с этим работать, я обязательно буду смотреть официальную документацию Spring MVC Form Tags. + + +### 26 Почему мы используем Hibernate Validator? +Hibernate Validator никак не связан с БД. Это просто библиотека для валидации. + + +Hibernate Validator версии 5.x является эталонной реализацией Bean Validation 1.1 + + +Так же если взглянуть по адресу http://beanvalidation.org/2.0, то Hibernate Validator является единственным, который сертифицирован. + + +### 27 Где должны располагаться статические (css, js, html) ресурсы в Spring MVC приложении? +Расположение статических ресурсов можно настроить. В документации Spring Boot рекомендуется использовать /static, или /public, или /resources, или /META-INF/resources + + +### 28 Почему для конфиденциальных данных рекомендуется использовать POST, а не GET запросы? +В случае GET запроса передаваемые параметры являются частью url, и все маршрутизаторы, через которые пройдет наш GET запрос, смогут их прочитать. + + +В случае POST запроса передаваемые параметры являются частью тела запроса. При использовании HTTPs, тело запроса шифруется. Следовательно, использование POST запросов является более безопасным + + +### 29 Можно ли передать в запросе один и тот же параметр несколько раз? +Пример: +http://localhost:8080/login?name=Ranga&name=Ravi&name=Sathish +Да, можно принять все значения, используя массив в методе контроллера + + +public String method(@RequestParam(value="name") String[] names){ +} From e87441e3a736603faa823cb84722206c6e6eb9cf Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Sat, 10 Jul 2021 17:07:21 +0400 Subject: [PATCH 06/10] Update spring.md --- spring.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/spring.md b/spring.md index f6af27b..d7e412a 100644 --- a/spring.md +++ b/spring.md @@ -62,27 +62,28 @@ private Dependency dependency; Для упрощения процесса разработки основанных на Spring приложений в Eclipse (наиболее часто используемая бесплатная IDE-среда для разработки Java-приложений), в рамках Spring создан проект Spring IDE. Проект бесплатный. Он интегрирован в Eclipse IDE, Spring IDE, Mylyn (среда разработки в Eclipse, основанная на задачах), Maven for Eclipse, AspectJ Development Tool. ### 6. Приведите названия некоторых важных Spring модулей. -Inversion of Control-контейнер: конфигурирование компонентов приложений и управление жизненным циклом Java-объектов. -Фреймворк аспектно-ориентированного программирования: работает с функциональностью, которая не может быть реализована возможностями объектно-ориентированного программирования на Java без потерь. -Фреймворк доступа к данным: работает с системами управления реляционными базами данных на Java-платформе, используя JDBC- и ORM-средства и обеспечивая решения задач, которые повторяются в большом числе Java-based environments. -Фреймворк управления транзакциями: координация различных API управления транзакциями и инструментарий настраиваемого управления транзакциями для объектов Java. -Фреймворк MVC: каркас, основанный на HTTP и сервлетах, предоставляющий множество возможностей для расширения и настройки (customization). -Фреймворк удалённого доступа: конфигурируемая передача Java-объектов через сеть в стиле RPC, поддерживающая RMI, CORBA,HTTP-based протоколы, включая web-сервисы (SOAP). -Фреймворк аутентификации и авторизации: конфигурируемый инструментарий процессов аутентификации и авторизации, поддерживающий много популярных и ставших индустриальными стандартами протоколов, инструментов, практик через дочерний проект Spring Security (ранее известный как Acegi). -Фреймворк удалённого управления: конфигурируемое представление и управление Java-объектами для локальной или удалённой конфигурации с помощью JMX. -Фреймворк работы с сообщениями: конфигурируемая регистрация объектов-слушателей сообщений для прозрачной обработки сообщений из очереди сообщений с помощью JMS, улучшенная отправка сообщений по стандарту JMS API. ++ Inversion of Control-контейнер: конфигурирование компонентов приложений и управление жизненным циклом Java-объектов. ++ Фреймворк аспектно-ориентированного программирования: работает с функциональностью, которая не может быть реализована возможностями объектно-ориентированного программирования на Java без потерь. ++ Фреймворк доступа к данным: работает с системами управления реляционными базами данных на Java-платформе, используя JDBC- и ORM-средства и обеспечивая решения задач, которые повторяются в большом числе Java-based environments. ++ Фреймворк управления транзакциями: координация различных API управления транзакциями и инструментарий настраиваемого управления транзакциями для объектов Java. ++ Фреймворк MVC: каркас, основанный на HTTP и сервлетах, предоставляющий множество возможностей для расширения и настройки (customization). ++ Фреймворк удалённого доступа: конфигурируемая передача Java-объектов через сеть в стиле RPC, поддерживающая RMI, CORBA,HTTP-based протоколы, включая web-сервисы (SOAP). ++ Фреймворк аутентификации и авторизации: конфигурируемый инструментарий процессов аутентификации и авторизации, поддерживающий много популярных и ставших индустриальными стандартами протоколов, инструментов, практик через дочерний проект Spring Security (ранее известный как Acegi). ++ Фреймворк удалённого управления: конфигурируемое представление и управление Java-объектами для локальной или удалённой конфигурации с помощью JMX. ++ Фреймворк работы с сообщениями: конфигурируемая регистрация объектов-слушателей сообщений для прозрачной обработки сообщений из очереди сообщений с помощью JMS, улучшенная отправка сообщений по стандарту JMS API. Тестирование: каркас, поддерживающий классы для написания модульных и интеграционных тестов. ### 7. Что вы понимаете под аспектно-ориентированным программированием (Aspect Oriented Programming — AOP)? Аспектно-ориентированное программирование (АОП) — это одна из “моделей программирования текущего момента” в мире Java. АОП предоставляет возможность реализации сквозной логики — т.е. логики, которая применяется к множеству частей приложения — в одном месте и обеспечения автоматического применения этой логики по всему приложению. Подход Spring к АОП заключается в создании “динамических прокси” для целевых объектов и “привязывании” объектов к конфигурированному совету для выполнения сквозной логики. ### 8. Что такое Aspect, Advice, Pointcut, JoinPoint и Advice Arguments в АОП? -Точки соединения. Точка соединения (joinpoint) — это четко определенная точка во время выполнения приложения. Типовые примеры точек соединения включают обращение к методу, собственно Method Invocation, инициализацию класса и создание экземпляра объекта. Точки соединения являются ключевой концепцией АОП и определяют места в приложении, в которые можно вставлять дополнительную логику с использованием АОП. -Советы (advice). Фрагмент кода, который должен выполняться в отдельной точке соединения, представляет собой совет (advice). Существует несколько типов советов, среди которых перед, когда совет выполняется до точки соединения, и после, когда совет выполняется после точки соединения. В ООП совет принимает форму метода внутри класса. -Срезы. Срез (pointcut) — это коллекция точек соединения, которая используется для определения ситуации, когда совет должен быть выполнен. Создавая срезы, вы получаете точный контроль над тем, как применять совет к компонентам приложения. Как упоминалось ранее, типичной точкой соединения является Method Invocation. А типичный срез представляет собой коллекцию всех точек соединения Method Invocation в отдельном классе. Часто между срезами можно установить сложные отношения, чтобы обеспечить дополнительные ограничения на то, когда будет выполнен совет. -Аспекты. Аспект (aspect) — это комбинация совета и срезов. Такая комбинация дает в результате определение логики, которая должна быть включена в приложение, и указание мест, где она должна выполняться. -Связывание. Связывание (weaving) представляет собой процесс действительной вставки аспектов в определенную точку кода приложения. Для решений АОП времени компиляции это делается на этапе компиляции, обычно в виде дополнительного шага процесса сборки. Аналогично, для решений АОП времени выполнения связывание происходит динамически во время выполнения. В AspectJ поддерживается еще один механизм связывания под названием связывание во время загрузки (load-time weaving — LTW), который перехватывает лежащий в основе загрузчик классов JVM и обеспечивает связывание с байт-кодом, когда он загружается загрузчиком классов. -Цель. Цель (target) — это объект, поток выполнения которого изменяется каким-то процессом АОП. На целевой объект часто ссылаются как на объект, снабженный советом. -Введение. Введение (introduction) представляет собой процесс, посредством которого можно изменить структуру объекта за счет введения в него дополнительных методов или полей. Введение можно использовать для обеспечения реализации любым объектом определенного интерфейса без необходимости в том, чтобы класс этого объекта реализовывал такой интерфейс явно. +Точки соединения. ++ Точка соединения (joinpoint) — это четко определенная точка во время выполнения приложения. Типовые примеры точек соединения включают обращение к методу, собственно Method Invocation, инициализацию класса и создание экземпляра объекта. Точки соединения являются ключевой концепцией АОП и определяют места в приложении, в которые можно вставлять дополнительную логику с использованием АОП. ++ Советы (advice). Фрагмент кода, который должен выполняться в отдельной точке соединения, представляет собой совет (advice). Существует несколько типов советов, среди которых перед, когда совет выполняется до точки соединения, и после, когда совет выполняется после точки соединения. В ООП совет принимает форму метода внутри класса. ++ Срезы. Срез (pointcut) — это коллекция точек соединения, которая используется для определения ситуации, когда совет должен быть выполнен. Создавая срезы, вы получаете точный контроль над тем, как применять совет к компонентам приложения. Как упоминалось ранее, типичной точкой соединения является Method Invocation. А типичный срез представляет собой коллекцию всех точек соединения Method Invocation в отдельном классе. Часто между срезами можно установить сложные отношения, чтобы обеспечить дополнительные ограничения на то, когда будет выполнен совет. ++ Аспекты. Аспект (aspect) — это комбинация совета и срезов. Такая комбинация дает в результате определение логики, которая должна быть включена в приложение, и указание мест, где она должна выполняться. ++ Связывание. Связывание (weaving) представляет собой процесс действительной вставки аспектов в определенную точку кода приложения. Для решений АОП времени компиляции это делается на этапе компиляции, обычно в виде дополнительного шага процесса сборки. Аналогично, для решений АОП времени выполнения связывание происходит динамически во время выполнения. В AspectJ поддерживается еще один механизм связывания под названием связывание во время загрузки (load-time weaving — LTW), который перехватывает лежащий в основе загрузчик классов JVM и обеспечивает связывание с байт-кодом, когда он загружается загрузчиком классов. ++ Цель. Цель (target) — это объект, поток выполнения которого изменяется каким-то процессом АОП. На целевой объект часто ссылаются как на объект, снабженный советом. ++ Введение. Введение (introduction) представляет собой процесс, посредством которого можно изменить структуру объекта за счет введения в него дополнительных методов или полей. Введение можно использовать для обеспечения реализации любым объектом определенного интерфейса без необходимости в том, чтобы класс этого объекта реализовывал такой интерфейс явно. ### 9. В чем разница между Spring AOP и AspectJ АОП? AspectJ де-факто является стандартом реализации АОП. Реализация АОП от Spring имеет некоторые отличия: From 00d6f5143efb7d5c917605e7120044568cbd57a3 Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Sat, 10 Jul 2021 17:57:19 +0400 Subject: [PATCH 07/10] Update spring.md --- spring.md | 60 ++++++------------------------------------------------- 1 file changed, 6 insertions(+), 54 deletions(-) diff --git a/spring.md b/spring.md index d7e412a..64a9052 100644 --- a/spring.md +++ b/spring.md @@ -229,7 +229,6 @@ Dispatcher-servlet-diagram @Service указывает, что класс является сервисом для реализации бизнес логики (на самом деле не отличается от Component, но просто помогает разработчику указать смысловую нагрузку класса). Для указания контейнеру на класс-бин можно использовать любую из этих аннотаций. Но различные имена позволяют различать назначение того или иного класса. - ### 22. Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener. DispatcherServlet – сервлет диспетчера. Этот сервлет анализирует запросы и направляет их соответствующему контроллеру для обработки. В Spring MVC класс DispatcherServlet является центральным сервлетом, который получает запросы и направляет их соответствующим контроллерам. В приложении Spring MVC может существовать произвольное количество экземпляров DispatcherServlet, предназначенных для разных целей (например, для обработки запросов пользовательского интерфейса, запросов веб-служб REST и т.д.). Каждый экземпляр DispatcherServlet имеет собственную конфигурацию WebApplicationContext, которая определяет характеристики уровня сервлета, такие как контроллеры, поддерживающие сервлет, отображение обработчиков, распознавание представлений, интернационализация, оформление темами, проверка достоверности, преобразование типов и форматирование и т.п. @@ -252,6 +251,7 @@ ContextLoaderListener – слушатель при старте и заверш org.springframework.web.context.ContextLoaderListener + ### 23. Что такое ViewResolver в Spring? ViewResolver – распознаватель представлений. Интерфейс ViewResolver в Spring MVC (из пакета org.springframework.web.servlet) поддерживает распознавание представлений на основе логического имени, возвращаемого контроллером. Для поддержки различных механизмов распознавания представлений предусмотрено множество классов реализации. Например, класс UrlBasedViewResolver поддерживает прямое преобразование логических имен в URL. Класс ContentNegotiatingViewResolver поддерживает динамическое распознавание представлений в зависимости от типа медиа, поддерживаемого клиентом (XML, PDF, JSON и т.д.). Существует также несколько реализаций для интеграции с различными технологиями представлений, такими как FreeMarker (FreeMarkerViewResolver), Velocity (VelocityViewResolver) и JasperReports (JasperReportsViewResolver). @@ -263,13 +263,7 @@ ViewResolver – распознаватель представлений. Инт - - - - - + InternalResourceViewResolver – реализация ViewResolver, которая позволяет находить представления, которые возвращает контроллер для последующего перехода к нему. Ищет по заданному пути, префиксу, суффиксу и имени. Дополнительная информация – Spring MVC — описание интерфейса ViewResolver. @@ -277,21 +271,13 @@ InternalResourceViewResolver – реализация ViewResolver, котора ### 24. Что такое MultipartResolver и когда его использовать? Интерфейс MultipartResolver используется для загрузки файлов. Существуют две реализации: CommonsMultipartResolver и StandardServletMultipartResolver, которые позволяют фреймворку загружать файлы. По умолчанию этот интерфейс не включается в приложении и необходимо указывать его в файле конфигурации. После настройки любой запрос о загрузке будет отправляться этому интерфейсу. - + - + - - - - - - Пример – Spring MVC — загрузка файла ### 25. Как обрабатывать исключения в Spring MVC Framework? @@ -563,40 +549,8 @@ spring.xml: - - - - - - - - - - - - - - - - Пример использования JdbcTemplate: - @Override - public void save(Employee employee) { - String query = "insert into Employee (id, name, role) values (?,?,?)"; - - JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); - - Object[] args = new Object[] {employee.getId(), employee.getName(), employee.getRole()}; - - int out = jdbcTemplate.update(query, args); - - if(out !=0){ - System.out.println("Employee saved with id="+employee.getId()); - }else System.out.println("Employee save failed with id="+employee.getId()); - } @Override public void save(Employee employee) { @@ -612,6 +566,7 @@ spring.xml: System.out.println("Employee saved with id="+employee.getId()); }else System.out.println("Employee save failed with id="+employee.getId()); } + ### 38. Как использовать Tomcat JNDI DataSource в веб-приложении Spring? Для использования контейнера сервлетов настроенного на использование JNDI DataSource, необходимо задать соответствующее свойство в файле конфигурации и затем внедрять его как зависимость. Далее мы можем использовать объект JdbcTemplate для выполнения операций с базами данных. @@ -619,10 +574,7 @@ spring.xml: - - - -39. Каким образом можно управлять транзакциями в Spring? +### 39. Каким образом можно управлять транзакциями в Spring? Транзакциями в Spring управляют с помощью Declarative Transaction Management (программное управление). Используется аннотация @Transactional для описания необходимости управления транзакцией. В файле конфигурации нужно добавить настройку transactionManager для DataSource. Date: Tue, 13 Jul 2021 12:47:04 +0400 Subject: [PATCH 08/10] Update README.md --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 08529e0..6ce72b2 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ + [Основы Web](#Основы-web) ![icon][done] + [Дополнительные материалы](#Дополнительные-материалы) ![icon][done] + [Spring](#Spring) ![icon][done] ++ [Hibernate](#Hibernate) ![icon][done] [done]:done.png ## ООП @@ -804,10 +805,10 @@ 47. Как вы добавите Component Scan в Spring Boot? В чём отличие между @Component и @ComponentScan? 48. Для чего используется аннотация @Bean? 49. В чём разница между @Bean и @Component? -50. В чём разница между @Component, @Service и @Repository аннотациями? -51. Можем ли мы использовать @Component вместо @Service для бизнес логики? -52. В чем различие между web.xml и the Spring Context - servlet.xml? -53. Что предпочитаете использовать для конфигурации Spring - xml или аннотирование? +50. В чём разница между @Component, @Service и @Repository аннотациями? +51. Можем ли мы использовать @Component вместо @Service для бизнес логики? +52. В чем различие между web.xml и the Spring Context - servlet.xml? +53. Что предпочитаете использовать для конфигурации Spring - xml или аннотирование? 54. Можем ли мы применить @Autowired с не сеттерами и не конструкторами методами? 55. В чем разница между Сквозной Функциональностью (Cross Cutting Concerns) и АОП (аспектно оринтированное программирование)? 56. В чем разница между IOC (Inversion of Control) и Application Context? @@ -829,6 +830,52 @@ 72. Почему для конфиденциальных данных рекомендуется использовать POST, а не GET запросы? 73. Можно ли передать в запросе один и тот же параметр несколько раз? +## Hibernate +1. Что такое Hibernate Framework? +2. Какие важные преимущества дает использование Hibernate Framework? +3. Какие преимущества Hibernate над JDBC? +4. Назовите некоторые важные интерфейсы Hibernate. +5. Что такое конфигурационный файл Hibernate? +6. Что такое Hibernate mapping file? +7. Назовите некоторые важные аннотации, используемые для отображения в Hibernate. +8. Что вы знаете о Hibernate SessionFactory и как его сконфигурировать? +9. Является ли Hibernate SessionFactory потокобезопасным? +10. Как получить Hibernate Session и что это такое? +11. Является ли Hibernate Session потокобезопасным? +12. В чем разница между openSession и getCurrentSession? +13. Какая разница между методами Hibernate Session get() и load()? +14. Что вы знаете о кэшировании в Hibernate? Объясните понятие кэш первого уровня в Hibernate? +15. Как настроить кэш второго уровня в Hibernate с помощью EHCache? +16. Какие существуют различные состояния у entity bean? +17. Как используется вызов метода Hibernate Session merge()? +18. В чем разница между Hibernate save(), saveOrUpdate() и persist()? +19. Что произойдет, если будет отсутствовать конструктор без аргументов у Entity Bean? +20. В чем разница между sorted collection и ordered collection? Какая из них лучше? +21. Какие типы коллекций в Hibernate вы знаете? +22. Как реализованы Join’ы Hibernate? +23. Почему мы не должны делать Entity class как final? +24. Что вы знаете о HQL и какие его преимущества? +25. Что такое Query Cache в Hibernate? +26. Можем ли мы выполнить нативный запрос SQL (sql native) в Hibernate? +27. Назовите преимущества поддержки нативного sql в Hibernate. +28. Что такое Named SQL Query? +29. Какие преимущества Named SQL Query? +30. Расскажите о преимуществах использования Hibernate Criteria API. +31. 31. Как логировать созданные Hibernate SQL запросы в лог-файлы? +32. Что вы знаете о Hibernate прокси и как это помогает в ленивой загрузке (lazy load)? +33. Как реализованы отношения в Hibernate? +34. Как управлять транзакциями с помощью Hibernate? +35. Что такое каскадные связи (обновления) и какие каскадные типы есть в Hibernate? +36. Как добавить логирование log4j в Hibernate приложение? +37. Как использовать JNDI DataSource сервера приложений с Hibernate Framework? +38. Как интегрировать Hibernate и Spring? +39. Что вы знаете о классе HibernateTemplate? +40. Как интегрировать Hibernate с Servlet или Struts2 веб приложением? +41. Какие паттерны применяются в Hibernate? +42. Расскажите о Hibernate Validator Framework. +43. Какие преимущества дает использование плагина Hibernate Tools Eclipse? +44. Best Practices в Hibernate. + [к оглавлению](#Вопросы-для-собеседования-на-java-developer) ## Источники From 95515dec8b4924d0e48f9004be550b43b7506773 Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Tue, 13 Jul 2021 13:02:00 +0400 Subject: [PATCH 09/10] Add files via upload --- hibernate.md | 526 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 526 insertions(+) create mode 100644 hibernate.md diff --git a/hibernate.md b/hibernate.md new file mode 100644 index 0000000..1f9d34d --- /dev/null +++ b/hibernate.md @@ -0,0 +1,526 @@ +## Ответы +### 1. Что такое Hibernate Framework? + Hibernate — библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного отображения (object-relational mapping — ORM). Она представляет собой свободное программное обеспечение с открытым исходным кодом (open source), распространяемое на условиях GNU Lesser General Public License. Данная библиотека предоставляет легкий в использовании каркас (фреймворк) для отображения объектно-ориентированной модели данных в традиционные реляционные базы данных. Hibernate совместима с JSR-220/317 и предоставляет стандартные средства JPA. + +### 2. Какие важные преимущества дает использование Hibernate Framework? +Hibernate является одним из самых востребованных ORM фреймворков для Java. И вот почему: + ++ Hibernate устраняет множество спагетти кода (повторяющегося), который постоянно преследует разработчика при работе с JDBC. Скрывает от разработчика множество кода, необходимого для управления ресурсами и позволяет сосредоточиться на бизнес логике. ++ Hibernate поддерживает XML так же как и JPA аннотации, что позволяет сделать реализацию кода независимой. ++ Hibernate предоставляет собственный мощный язык запросов (HQL), который похож на SQL. Стоит отметить, что HQL полностью объектно-ориентирован и понимает такие принципы, как наследование, полиморфизм и ассоциации (связи). ++ Hibernate – широко распространенный open source проект. Благодаря этому доступны тысячи открытых статей, примеров, а так же документации по использованию фреймворка. ++ Hibernate легко интегрируется с другими Java EE фреймворками, например, Spring Framework поддерживает встроенную интеграцию с Hibernate. ++ Hibernate поддерживает ленивую инициализацию используя proxy объекты и выполняет запросы к базе данных только по необходимости. ++ Hibernate поддерживает разные уровни cache, а следовательно может повысить производительность. ++ Важно, что Hibernate может использовать чистый SQL, а значит поддерживает возможность оптимизации запросов и работы с любым сторонним вендором БД и его фичами. +### 3. Какие преимущества Hibernate над JDBC? + Hibernate имеет ряд преимуществ перед JDBC API: + +Hibernate удаляет множество повторяющегося кода из JDBC API, а следовательно его легче читать, писать и поддерживать. +Hibernate поддерживает наследование, ассоциации и коллекции, что не доступно в JDBC API. +Hibernate неявно использует управление транзакциями. Большинство запросов нельзя выполнить вне транзакции. При использовании JDBC API для управления транзакциями нужно явно использовать commit и rollback. +JDBC API throws SQLException, которое относится к проверяемым исключениям, а значит необходимо постоянно писать множество блоков try-catch. В большинстве случаев это не нужно для каждого вызова JDBC и используется для управления транзакциями. Hibernate оборачивает исключения JDBC через непроверяемые JDBCException или HibernateException, а значит нет необходимости проверять их в коде каждый раз. Встроенная поддержка управления транзакциями в Hibernate убирает блоки try-catch. +Hibernate Query Language (HQL) более объектно ориентированный и близкий к Java язык запросов, чем SQL в JDBC. +Hibernate поддерживает кэширование, а запросы JDBC – нет, что может понизить производительность. +Конфигурация Hibernate позволяет использовать JDBC вроде соединения по типу JNDI DataSource для пула соединений. Это важная фича для энтерпрайз приложений, которая полностью отсутствует в JDBC API. +Hibernate поддерживает аннотации JPA, а значит код является переносимым на другие ORM фреймворки, реализующие стандарт, в то время как код JDBC сильно привязан к приложению. +### 4. Назовите некоторые важные интерфейсы Hibernate. + SessionFactory (org.hibernate.SessionFactory) – неизменяемый потокобезопасный объект с компилированным маппингом для одной базы данных. Необходимо инициализировать SessionFactory всего один раз. Экземпляр SessionFactory используется для получения объектов Session, которые используются для операций с базами данных. + Session (org.hibernate.Session) – однопоточный короткоживущий объект, который предоставляет связь между объектами приложения и базой данных. Он оборачивает JDBC java.sql.Connection и работает как фабрика для org.hibernate.Transaction. Разработчик должен открывать сессию по необходимости и закрывать ее сразу после использования. Экземпляр Session является интерфейсом между кодом в java приложении и hibernate framework и предоставляет методы для операций CRUD. + Transaction (org.hibernate.Transaction) – однопоточный короткоживущий объект, используемый для атомарных операций. Это абстракция приложения от основных JDBC или JTA транзакций. org.hibernate.Session может занимать несколько org.hibernate.Transaction в определенных случаях. +### 5. Что такое конфигурационный файл Hibernate? + Файл конфигурации Hibernate содержит в себе данные о базе данных и необходим для инициализации SessionFactory. В .xml файле необходимо указать вендора базы данных или JNDI ресурсы, а так же информацию об используемом диалекте, что поможет hibernate выбрать режим работы с конкретной базой данных. + +### 6. Что такое Hibernate mapping file? + Файл отображения (mapping file) используется для связи entity бинов и колонок в таблице базы данных. В случаях, когда не используются аннотации JPA, файл отображения .xml может быть полезен (например при использовании сторонних библиотек). + +### 7. Назовите некоторые важные аннотации, используемые для отображения в Hibernate. + Hibernate поддерживает как аннотации из JPA, так и свои собственные, которые находятся в пакете org.hibernate.annotations. Наиболее важные аннотации JPA и Hibernate: + +javax.persistence.Entity: используется для указания класса как entity bean. +javax.persistence.Table: используется для определения имени таблицы из БД, которая будет отображаться на entity bean. +javax.persistence.Access: определяет тип доступа, поле или свойство. Поле – является значением по умолчанию и если нужно, чтобы hibernate использовал методы getter/setter, то их необходимо задать для нужного свойства. +javax.persistence.Id: определяет primary key в entity bean. +javax.persistence.EmbeddedId: используется для определения составного ключа в бине. +javax.persistence.Column: определяет имя колонки из таблицы в базе данных. +javax.persistence.GeneratedValue: задает стратегию создания основных ключей. Используется в сочетании с javax.persistence.GenerationType enum. +javax.persistence.OneToOne: задает связь один-к-одному между двумя сущностными бинами. Соответственно есть другие аннотации OneToMany, ManyToOne и ManyToMany. +org.hibernate.annotations.Cascade: определяет каскадную связь между двумя entity бинами. Используется в связке с org.hibernate.annotations.CascadeType. +javax.persistence.PrimaryKeyJoinColumn: определяет внешний ключ для свойства. Используется вместе с org.hibernate.annotations.GenericGenerator и org.hibernate.annotations.Parameter. +### 8. Что вы знаете о Hibernate SessionFactory и как его сконфигурировать? + SessionFactory является фабрикой классов и используется для получения объектов session. SessionFactory отвечает за считывание параметров конфигурации Hibernate и подключение к базе данных. Обычно в приложении имеется только один экземпляр SessionFactory и потоки, обслуживающие клиентские запросы, получают экземпляры session с помощью объекта SessionFactory. Внутреннее состояние SessionFactory неизменно (immutable). Internal state (внутреннее состояние) включает в себя все метаданные об Object/ Relational Mapping и задается при создании SessionFactory. + +SessionFactory также предоставляет методы для получения метаданных класса и статистики, вроде данных о втором уровне кэша, выполняемых запросах и т.д. + +### 9. Является ли Hibernate SessionFactory потокобезопасным? + Т.к. объект SessionFactory immutable (неизменяемый), то да, он потокобезопасный. Множество потоков может обращаться к одному объекту одновременно. + +### 10. Как получить Hibernate Session и что это такое? + Объект Hibernate Session является связью между кодом java приложения и hibernate. Это основной интерфейс для выполнения операций с базой данных. Жизненный цикл объекта session связан с началом и окончанием транзакции. Этот объект предоставляет методы для CRUD (create, read, update, delete) операций для объекта персистентности. С помощью этого экземпляра можно выполнять HQL, SQL запросы и задавать критерии выборки. + +### 11. Является ли Hibernate Session потокобезопасным? + Объект Hibernate Session не является потокобезопасным. Каждый поток должен иметь свой собственный объект Session и закрывать его по окончанию. + +### 12. В чем разница между openSession и getCurrentSession? + Hibernate SessionFactory getCurrentSession() возвращает сессию, связанную с контекстом. Но для того, чтобы это работало, нам нужно настроить его в конфигурационном файле hibernate. Так как этот объект session связан с контекстом hibernate, то отпадает необходимость к его закрытию. Объект session закрывается вместе с закрытием SessionFactory. + +thread +1 +thread +Метод Hibernate SessionFactory openSession() всегда создает новую сессию. Мы должны обязательно контролировать закрытие объекта сеанса по завершению всех операций с базой данных. Для многопоточной среды необходимо создавать новый объект session для каждого запроса. + +Существует еще один метод openStatelessSession(), который возвращает session без поддержки состояния. Такой объект не реализует первый уровень кэширования и не взаимодействует с вторым уровнем. Сюда же можно отнести игнорирование коллекций и некоторых обработчиков событий. Такие объекты могут быть полезны при загрузке больших объемов данных без удержания большого кол-ва информации в кэше. + +### 13. Какая разница между методами Hibernate Session get() и load()? + Hibernate session обладает различными методами для загрузки данных из базы данных. Наиболее часто используемые методы для этого – get() и load(). + +get() загружает данные сразу при вызове, в то время как load() использует прокси объект и загружает данные только тогда, когда это требуется на самом деле. В этом плане load() имеет преимущество в плане ленивой загрузки данных. +load() бросает исключение, когда данные не найдены. Поэтому его нужно использовать только при уверенности в существовании данных. +Нужно использовать метод get(), если необходимо удостовериться в наличии данных в БД. +### 14. Что вы знаете о кэшировании в Hibernate? Объясните понятие кэш первого уровня в Hibernate? + Hibernate использует кэширование, чтобы сделать наше приложение быстрее. Кэш Hibernate может быть очень полезным в получении высокой производительности приложения при правильном использовании. Идея кэширования заключается в сокращении количества запросов к базе данных. + +Кэш первого уровня Hibernate связан с объектом Session. Кэш первого уровня у Hibernate включен по умолчанию и не существует никакого способа, чтобы его отключить. Однако Hibernate предоставляет методы, с помощью которых мы можем удалить выбранные объекты из кэша или полностью очистить кэш. +Любой объект закэшированный в session не будет виден другим объектам session. После закрытия объекта сессии все кэшированные объекты будут потеряны. + +### 15. Как настроить кэш второго уровня в Hibernate с помощью EHCache? + EHCache является лучшим выбором для организации кэширования второго уровня в хибернейт. Для настройки второго уровня кэширования в хибернейт требуется выполнить несколько шагов. + +Добавить зависимость hibernate-ehcache в проект. + +org.hibernate +hibernate-ehcache +4.3.5.Final + + +org.hibernate +hibernate-ehcache +4.3.5.Final + +Добавить несколько записей в конфигурационный файл Hibernate. +org.hibernate.cache.ehcache.EhCacheRegionFactory + + + + + +true +true +/myehcache.xml + +org.hibernate.cache.ehcache.EhCacheRegionFactory + + + + + +true +true +/myehcache.xml +Создать файл конфигурации EHCache. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Использовать аннотацию @Cache и указание настройки стратегии кэширование над entity bean. +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +@Entity +@Table(name = "ADDRESS") +@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region="employee") +public class Address { +} + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +@Entity +@Table(name = "ADDRESS") +@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region="employee") +public class Address { + +} + +### 16. Какие существуют различные состояния у entity bean? + Transient: состояние, при котором объект никогда не был связан с какой-либо сессией и не является персистентностью. Этот объект находится во временном состоянии. Объект в этом состоянии может стать персистентным при вызове метода save(), persist() или saveOrUpdate(). Объект персистентности может перейти в transient состоянии после вызова метода delete(). + Persistent: когда объект связан с уникальной сессией он находится в состоянии persistent (персистентности). Любой экземпляр, возвращаемый методами get() или load() находится в состоянии persistent. + Detached: если объект был персистентным, но сейчас не связан с какой-либо сессией, то он находится в отвязанном (detached) состоянии. Такой объект можно сделать персистентным используя методы update(), saveOrUpdate(), lock() или replicate(). Состояния transient или detached так же могут перейти в состояние persistent как новый объект персистентности после вызова метода merge(). +### 17. Как используется вызов метода Hibernate Session merge()? + Hibernate merge() может быть использован для обновления существующих значений, однако этот метод создает копию из переданного объекта сущности и возвращает его. Возвращаемый объект является частью контекста персистентности и отслеживает любые изменения, а переданный объект не отслеживается. + +### 18. В чем разница между Hibernate save(), saveOrUpdate() и persist()? + Hibernate save() используется для сохранения сущности в базу данных. Проблема с использованием метода save() заключается в том, что он может быть вызван без транзакции. А следовательно если у нас имеется отображение нескольких объектов, то только первичный объект будет сохранен и мы получим несогласованные данные. Также save() немедленно возвращает сгенерированный идентификатор. + +Hibernate persist() аналогичен save() с транзакцией. persist() не возвращает сгенерированный идентификатор сразу. + +Hibernate saveOrUpdate() использует запрос для вставки или обновления, основываясь на предоставленных данных. Если данные уже присутствуют в базе данных, то будет выполнен запрос обновления. Метод saveOrUpdate() можно применять без транзакции, но это может привести к аналогичным проблемам, как и в случае с методом save(). + +### 19. Что произойдет, если будет отсутствовать конструктор без аргументов у Entity Bean? + Hibernate использует рефлексию для создания экземпляров Entity бинов при вызове методов get() или load(). Для этого используется метод Class.newInstance(), который требует наличия конструктора без параметров. Поэтому, в случае его отсутствия, вы получите ошибку HibernateException. + +### 20. В чем разница между sorted collection и ordered collection? Какая из них лучше? + При использовании алгоритмов сортировки из Collection API для сортировки коллекции используется сортированный список (sorted list). Для маленьких коллекций это не приводит к излишнему расходу ресурсов, но на больших коллекциях это может привести к потере производительности и ошибкам OutOfMemory. Так же entity бины должны реализовывать интерфейс Comparable или Comparator для работы с сортированными коллекциями. + +При использовании фреймворка Hibernate для загрузки данных из базы данных мы можем применить Criteria API и команду order by для получения отсортированного списка (ordered list). Ordered list является лучшим выбором к sorted list, т.к. он использует сортировку на уровне базы данных. Она быстрее и не может привести к утечке памяти. Пример запроса к БД для получения ordered list: + +List empList = session.createCriteria(Employee.class) +.addOrder(Order.desc("id")).list(); +1 +2 +List empList = session.createCriteria(Employee.class) +.addOrder(Order.desc("id")).list(); +### 21. Какие типы коллекций в Hibernate вы знаете? + Bag + Set + List + Array + Map +### 22. Как реализованы Join’ы Hibernate? + Существует несколько способов реализовать связи в Hibernate. + +Использовать ассоциации, такие как one-to-one, one-to-many, many-to-many. +Использовать в HQL запросе команду JOIN. Существует другая форма “join fetch“, позволяющая загружать данные немедленно (не lazy). +Использовать чистый SQL запрос с командой join. +### 23. Почему мы не должны делать Entity class как final? + Хибернейт использует прокси классы для ленивой загрузки данных (т.е. по необходимости, а не сразу). Это достигается с помощью расширения entity bean и, следовательно, если бы он был final, то это было бы невозможно. Ленивая загрузка данных во многих случаях повышает производительность, а следовательно важна. + +### 24. Что вы знаете о HQL и какие его преимущества? + Hibernate Framework поставляется с мощным объектно-ориентированным языком запросов – Hibernate Query Language (HQL). Он очень похож на SQL, за исключением, что в нем используются объекты вместо имен таблиц, что делает язык ближе к объектно-ориентированному программированию. + +HQL является регистронезависимым, кроме использования в запросах имен java переменных и классов, где он подчиняется правилам Java. Например, SelECt то же самое, что и select, но ru.javastudy.MyClass отличен от ru.javastudy.MyCLASS. Запросы HQL кэшируются (это как плюс так и минус). + +Подробнее можете посмотреть в Hibernate — Hibernate Query (HQL) примеры: SELECT, INSERT, UPDATE, DELETE и в общем разделе Hibernate. + +### 25. Что такое Query Cache в Hibernate? + Hibernate реализует область кэша для запросов resultset, который тесно взаимодействует с кэшем второго уровня Hibernate. Для подключения этой дополнительной функции требуется несколько дополнительных шагов в коде. Query Cache полезны только для часто выполняющихся запросов с повторяющимися параметрами. Для начала необходимо добавить эту запись в файле конфигурации Hibernate: + +true +1 +true +Уже внутри кода приложения для запроса применяется метод setCacheable(true), как показано ниже: + +Query query = session.createQuery("from Employee"); +query.setCacheable(true); +query.setCacheRegion("ALL_EMP"); +1 +2 +3 +Query query = session.createQuery("from Employee"); +query.setCacheable(true); +query.setCacheRegion("ALL_EMP"); +### 26. Можем ли мы выполнить нативный запрос SQL (sql native) в Hibernate? + С помощью использования SQLQuery можно выполнять чистый запрос SQL. В общем случае это не рекомендуется, т.к. вы потеряете все преимущества HQL (ассоциации, кэширование). Выполнить можно примерно так: + +Transaction tx = session.beginTransaction(); +SQLQuery query = session.createSQLQuery("select emp_id, emp_name, emp_salary from Employee"); +List rows = query.list(); +for(Object[] row : rows){ +Employee emp = new Employee(); +emp.setId(Long.parseLong(row[0].toString())); +emp.setName(row[1].toString()); +emp.setSalary(Double.parseDouble(row[2].toString())); +System.out.println(emp); +} + +Transaction tx = session.beginTransaction(); +SQLQuery query = session.createSQLQuery("select emp_id, emp_name, emp_salary from Employee"); +List rows = query.list(); +for(Object[] row : rows){ +Employee emp = new Employee(); +emp.setId(Long.parseLong(row[0].toString())); +emp.setName(row[1].toString()); +emp.setSalary(Double.parseDouble(row[2].toString())); +System.out.println(emp); +} + +### 27. Назовите преимущества поддержки нативного sql в Hibernate. + Использование нативного SQL может быть необходимо при выполнении запросов к некоторым базам данных, которые могут не поддерживаться в Hibernate. Примером может служить некоторые специфичные запросы и “фишки” при работе с БД от Oracle. + +### 28. Что такое Named SQL Query? + Hibernate поддерживает именованный запрос, который мы можем задать в каком-либо центральном месте и потом использовать его в любом месте в коде. Именованные запросы поддерживают как HQL, так и Native SQL. Создать именованный запрос можно с помощью JPA аннотаций @NamedQuery, @NamedNativeQuery или в конфигурационном файле отображения (mapping files). + +Hibernate — примеры именованных запросов NamedQuery. + +### 29. Какие преимущества Named SQL Query? + Именованный запрос Hibernate позволяет собрать множество запросов в одном месте, а затем вызывать их в любом классе. Синтаксис Named Query проверяется при создании session factory, что позволяет заметить ошибку на раннем этапе, а не при запущенном приложении и выполнении запроса. Named Query глобальные, т.е. заданные однажды, могут быть использованы в любом месте. + +Однако одним из основных недостатков именованного запроса является то, что его очень трудно отлаживать (могут быть сложности с поиском места определения запроса). + +### 30. Расскажите о преимуществах использования Hibernate Criteria API. + Hibernate Criteria API является более объектно-ориентированным для запросов, которые получают результат из базы данных. Для операций update, delete или других DDL манипуляций использовать Criteria API нельзя. Критерии используются только для выборки из базы данных в более объектно-ориентированном стиле. + +Вот некоторые области применения Criteria API: + +Criteria API поддерживает проекцию, которую мы можем использовать для агрегатных функций вроде sum(), min(), max() и т.д. +Criteria API может использовать ProjectionList для извлечения данных только из выбранных колонок. +Criteria API может быть использована для join запросов с помощью соединения нескольких таблиц, используя методы createAlias(), setFetchMode() и setProjection(). +Criteria API поддерживает выборку результатов согласно условиям (ограничениям). Для этого используется метод add() с помощью которого добавляются ограничения (Restrictions). +Criteria API позволяет добавлять порядок (сортировку) к результату с помощью метода addOrder(). + +### 31. Как логировать созданные Hibernate SQL запросы в лог-файлы? + Для логирования запросов SQL добавьте в файл конфигурации Hibernate строчку: + +true +1 +true +Отметьте, что это необходимо использовать на уровне Development или Testing и должно быть отключено в продакшн. + +### 32. Что вы знаете о Hibernate прокси и как это помогает в ленивой загрузке (lazy load)? + Hibernate использует прокси объект для поддержки отложенной загрузки. Обычно при загрузке данных из таблицы Hibernate не загружает все отображенные (замаппинные) объекты. Как только вы ссылаетесь на дочерний объект или ищите объект с помощью геттера, если связанная сущность не находиться в кэше сессии, то прокси код перейдет к базе данных для загрузки связанной сущности. Для этого используется javassist, чтобы эффективно и динамически создавать реализации подклассов ваших entity объектов. + +### 33. Как реализованы отношения в Hibernate? + Реализовать отношение one-to-one, one-to-many, many-to-many можно с помощью JPA аннотаций или конфигурирования xml файла. За примерами посетите раздел Hibernate. + +### 34. Как управлять транзакциями с помощью Hibernate? + Hibernate вообще не допускает большинство операций без использования транзакций. Поэтому после получения экземпляра session от SessionFactory необходимо выполнить beginTransaction() для начала транзакции. Метод вернет ссылку, которую мы можем использовать для подтверждения или отката транзакции. + +В целом, управление транзакциями в фреймворке выполнено гораздо лучше, чем в JDBC, т.к. мы не должны полагаться на возникновение исключения для отката транзакции. Любое исключение автоматически вызовет rollback. + +### 35. Что такое каскадные связи (обновления) и какие каскадные типы есть в Hibernate? + Если у нас имеются зависимости между сущностями (entities), то нам необходимо определить как различные операции будут влиять на другую сущность. Это реализуется с помощью каскадных связей (или обновлений). Вот пример кода с использованием аннотации @Cascade: + +import org.hibernate.annotations.Cascade; + +@Entity +@Table(name = "EMPLOYEE") +public class Employee { + +@OneToOne(mappedBy = "employee") +@Cascade(value = org.hibernate.annotations.CascadeType.ALL) +private Address address; + +} + +import org.hibernate.annotations.Cascade; + +@Entity +@Table(name = "EMPLOYEE") +public class Employee { + +@OneToOne(mappedBy = "employee") +@Cascade(value = org.hibernate.annotations.CascadeType.ALL) +private Address address; + +} +Обратите внимание, что есть некоторые различия между enum CascadeType в Hibernate и в JPA. Поэтому обращайте внимание какой пакет вы импортируете при использовании аннотации и константы типа. Наиболее часто используемые CascadeType перечисления описаны ниже. + +None: без Cascading. Формально это не тип, но если мы не указали каскадной связи, то никакая операция для родителя не будет иметь эффекта для ребенка. +ALL: Cascades save, delete, update, evict, lock, replicate, merge, persist. В общем – всё. +SAVE_UPDATE: Cascades save и update. Доступно только для hibernate. +DELETE: передает в Hibernate native DELETE действие. Только для hibernate. +DETATCH, MERGE, PERSIST, REFRESH и REMOVE – для простых операций. +LOCK: передает в Hibernate native LOCK действие. +REPLICATE: передает в Hibernate native REPLICATE действие. +### 36. Как добавить логирование log4j в Hibernate приложение? + Добавить зависимость log4j в проект. + Создать log4j.xml или log4j.properties файл и добавить его в classpath. + Для веб приложений используйте ServletContextListener, а для автономных приложений DOMConfigurator или PropertyConfigurator для настройки логирования. + Создайте экземпляр org.apache.log4j.Logger и используйте его согласно задачи. + Может быть полезно посетить раздел Log4j2. + +### 37. Как использовать JNDI DataSource сервера приложений с Hibernate Framework? + В веб приложении лучше всего использовать контейнер сервлетов для управления пулом соединений. Поэтому лучше определить JNDI ресурс для DataSource и использовать его в веб приложении. Для этого в Hibernate нужно удалить все специфичные для базы данных свойства и использовать указания свойства JNDI DataSource: + +java:comp/env/jdbc/MyLocalDB +1 +java:comp/env/jdbc/MyLocalDB +### 38. Как интегрировать Hibernate и Spring? + Лучше всего прочитать о настройках на сайтах фреймворков для текущей версии. Оба фреймворка поддерживают интеграцию из коробки и в общем настройка их взаимодействия не составляет труда. Общие шаги выглядят следующим образом. + +Добавить зависимости для hibernate-entitymanager, hibernate-core и spring-orm. +Создать классы модели и передать реализации DAO операции над базой данных. Важно, что DAO классы используют SessionFactory, который внедряется в конфигурации бинов Spring. +Настроить конфигурационный файл Spring (смотрите в офф. документации или из примера на этом сайте). +Дополнительно появляется возможность использовать аннотацию @Transactional и перестать беспокоиться об управлении транзакцией Hibernate. +Пример использования Spring Data JPA — пример приложения Hello World. Настройки Spring Data + JPA + Hibernate + MySQL. + +### 39. Что вы знаете о классе HibernateTemplate? + Spring Framework предоставляет различные подходы для интеграции с Hibernate. Тем не менее, мы наиболее часто будем использовать подход, использующий HibernateTemplate. Есть две основные причины: + +Класс скрывает детали управления сессиями и транзакциями. +Предоставляет подход основанный на шаблонах +HibernateTemplate класс скрывает трудности управления сессиями и транзакциями при использовании Hibernate для доступа к данным. Нужно только инициализировать HibernateTemplate путем передачи экземпляра SessionFactory. Spring Framework берет на себя беспокойство за детали связанные с сессиями и транзакциями. Это помогает устранить инфраструктурный код, который может вносить суматоху при увеличении сложности. +HibernateTemplate, так же как и JdbcTemplate, предоставляет шаблонный подход для доступа к данным. Когда вы используете HibernateTemplate, вы будете работать с callbacks. Обратные вызовы – это единственный механизм в шаблонном подходе, который уведомляет шаблон запускать нужную задачу. Преимущество наличия обратного вызова в том, что там только одна точка входа в слой доступа к данным. И эта точка входа определяется шаблоном, в этом случае HibernateTemplate. + +В комментариях дополнили, что использование HibernateTemplate не явлется рекомендуемым. Вместо использования HibernateTemplate из пакета org.springframework.orm рекомендуется использовать декларативный подход (@Transactional). Таким образом фреймворк сам позаботится об операциях open, commit, close, flush. + +Доступ к данным используя Spring Framework: Hibernate template: http://www.spring-source.ru/articles.php?type=manual&theme=articles&docs=article_08 +Stackoverflow: http://stackoverflow.com/questions/18002768/why-hibernatetemplate-isnt-recommended + +### 40. Как интегрировать Hibernate с Servlet или Struts2 веб приложением? + Для интеграции необходимо использовать ServletContextListener. Более подробный пример смотрите по ссылке + +http://www.journaldev.com/3557/struts2-hibernate-integration-example-tutorial +### 41. Какие паттерны применяются в Hibernate? + Domain Model Pattern – объектная модель предметной области, включающая в себя как поведение так и данные. + Data Mapper – слой мапперов (Mappers), который передает данные между объектами и базой данных, сохраняя их независимыми друг от друга и себя. + Proxy Pattern – применяется для ленивой загрузки. + Factory pattern – используется в SessionFactory +### 42. Расскажите о Hibernate Validator Framework. + Проверка данных является неотъемлемой частью любого приложения. Hibernate Validator обеспечивает эталонную реализацию двух спецификаций JSR-303 и JSR-349 применяемых в Java. Для настройки валидации в Hibernate необходимо сделать следующие шаги. + +Добавить hibernate validation зависимости в проект. + +javax.validation +validation-api +1.1.0.Final + + +org.hibernate +hibernate-validator +5.1.1.Final + + + +javax.validation +validation-api +1.1.0.Final + + +org.hibernate +hibernate-validator +5.1.1.Final + +Так же требуются зависимости из JSR 341, реализующие Unified Expression Language для обработки динамических выражений и сообщений о нарушении ограничений. + +javax.el +javax.el-api +2.2.4 + + +org.glassfish.web +javax.el +2.2.4 + + + +javax.el +javax.el-api +2.2.4 + + +org.glassfish.web +javax.el +2.2.4 + +Использовать необходимые аннотации в бинах. +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.hibernate.validator.constraints.CreditCardNumber; +import org.hibernate.validator.constraints.Email; + +public class Employee { + + @Min(value=1, groups=EmpIdCheck.class) + private int id; + + @NotNull(message="Name cannot be null") + @Size(min=5, max=30) + private String name; + + @Email + private String email; + + @CreditCardNumber + private String creditCardNumber; +.... + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.hibernate.validator.constraints.CreditCardNumber; +import org.hibernate.validator.constraints.Email; + +public class Employee { + + @Min(value=1, groups=EmpIdCheck.class) + private int id; + + @NotNull(message="Name cannot be null") + @Size(min=5, max=30) + private String name; + + @Email + private String email; + + @CreditCardNumber + private String creditCardNumber; +.... +### 43. Какие преимущества дает использование плагина Hibernate Tools Eclipse? + Плагин Hibernate Tools упрощает настройку маппинга, конфигурационного файла. Упрощает работы с файлами свойств или xml тегами. Помогает минимизировать ошибки написания кода. + +### 44. Best Practices в Hibernate. + При использовании фреймворка Hibernate рекомендуется придерживаться некоторых правил. + +Всегда проверяйте доступ к primary key. Если он создается базой данных, то вы не должны иметь сеттера. +По умолчанию hibernate устанавливает значения в поля напрямую без использования сеттеров. Если необходимо заставить хибернейт их применять, то проверьте использование аннотации @Access(value=AccessType.PROPERTY) над свойством. +Если тип доступа – property, то удостоверьтесь, что аннотация используется с геттером. Избегайте смешивания использования аннотации над обоими полями и геттером. +Используйте нативный sql запрос только там, где нельзя использовать HQL. +Используйте ordered list вместо сортированного списка из Collection API, если вам необходимо получить отсортированные данные. +Применяйте именованные запросы разумно – держите их в одном месте и используйте только для часто применяющихся запросов. Для специфичных запросов пишите их внутри конкретного бина. +В веб приложениях используйте JNDI DataSource вместо файла конфигурации для соединения с БД. +Избегайте отношений многие-ко-многим, т.к. это можно заменить двунаправленной One-to-Many и Many-to-One связью. +Для collections попробуйте использовать Lists, maps и sets. Избегайте массивов (array), т.к. они не дают преимуществ ленивой загрузки. +Не обрабатывайте исключения, которые могут откатить транзакцию и закрыть сессию. Если это проигнорировать, то Hibernate не сможет гарантировать, что состояние в памяти соответствует состоянию персистентности (могут быть коллизии данных). +Применяйте шаблон DAO для методов, которые могут использоваться в entity бинах. +Предпочитайте ленивую выборку для ассоциаций. \ No newline at end of file From 01c0f6fa8e15338beafb3c0a7504df55d131d6b0 Mon Sep 17 00:00:00 2001 From: ValentinJD <47910332+ValentinJD@users.noreply.github.com> Date: Tue, 13 Jul 2021 13:05:35 +0400 Subject: [PATCH 10/10] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6ce72b2..3f06fec 100644 --- a/README.md +++ b/README.md @@ -756,6 +756,7 @@ + [Spring Interview Questions](https://www.interviewbit.com/spring-interview-questions/) ## Spring ++ [Spring Framework](spring.md) 1. Расскажите о Spring Framework. 2. Какие некоторые из важных особенностей и преимуществ Spring Framework? 3. Что вы понимаете под Dependency Injection (DI)? @@ -831,6 +832,7 @@ 73. Можно ли передать в запросе один и тот же параметр несколько раз? ## Hibernate ++ [Что такое Hibernate Framework?](hibernate.md) 1. Что такое Hibernate Framework? 2. Какие важные преимущества дает использование Hibernate Framework? 3. Какие преимущества Hibernate над JDBC?