предисловие
Поскольку Spring Boot используется все шире и шире, Spring Boot стал источником знаний для Java-программистов, на которых можно взять интервью.Многие студенты не имеют глубокого понимания Spring Boot, и их часто утомляют несколько сериалов!
Например, следующие вопросы и ответы по Spring Boot:
В: Как вы думаете, что является самым большим преимуществом Spring Boot?
Ответ. Самым большим преимуществом Spring Boot является «конвенция над конфигурацией». «Соглашение важнее конфигурации» — это парадигма разработки программного обеспечения, в которой разработчики программируют согласованным образом, сокращая количество решений, которые должен принять разработчик программного обеспечения, и получая преимущества простоты без потери гибкости.
В: Где находится конкретный продукт «соглашение о конфигурации» в Spring Boot?
Ответ: Spring Boot Starter и Spring Boot Jpa — все это проявления «соглашения над конфигурацией». Все они разработаны на основе дизайнерской идеи «соглашение над конфигурацией». Spring Boot Starter инициализирует ресурсы в соответствии с согласованной информацией во время процесса запуска; Spring Boot Jpa автоматически генерирует Sql с помощью согласованного метода, чтобы избежать написания большого количества недопустимого кода. . Подробнее см.: Почему Spring Boot так популярен?
В: Как работает Spring Boot Starter?
Ответ: Spring Boot при запуске выполнит следующие действия:
-
① Spring Boot будет искать файл resources/META-INF/spring.factories в зависимом стартовом пакете при запуске, а затем сканировать пакет Jar, от которого зависит проект, в соответствии с пакетом Jar, настроенным в файле.
-
② Загрузить класс AutoConfigure в соответствии с конфигурацией spring.factories.
-
③ В соответствии с условиями аннотации @Conditional выполнить автоматическую настройку и внедрить Bean-компонент в контекст Spring.
Подводя итог, на самом деле, когда Spring Boot запускается, он считывает информацию о конфигурации Spring Boot Starter в соответствии с соглашением, а затем инициализирует ресурсы в соответствии с информацией о конфигурации и внедряет их в контейнер Spring. Таким образом, после запуска Spring Boot все ресурсы будут подготовлены, и соответствующие ресурсы bean-компонента могут быть внедрены непосредственно во время использования.
Это всего лишь простой вопрос и ответ из трех серий, я не знаю, сколько студентов смогут ответить на него полностью.
На самом деле, в Spring Boot есть много технических моментов, которые можно изучить.Сегодня я собрал для вас десять часто задаваемых вопросов для интервью по Spring Boot, надеясь помочь вам в последующих интервью.
1. Как реализована автоматическая настройка Spring Boot?
Начальная аннотация проекта Spring Boot: @SpringBootApplication, фактически она состоит из следующих трех аннотаций:
-
@Configuration
-
@ComponentScan
-
@EnableAutoConfiguration
Среди них @EnableAutoConfiguration — это вход для реализации автоматической настройки.Эта аннотация импортирует AutoConfigurationImportSelector через аннотацию @Import и загружает информацию о конфигурации META-INF/spring.factories в этом классе. Затем отфильтруйте данные с помощью EnableAutoConfiguration в качестве ключа, загрузите их в контейнер IOC и реализуйте функцию автоматической настройки!
2. Что такое встроенный сервер? Почему мы должны использовать встроенный сервер?
Подумайте о том, что нужно для развертывания приложения на вашей виртуальной машине.
Шаг 1: Установите Java
Часть 2. Установите веб-сервер или сервер приложений (Tomat/Wbesphere/Weblogic и т. д.)
Часть 3. Развертывание пакета войны приложений
Если мы хотим упростить эти шаги, как нам это сделать?
Давайте подумаем, как сделать серверную часть приложения?
Вам нужна только виртуальная машина с установленной Java, и вы можете развертывать приложения прямо на ней,
Разве это не круто?
Эта идея лежит в основе встроенных серверов.
Когда мы создаем развертываемое приложение, мы встраиваем сервер (например, tomcat) в развертываемый сервер.
Например, для приложения Spring Boot можно сгенерировать jar-файл приложения, включающий Embedded Tomcat. Вы можете запускать веб-приложение так же, как обычное приложение Java.
Встроенный сервер — это место, где наш исполняемый модуль содержит двоичные файлы сервера (например, tomcat.jar).
3. Микросервисы одновременно вызывают несколько интерфейсов. Как они могут поддерживать транзакции?
Поддержка распределенных транзакций может быть решена путем интеграции Aatomikos со Spring Boot, но я вообще не рекомендую этот метод, потому что использование распределенных транзакций увеличит время отклика на запросы и повлияет на TPS системы. Как правило, в практической работе для обработки распределенных транзакций используется механизм компенсации сообщений.
4. Какая связь между shiro, oauth и cas? Спросите, как устроены разрешения вашей компании и в чем разница между этими понятиями.
cas и oauth — это компоненты, которые решают проблему единого входа, а shiro в основном отвечает за безопасность разрешений, поэтому функциональные точки несовместимы. Но часто необходимо использовать единый вход и контроль разрешений вместе, поэтому существуют комбинации, такие как cas+shiro или oauth+shiro.
Токен обычно создается сервером после входа клиента в систему. Он будет проверяться каждый раз при доступе к серверу. Как правило, его можно сохранить в памяти или поместить на другой носитель; Redis может выполнять совместное использование сеансов. , если на внешнем веб-сервере есть несколько. Это обычно используется в этом сценарии, но необходимо, чтобы пользователь оставался в системе.
Наша компания использует oauth+shiro для управления фоновыми разрешениями. oauth отвечает за унифицированную аутентификацию при входе в несколько фонов, а shiro отвечает за предоставление различных разрешений доступа вошедшим в систему пользователям.
5. Как выбрать между Restful и Rpc для связи между сервисами?
В традиционном управлении SOA в основном используется rpc; Spring Cloud по умолчанию использует restful для связи между сервисами. Эффективность rpc-коммуникации будет выше, чем у restful, но для большинства компаний эта эффективность мало что дает. Я рекомендую использовать restful, с помощью которого легко общаться между сервисами, реализованными на разных языках.
6. Как спроектировать службу без сохранения состояния?
Для сервисов без сохранения состояния, прежде всего, что такое состояние: если данные должны быть разделены несколькими сервисами для выполнения транзакции, то эти данные называются состоянием. В свою очередь службы, которые полагаются на эти данные о состоянии, называются службами с отслеживанием состояния, и наоборот — службами без сохранения состояния.
Тогда этот принцип обслуживания без сохранения состояния не означает, что состояние не разрешено в архитектуре микросервиса, но реальный смысл выражения состоит в том, чтобы изменить бизнес-службу с отслеживанием состояния на вычислительную службу без сохранения состояния, после чего данные о состоянии будут перенесены в соответствующий сервис. соответствующая «Служба данных с отслеживанием состояния».
Описание сценария. Например, кэш данных и кэш сеансов, которые мы ранее создали в локальной памяти, следует перенести в распределенный кэш для хранения в текущей архитектуре микрослужб, чтобы бизнес-служба стала вычислительным узлом без сохранения состояния. После миграции можно обеспечить динамическое масштабирование по запросу, а приложения микрослужб могут динамически добавлять или удалять узлы во время выполнения, поэтому нет необходимости думать, как синхронизировать кэшированные данные.
7. Каковы три общих аннотации кэша и значения Spring Cache?
@Cacheable используется для объявления того, что метод кэшируется, а результат сохраняется в кеше, чтобы последующие вызовы с теми же параметрами не требовали выполнения фактического метода и напрямую извлекали значение из кеша.
@CachePut, перед выполнением метода, аннотированного @CachePut, не будет проверять, есть ли в кеше ранее выполненный результат, а будет выполнять метод каждый раз, и сохранять результат выполнения в виде пары ключ-значение в указанном в кеше.
@CacheEvict используется для обозначения метода или класса, которому необходимо очистить элемент кеша. Когда он отмечен для класса, это означает, что выполнение всех методов в нем вызовет операцию очистки кеша.
8. Как Spring Boot поддерживает междоменные запросы?
В целях безопасности современные браузеры должны соблюдать политику одного и того же происхождения при выполнении HTTP-запросов, в противном случае это междоменный HTTP-запрос, который по умолчанию запрещен, с разными IP (доменными именами) или разными портами и разными протоколами ( такие как HTTP, HTTPS) вызовут междоменные проблемы.
Общие интерфейсные решения включают в себя:
-
① Используйте JSONP для поддержки междоменных запросов Принцип JSONP, реализующий междоменные запросы, заключается в простом динамическом создании
<script>
пометить, а затем использовать<script>
SRC не подчиняется политике одного и того же источника для получения данных между доменами. Недостатком является то, что серверная часть должна взаимодействовать с выводом конкретной возвращаемой информации. -
② Используйте механизм прокси-реакции для решения проблемы междоменного доступа.Когда делается внешний запрос, запрос сначала отправляется на внутренний сервер с тем же исходным адресом, а внутренний запрос перенаправляется на избегать междоменного доступа.
Позже HTML5 поддерживал протокол CORS. CORS — это стандарт W3C, полное название которого — «Совместное использование ресурсов между источниками» (Cross-origin resource sharing), который позволяет браузерам выдавать запросы XMLHttpRequest к серверам из разных источников, тем самым преодолевая ограничение, согласно которому AJAX может использоваться только того же происхождения. Он сообщает клиенту о междоменных ограничениях, добавляя к серверу специальный заголовок [Access-Control-Allow-Origin]. Если браузер поддерживает CORS и считает, что Origin передан, он позволит XMLHttpRequest инициировать междоменные запросы. .
Если внешний интерфейс использует протокол CORS, серверная часть должна быть настроена на поддержку запросов с разными источниками.Существует два способа поддержки Spring Boot запросов с разными источниками.
Сначала настройте CorsFilter.
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.setAllowCredentials(true);
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.addExposedHeader("*");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}
}
Приведенный выше фрагмент кода необходимо настроить. Второй способ немного проще.
Во-вторых, в классе запуска добавьте:
public class Application extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedHeaders("*")
.allowedOrigins("*")
.allowedMethods("*");
}
}
9. В чем разница между JPA и Hibernate? Может ли JPA поддерживать динамический SQL?
JPA сама по себе является спецификацией, а ее сущностью является спецификация ORM (не фреймворк ORM, поскольку JPA не предоставляет реализацию ORM, а только делает спецификацию). Поскольку JPA является спецификацией, она лишь предоставляет некоторые связанные интерфейсы. Интерфейс нельзя использовать напрямую.Нижний уровень JPA нуждается в какой-то реализации JPA.Hibernate — это набор реализации JPA.
JPA создает соответствующие таблицы и поля в соответствии с аннотациями классов сущностей.Если вам нужно динамически создавать таблицы или поля, вам необходимо динамически создавать соответствующие классы сущностей, а затем снова вызывать Jpa, чтобы обновить всю сущность. Динамический SQL лучше всего поддерживает mybatis, и jpa тоже может его поддерживать, но он не такой гибкий, как Mybatis.
10. Какая связь между Spring, Spring Boot и Spring Cloud?
Сначала две основные функции Spring, Spring Ioc и Spring Aop, создали Spring.Непрерывное развитие Spring в этих двух основных функциях привело к созданию ряда замечательных продуктов, таких как Spring Transaction и Spring Mvc, которые в конечном итоге превратили Spring. в более поздний период Spring может решить практически все проблемы в развитии предприятия.
Spring Boot разработан на основе мощной экологии Spring Empire.Изобретение Spring Boot не для замены Spring, а для того, чтобы людям было проще использовать Spring.
Spring Cloud — это упорядоченный набор фреймворков. Он использует удобство разработки Spring Boot для тонкого упрощения разработки инфраструктуры распределенной системы, такой как регистрация обнаружения служб, центр конфигурации, шина сообщений, балансировка нагрузки, автоматический выключатель, мониторинг данных и т. д., все из которых можно сделать в Стиль разработки Spring Boot для запуска и развертывания одним щелчком мыши.
Spring Cloud — это среда разработки для ряда функций, предназначенных для управления услугами в архитектуре микросервисов, а Spring Cloud полностью разработан на основе Spring Boot. Spring Cloud использует функции Spring Boot для интеграции превосходных компонентов в отрасли с открытым исходным кодом и предоставления общий внешний Набор решений для управления услугами в микросервисной архитектуре.
Выразите отношения между ними набором необоснованных отношений сдерживания.
Spring ioc/aop > Spring > Spring Boot > Spring Cloud
Если вам понравилась моя статья, обратите внимание на мой публичный номер