15 часто задаваемых вопросов о классическом весеннем интервью

Java Spring

Систематические знания и вопросы для интервью по изучению 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主要模块

  • Весеннее ядро:По сути, можно сказать, что все остальные функции 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:

Spring IOC的初始化过程

Чтение исходного кода IOC

AOP

АОП (аспектно-ориентированное программирование: аспектно-ориентированное программирование) может сделать тех, кто не имеет отношения к бизнесу,Однако он инкапсулируется логикой или ответственностью (например, обработка транзакций, управление журналами, контроль разрешений и т. д.), обычно вызываемой бизнес-модулями.,легкоУменьшить дублирование кода в системе,Уменьшите связь между модулямиХорошо для будущей масштабируемости и ремонтопригодности.

Spring AOP основан на динамическом прокси, если проксируемый объект реализует интерфейс, то Spring AOP будет использоватьJDK Proxy, для создания прокси-объектов и для объектов, которые не реализуют интерфейсы, JDK Proxy нельзя использовать для проксирования.В настоящее время Spring AOP будет использоватьCglib, то Spring AOP будет использоватьCglibСоздайте подкласс проксируемого объекта в качестве прокси, как показано на следующем рисунке:

SpringAOPProcess

Конечно, вы также можете использовать 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?

Большую часть времени мы не используем многопоточность в системе, поэтому мало кто будет обращать внимание на эту проблему. Одноэлементные компоненты имеют проблемы с многопоточностью, в основном потому, что когда несколько потоков работают с одним и тем же объектом, операция записи в нестатические переменные-члены этого объекта будет иметь проблемы с безопасностью потоков.

Есть два распространенных решения:

  1. Старайтесь избегать определения изменяемых переменных-членов в объекте Bean (нереалистично).

  2. Определите переменную-член 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 Bean 生命周期

Аналогичная китайская версия:

Spring Bean 生命周期

Расскажите мне о своем понимании 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?

Принцип показан на следующем рисунке:

SpringMVC运行原理

Небольшая опечатка на картинке выше: функция входа Spring MVC также является фронт-контроллером.DispatcherServletЕго роль состоит в том, чтобы получить запрос и ответить с результатом.

Описание процесса (важно):

  1. Клиент (браузер) отправляет запрос, напрямую запрашиваяDispatcherServlet.
  2. DispatcherServletЗвонил по запросу информацииHandlerMapping, который анализирует запрос, соответствующийHandler.
  3. принять соответствующиеHandler(Это то, что мы обычно говоримControllerконтроллер), начните сHandlerAdapterРабота с адаптером.
  4. HandlerAdapterбудет основываться наHandlerВызов реального процессора для обработки запроса и обработки соответствующей бизнес-логики.
  5. После того, как процессор обработает бизнес, он вернетModelAndViewобъект,Modelэто возвращаемый объект данных,Viewявляется логическимView.
  6. ViewResolverпо логикеViewнайти фактическоеView.
  7. DispaterServletположить обратноModelперейти кView(просмотреть визуализацию).
  8. ПучокViewВернуть запрашивающему (браузеру)

Какие шаблоны проектирования используются в среде Spring?

Подробное знакомство со следующими шаблонами проектирования вы можете прочитать в оригинальной статье автора некоторое время назад.«Интервьюер: «Расскажите, какие шаблоны проектирования используются в Spring?». 》.

  • Заводской шаблон проектирования: Spring использует заводской шаблон черезBeanFactory,ApplicationContextСоздайте объект bean.
  • Шаблон проектирования прокси: Реализация функциональности Spring AOP.
  • одноэлементный шаблон проектирования: Bean-компоненты в Spring по умолчанию являются синглтонами.
  • Шаблон метода шаблона: веснойjdbcTemplate,hibernateTemplateДля классов, которые работают с базой данных, которые заканчиваются на Template, они используют шаблон шаблона.
  • шаблон оформления обертки: Наш проект должен подключаться к нескольким базам данных, и разные клиенты будут получать доступ к разным базам данных в соответствии со своими потребностями при каждом посещении. Этот режим позволяет нам динамически переключаться между различными источниками данных в соответствии с потребностями клиента.
  • Шаблон наблюдателя:Модель Spring, управляемая событиями, — это классическое применение шаблона наблюдателя.
  • режим адаптера: Улучшение или совет Spring AOP использует режим адаптера, а адаптация режима адаптера также используется в Spring MVC.Controller.
  • ......

В чем разница между @Component и @Bean?

  1. Различные объекты:@ComponentАннотации работают с классами, а@BeanАннотации применяются к методам.
  2. @ComponentОбычно автоматически определяется и автоматически подключается к контейнеру Spring с помощью сканирования пути к классам (мы можем использовать@ComponentScanАннотация определяет путь для сканирования, из которого можно определить классы, которые должны быть автоматически подключены к контейнеру bean-компонентов Spring).@BeanАннотация обычно определяется в методе, отмеченном аннотацией для создания этого компонента.@BeanСкажите Spring, что это пример определенного класса, и верните его мне, когда мне нужно будет его использовать.
  3. @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?

Обычно мы используем@AutowiredAnnotation autowires bean-компоненты, чтобы пометить класс как доступный для@AutowiredАннотируйте класс автосвязанного компонента, чего можно добиться с помощью следующих аннотаций:

  • @Component: Общая аннотация, которая может помечать любой класс какSpringкомпоненты. Если неизвестно, принадлежит ли bean-компонент слою, вы можете использовать@ComponentАннотация аннотация.
  • @Repository: соответствующий уровень сохраняемости — это уровень Dao, который в основном используется для операций, связанных с базой данных.
  • @Service: Что касается сервисного уровня, он в основном включает в себя некоторую сложную логику и должен использовать уровень Dao.
  • @Controller: в соответствии с уровнем управления Spring MVC основной пользователь принимает запросы пользователей и вызывает уровень службы для возврата данных на интерфейсную страницу.

Сколько способов Spring управляет транзакциями?

  1. Программные транзакции, жестко запрограммированные в коде. (устарело)
  2. Декларативные транзакции, настроенные в файле конфигурации (рекомендуется)

Существует два типа декларативных транзакций:

  1. Декларативные транзакции на основе XML
  2. Декларативная транзакция на основе аннотаций

Каковы уровни изоляции весной транзакции?

В интерфейсе 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.

Ссылаться на

публика

Если вы хотите следить за моими обновленными статьями и делиться галантерейными товарами в режиме реального времени, вы можете подписаться на мой официальный аккаунт.

«Нападение на Java-интервью»:"Java Interview Assault" V2.0 PDF-версия, полученная из этого документа для интервью.публикаФоновый ответ"Блиц-интервью по Java"Получите это бесплатно!

Важные учебные ресурсы для Java-инженеров:Некоторые Java-инженеры обычно используют ключевые слова для фонового ответа общедоступной учетной записи учебных ресурсов."1"Вы можете получить его бесплатно без каких-либо уловок.

我的公众号