Систематические знания и вопросы для интервью по изучению Java, которые я обобщил сам, находятся в открытом доступе и в настоящее время имеют более 41 000 звезд. Он будет продолжать улучшаться, предложения и рекомендации приветствуются, и Star также приветствуется:GitHub.com/snail Climb/…
Эта статья в основном направлена на то, чтобы углубить ваше понимание Spring с помощью некоторых вопросов, поэтому в ней не будет слишком много кода! Эта статья была организована в течение длительного времени.Я не обращал внимания на многие из следующих проблем в процессе использования Spring.Также я временно ознакомился с большим количеством материалов и книг для составления. В интернете тоже много статей про Spring FAQs/interview questions.Я чувствую, что большинство из них скопировано друг у друга, и многие вопросы не очень потные, а некоторые ответы тоже имеют проблемы. Итак, я провел неделю свободного времени, разбираясь с этим, надеясь помочь всем.
Что такое весенние рамки?
Spring — это облегченная среда разработки, предназначенная для повышения эффективности разработки разработчиков и удобства обслуживания системы. Официальный сайт весны:spring.io/.
Обычно мы говорим, что Spring Framework относится к Spring Framework, который представляет собой набор многих модулей, и использование этих модулей может легко помочь нам в разработке. Этими модулями являются: основные контейнеры, доступ к данным/интеграция, веб, АОП (аспектно-ориентированное программирование), модули инструментов, обмена сообщениями и тестирования. Например, компонент Core в контейнере Core является ядром всех компонентов Spring, компонент Beans и компонент Context являются основой для реализации IOC и внедрения зависимостей, а компонент AOP используется для реализации аспектно-ориентированного программирования.
6 характеристик Spring, перечисленных на официальном сайте Spring:
- Основные технологии: Внедрение зависимостей (DI), АОП, события, ресурсы, i18n, проверка, привязка данных, преобразование типов, SpEL.
- контрольная работа: Аналоговые объекты, фреймворки TestContext, тесты Spring MVC, WebTestClient.
- доступ к данным: Транзакции, поддержка DAO, JDBC, ORM, упорядоченный XML.
- Веб-поддержка: Веб-фреймворк Spring MVC и Spring WebFlux.
- интегрированный: удаленное взаимодействие, JMS, JCA, JMX, электронная почта, задачи, планирование, кэширование.
- язык: Kotlin, Groovy, динамические языки.
Перечислите некоторые важные модули Spring?
Рисунок ниже соответствует версии Spring 4.x. В настоящее время компонент Portlet веб-модуля в последней версии 5.x устарел, и был добавлен компонент WebFlux для асинхронной реактивной обработки.
- Весеннее ядро:По сути, можно сказать, что все остальные функции Spring должны зависеть от этой библиотеки классов. В основном он обеспечивает функцию внедрения зависимостей IOC.
- ** Аспекты Spring **: этот модуль поддерживается интеграцией AspectJ.
- Spring AOP: Обеспечивает реализацию аспектно-ориентированного программирования.
- Spring JDBC: подключение к базе данных Java.
- Spring JMS: Служба сообщений Java.
- Spring ORM: Используется для поддержки инструментов ORM, таких как Hibernate.
- Spring Web: Обеспечивает поддержку создания веб-приложений.
- Spring Test: Обеспечивает поддержку тестов JUnit и TestNG.
Расскажите о своем понимании Spring IoC и АОП
IoC
IoC (инверсия управления: инверсия управления) представляет собойдизайн-мышление,этоУправление ручным созданием объектов в программе передано в управление фреймворку Spring.IoC имеет приложения и на других языках и не является специфичным для Spirng.Контейнер IoC — это носитель, используемый Spring для реализации IoC Контейнер IoC на самом деле представляет собой карту (ключ, значение), в которой хранятся различные объекты.
Взаимозависимость между объектами передается контейнеру IOC для управления, и контейнер IOC завершает внедрение объекта. Это значительно упрощает разработку приложений и освобождает приложения от сложных зависимостей.Контейнер IOC похож на фабрику: когда нам нужно создать объект, нам нужно только настроить файл конфигурации/аннотацию, не учитывая, как создается объект.В реальном проекте класс службы может иметь сотни или даже тысячи классов в качестве нижнего уровня.Если нам нужно создать экземпляр этой службы, вам, возможно, придется каждый раз выяснять конструкторы всех базовых классов этой службы, что может результат сводит людей с ума. Если вы используете IOC, вам нужно только настроить его, а затем ссылаться на него там, где он вам нужен, что значительно повышает удобство сопровождения проекта и снижает сложность разработки.
В эпоху Spring мы обычно использовали XML-файлы для настройки bean-компонентов. Позже разработчики поняли, что XML-файлы не годятся для настройки, поэтому конфигурация аннотаций SpringBoot постепенно стала популярной.
Рекомендуемое чтение:Ууху. Call.com/question/23…
Процесс инициализации Spring IOC:
Чтение исходного кода IOC
AOP
АОП (аспектно-ориентированное программирование: аспектно-ориентированное программирование) может сделать тех, кто не имеет отношения к бизнесу,Однако он инкапсулируется логикой или ответственностью (например, обработка транзакций, управление журналами, контроль разрешений и т. д.), обычно вызываемой бизнес-модулями.,легкоУменьшить дублирование кода в системе,Уменьшите связь между модулями,иХорошо для будущей масштабируемости и ремонтопригодности.
Spring AOP основан на динамическом прокси, если проксируемый объект реализует интерфейс, то Spring AOP будет использоватьJDK Proxy, для создания прокси-объектов и для объектов, которые не реализуют интерфейсы, JDK Proxy нельзя использовать для проксирования.В настоящее время Spring AOP будет использоватьCglib, то Spring AOP будет использоватьCglibСоздайте подкласс проксируемого объекта в качестве прокси, как показано на следующем рисунке:
Конечно, вы также можете использовать AspectJ, Spring AOP интегрировал AspectJ, AspectJ следует рассматривать как наиболее полную структуру AOP в экосистеме Java.
После использования АОП мы можем абстрагироваться от некоторых общих функций и использовать их непосредственно там, где их нужно использовать, что значительно упрощает объем кода. Это также удобно, когда нам нужно добавить новые функции, что также улучшает масштабируемость системы. АОП используется в таких сценариях, как функции регистрации и управления транзакциями.
В чем разница между Spring AOP и AspectJ AOP?
Spring AOP — это усовершенствование времени выполнения, а AspectJ — усовершенствование времени компиляции.Spring AOP основан на проксировании, а AspectJ основан на манипулировании байт-кодом.
Spring AOP интегрировал AspectJ, AspectJ следует рассматривать как наиболее полную структуру AOP в экосистеме Java. AspectJ более мощный, чем Spring AOP, но Spring AOP относительно проще.
Если у нас меньше граней, то между ними нет большой разницы в производительности. Однако, когда аспектов слишком много, лучше выбрать AspectJ, который намного быстрее, чем Spring AOP.
Каковы масштабы бобов весной?
- singleton : единственный экземпляр bean-компонента, bean-компоненты в Spring по умолчанию являются одноэлементными.
- прототип: новый экземпляр компонента создается при каждом запросе.
- request : каждый HTTP-запрос будет генерировать новый bean-компонент, который действителен только в рамках текущего HTTP-запроса.
- session : каждый HTTP-запрос будет генерировать новый bean-компонент, который действителен только в рамках текущего HTTP-сеанса.
- global-session: глобальная область сеанса, которая имеет смысл только в веб-приложениях на основе портлетов, больше не доступна в Spring 5. Портлеты — это небольшие веб-плагины Java, которые генерируют фрагменты семантического кода (например, HTML). Они основаны на контейнерах портлетов и могут обрабатывать HTTP-запросы, как сервлеты. Однако, в отличие от сервлетов, у каждого портлета свой сеанс.
Вы понимаете безопасность потоков singleton bean-компонентов в Spring?
Большую часть времени мы не используем многопоточность в системе, поэтому мало кто будет обращать внимание на эту проблему. Одноэлементные компоненты имеют проблемы с многопоточностью, в основном потому, что когда несколько потоков работают с одним и тем же объектом, операция записи в нестатические переменные-члены этого объекта будет иметь проблемы с безопасностью потоков.
Есть два распространенных решения:
-
Старайтесь избегать определения изменяемых переменных-членов в объекте Bean (нереалистично).
-
Определите переменную-член ThreadLocal в классе и сохраните необходимые переменные-члены в ThreadLocal (рекомендуемый способ).
жизненный цикл бобов весной?
В этой части есть много статей в Интернете.Следующее содержание организовано из:Yemengying.com/2016/07/14/…, В дополнение к этой статье рекомендую очень хорошую статью:блог woo woo woo.cn на.com/naturally apt and deep/afraid/37….
- Контейнер компонентов находит определение Spring Bean в файле конфигурации.
- Контейнер компонента использует Java Reflection API для создания экземпляра компонента.
- Если задействованы некоторые значения атрибутов, используйте
set()
метод для установки некоторого значения свойства. - Если компонент реализует
BeanNameAware
интерфейс, вызовsetBeanName()
метод, передавая имя компонента. - Если компонент реализует
BeanClassLoaderAware
интерфейс, вызовsetBeanClassLoader()
метод, пройтиClassLoader
Экземпляр объекта. - Если Бин реализует
BeanFactoryAware
интерфейс, вызовsetBeanClassLoader()
метод, пройтиClassLoade
Экземпляр объекта r. - Аналогично предыдущему, если другое
*.Aware
интерфейс, вызовите соответствующий метод. - Если есть что-то, связанное с контейнером Spring, который загружает этот bean-компонент
BeanPostProcessor
объект, выполнитьpostProcessBeforeInitialization()
метод - Если Бин реализует
InitializingBean
интерфейс, выполнитьafterPropertiesSet()
метод. - Если определение bean-компонента в файле конфигурации содержит атрибут init-method, выполнить указанный метод.
- Если есть что-то, связанное с контейнером Spring, который загружает этот bean-компонент
BeanPostProcessor
объект, выполнитьpostProcessAfterInitialization()
метод - Когда Бин должен быть уничтожен, если Бин реализует
DisposableBean
интерфейс, выполнитьdestroy()
метод. - Когда bean-компонент должен быть уничтожен, если определение bean-компонента в файле конфигурации содержит атрибут destroy-method, выполняется указанный метод.
Значок:
Аналогичная китайская версия:
Расскажите мне о своем понимании Spring MVC?
Когда дело доходит до этой проблемы, мы должны упомянуть предыдущие Model1 и Model2, две эпохи без Spring MVC.
- Эпоха Model1: многие друзья, которые поздно изучили бэкенд Java, возможно, не имели опыта разработки веб-приложений Java в режиме Model1. В режиме Model1 все веб-приложение почти полностью состоит из страниц JSP, и лишь небольшое количество компонентов JavaBeans используется для обработки таких операций, как подключение к базе данных и доступ к ней. В этом режиме JSP является как уровнем управления, так и уровнем представления. Очевидно, что у этой модели много проблем. Например, ① логика управления и логика представления смешиваются вместе, что приводит к крайне низкой частоте повторного использования кода, ② интерфейс и сервер взаимозависимы, что трудно тестировать, а эффективность разработки чрезвычайно низка;
- Эпоха Model2: Друзья, которые изучали Servlet и делали соответствующие демонстрации, должны понимать режим разработки «Java Bean (модель) + JSP (представление) + Servlet (контроллер)», который является ранним режимом разработки JavaWeb MVC. Модель: данные, задействованные в системе, то есть дао и бобы. Просмотр: отображение данных в модели только для отображения. Контроллер: обрабатывать запросы пользователей и отправлять их в , возвращать данные в JSP и отображать их пользователям.
В режиме Model2 еще много проблем.Степень абстракции и инкапсуляции Model2 далеко не достаточна.При использовании Model2 для разработки неизбежно повторение колес, что сильно снижает ремонтопригодность и возможность повторного использования программы. В результате появилось много сред MVC, связанных с разработкой JavaWeb, таких как Struts2, но Struts2 громоздкий. С ростом популярности облегченной среды разработки Spring в экосистеме Spring появилась среда Spring MVC, которая в настоящее время является лучшей средой MVC. По сравнению со Struts2 Spring MVC проще и удобнее в использовании, с более высокой эффективностью разработки, а Spring MVC работает быстрее.
MVC — это шаблон проектирования, а Spring MVC — отличный фреймворк MVC. Spring MVC может помочь нам разработать более краткий веб-уровень, и он естественным образом интегрирован с инфраструктурой Spring. В Spring MVC мы обычно делим серверные проекты на уровень обслуживания (обработка бизнеса), уровень Dao (операция с базой данных), уровень сущности (класс сущности), уровень контроллера (уровень управления, возврат данных на главную страницу).
Простая схематическая диаграмма Spring MVC выглядит следующим образом:
Вы понимаете, как работает SpringMVC?
Принцип показан на следующем рисунке:
Небольшая опечатка на картинке выше: функция входа Spring MVC также является фронт-контроллером.DispatcherServlet
Его роль состоит в том, чтобы получить запрос и ответить с результатом.
Описание процесса (важно):
- Клиент (браузер) отправляет запрос, напрямую запрашивая
DispatcherServlet
. -
DispatcherServlet
Звонил по запросу информацииHandlerMapping
, который анализирует запрос, соответствующийHandler
. - принять соответствующие
Handler
(Это то, что мы обычно говоримController
контроллер), начните сHandlerAdapter
Работа с адаптером. -
HandlerAdapter
будет основываться наHandler
Вызов реального процессора для обработки запроса и обработки соответствующей бизнес-логики. - После того, как процессор обработает бизнес, он вернет
ModelAndView
объект,Model
это возвращаемый объект данных,View
является логическимView
. -
ViewResolver
по логикеView
найти фактическоеView
. -
DispaterServlet
положить обратноModel
перейти кView
(просмотреть визуализацию). - Пучок
View
Вернуть запрашивающему (браузеру)
Какие шаблоны проектирования используются в среде Spring?
Подробное знакомство со следующими шаблонами проектирования вы можете прочитать в оригинальной статье автора некоторое время назад.«Интервьюер: «Расскажите, какие шаблоны проектирования используются в Spring?». 》.
-
Заводской шаблон проектирования: Spring использует заводской шаблон через
BeanFactory
,ApplicationContext
Создайте объект bean. - Шаблон проектирования прокси: Реализация функциональности Spring AOP.
- одноэлементный шаблон проектирования: Bean-компоненты в Spring по умолчанию являются синглтонами.
-
Шаблон метода шаблона: весной
jdbcTemplate
,hibernateTemplate
Для классов, которые работают с базой данных, которые заканчиваются на Template, они используют шаблон шаблона. - шаблон оформления обертки: Наш проект должен подключаться к нескольким базам данных, и разные клиенты будут получать доступ к разным базам данных в соответствии со своими потребностями при каждом посещении. Этот режим позволяет нам динамически переключаться между различными источниками данных в соответствии с потребностями клиента.
- Шаблон наблюдателя:Модель Spring, управляемая событиями, — это классическое применение шаблона наблюдателя.
-
режим адаптера: Улучшение или совет Spring AOP использует режим адаптера, а адаптация режима адаптера также используется в Spring MVC.
Controller
. - ......
В чем разница между @Component и @Bean?
- Различные объекты:
@Component
Аннотации работают с классами, а@Bean
Аннотации применяются к методам. -
@Component
Обычно автоматически определяется и автоматически подключается к контейнеру Spring с помощью сканирования пути к классам (мы можем использовать@ComponentScan
Аннотация определяет путь для сканирования, из которого можно определить классы, которые должны быть автоматически подключены к контейнеру bean-компонентов Spring).@Bean
Аннотация обычно определяется в методе, отмеченном аннотацией для создания этого компонента.@Bean
Скажите Spring, что это пример определенного класса, и верните его мне, когда мне нужно будет его использовать. -
@Bean
Коэффициент аннотацииComponent
Аннотации более настраиваемы, и во многих местах мы можем передать только@Bean
Аннотация для регистрации бинов. Например, когда мы ссылаемся на классы в сторонних библиотеках, которые необходимо собрать дляSpring
контейнер, вы можете только пройти@Bean
реализовать.
@Bean
Пример использования аннотаций:
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
Приведенный выше код эквивалентен следующей конфигурации xml.
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
Следующий пример через@Component
невозможно.
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
Каковы аннотации для объявления класса как компонента Spring?
Обычно мы используем@Autowired
Annotation autowires bean-компоненты, чтобы пометить класс как доступный для@Autowired
Аннотируйте класс автосвязанного компонента, чего можно добиться с помощью следующих аннотаций:
-
@Component
: Общая аннотация, которая может помечать любой класс какSpring
компоненты. Если неизвестно, принадлежит ли bean-компонент слою, вы можете использовать@Component
Аннотация аннотация. -
@Repository
: соответствующий уровень сохраняемости — это уровень Dao, который в основном используется для операций, связанных с базой данных. -
@Service
: Что касается сервисного уровня, он в основном включает в себя некоторую сложную логику и должен использовать уровень Dao. -
@Controller
: в соответствии с уровнем управления Spring MVC основной пользователь принимает запросы пользователей и вызывает уровень службы для возврата данных на интерфейсную страницу.
Сколько способов Spring управляет транзакциями?
- Программные транзакции, жестко запрограммированные в коде. (устарело)
- Декларативные транзакции, настроенные в файле конфигурации (рекомендуется)
Существует два типа декларативных транзакций:
- Декларативные транзакции на основе XML
- Декларативная транзакция на основе аннотаций
Каковы уровни изоляции весной транзакции?
В интерфейсе TransactionDefinition определены пять констант, представляющих уровни изоляции:
- TransactionDefinition.ISOLATION_DEFAULT:Используйте уровень изоляции по умолчанию для серверной базы данных, уровень изоляции REPEATABLE_READ, принятый Mysql по умолчанию, и уровень изоляции READ_COMMITTED, принятый Oracle по умолчанию.
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED:Самый низкий уровень изоляции, позволяющий читать незафиксированные изменения данных,Может вызвать грязное чтение, фантомное чтение или неповторяющееся чтение.
- TransactionDefinition.ISOLATION_READ_COMMITTED:Позволяет читать данные, которые были зафиксированы параллельными транзакциями,Грязные чтения можно предотвратить, но фантомные или неповторяющиеся чтения все же могут происходить.
- TransactionDefinition.ISOLATION_REPEATABLE_READ:Результаты многократного чтения одного и того же поля согласуются, если только данные не изменены самой транзакцией.Грязные чтения и неповторяющиеся чтения можно предотвратить, но фантомные чтения все еще могут возникать.
- TransactionDefinition.ISOLATION_SERIALIZABLE:Самый высокий уровень изоляции, полностью соответствующий уровню изоляции ACID. Все транзакции выполняются одна за другой, так что абсолютно исключена возможность вмешательства между транзакциями, т.е.Этот уровень предотвращает грязные чтения, неповторяемые чтения и фантомные чтения.. Но это серьезно повлияет на производительность программы. Обычно этот уровень также не используется.
Каково поведение распространения транзакций в транзакциях Spring?
Ситуации, поддерживающие текущую транзакцию:
- TransactionDefinition.PROPAGATION_REQUIRED:Если транзакция уже существует, присоединиться к ней, если текущей транзакции нет, создать новую транзакцию.
- TransactionDefinition.PROPAGATION_SUPPORTS:Если в данный момент есть транзакция, присоединиться к транзакции; если текущей транзакции нет, продолжить работу в нетранзакционном режиме.
- TransactionDefinition.PROPAGATION_MANDATORY:Если в данный момент есть транзакция, присоединиться к транзакции; если текущей транзакции нет, сгенерировать исключение. (обязательно: обязательно)
Когда текущая транзакция не поддерживается:
- TransactionDefinition.PROPAGATION_REQUIRES_NEW:Создайте новую транзакцию и приостановите текущую транзакцию, если есть текущая транзакция.
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED:Запустить в нетранзакционном режиме, приостановить текущую транзакцию, если текущая транзакция есть.
- TransactionDefinition.PROPAGATION_NEVER:Работает без транзакций и выдает исключение, если транзакция уже существует.
Другие случаи:
- TransactionDefinition.PROPAGATION_NESTED:Если в данный момент транзакция существует, транзакция создается для выполнения как вложенная транзакция текущей транзакции; если текущей транзакции нет, значение эквивалентно TransactionDefinition.PROPAGATION_REQUIRED.
Ссылаться на
- "Инсайдер весенних технологий"
- woo woo woo.cn blog on.com/Мы должны думать об этом все время/боимся/8…
- woohoo.journal Dev.com/2696/spring…
- Woohoo.Quota Hot Card.co/blog/inter V…
- как это сделать на java.com/interview - пожалуйста...
- Woohoo.Tom Ashizura.com/2014/02/09/…
- stackoverflow.com/questions/3…
публика
Если вы хотите следить за моими обновленными статьями и делиться галантерейными товарами в режиме реального времени, вы можете подписаться на мой официальный аккаунт.
«Нападение на Java-интервью»:"Java Interview Assault" V2.0 PDF-версия, полученная из этого документа для интервью.публикаФоновый ответ"Блиц-интервью по Java"Получите это бесплатно!
Важные учебные ресурсы для Java-инженеров:Некоторые Java-инженеры обычно используют ключевые слова для фонового ответа общедоступной учетной записи учебных ресурсов."1"Вы можете получить его бесплатно без каких-либо уловок.