10 минут, чтобы объяснить 7 основных моментов, связанных с семейством корзин Spring.

Spring

Фреймворк Spring пользуется популярностью у разработчиков с момента его создания, и некоторые люди ласково называют его Spring Family Bucket. В него входят такие решения, как SpringMVC, SpringBoot, Spring Cloud, Spring Cloud Dataflow и т. д.

Многие разработчики считают spring лучшим java-проектом в своем сознании, и нет ни одного.

Так что это ключевой и сложный момент, вы должны знать это на работе, и вы должны проверить это на собеседовании.

Итак, потратьте 10 минут сегодня, чтобы разобраться в знаниях, связанных со Spring framework..

1. Очки знаний Spring - Резюме


Весенняя серия содержит множество проектов, отвечающих всем аспектам Java-разработки.

Давайте сначала посмотрим на сводку точек знаний распространенных фреймворков, как показано на рисунке:

Ⅰ 5 наиболее часто используемых пружинных каркасов


1.spring framework

То есть среда Spring, о которой мы часто говорим, включая внедрение зависимостей ioc, контекст контекста, управление bean-компонентами, springmvc и многие другие функциональные модули, другие проекты Spring, такие как spring boot, также будут зависеть от среды Spring.

2.spring boot

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

Основная идея Spring Boot заключается в том, что соглашение больше, чем конфигурация, и приложению требуется лишь небольшая конфигурация, что упрощает режим разработки приложения.

3.Spring Data

Это набор инструментов для доступа к данным и работы с ними, который инкапсулирует возможности работы с различными источниками данных, в том числе: jdbc, Redis, MongoDB и т. д.

4.Spring Cloud

Это полный набор микросервисных решений и набор микросервисных фреймворков с различными функциями. Spring Cloud, основанный на Spring Boot, упрощает разработку распределенных систем и интегрирует различные возможности управления службами, такие как обнаружение служб, управление конфигурацией, шина сообщений, балансировка нагрузки, автоматические выключатели и мониторинг данных. Например, sleuth предоставляет возможности полного отслеживания ссылок, а пакет Netflix предоставляет множество компонентов управления, таких как автоматические выключатели hystrix и шлюзы zuul. Компонент конфигурации предоставляет возможности динамической настройки, а компонент шины поддерживает использование RabbitMQ, kafka, Activemq и других очередей сообщений для реализации обмена событиями между распределенными службами.

5. Spring Security

В основном используется для быстрого создания безопасных приложений и сервисов, на основе Spring Boot и Spring Security OAuth2 можно быстро реализовать общие модели безопасности, такие как единый вход, ретрансляция токенов и обмен токенами. Вы можете узнать о механизме авторизации oauth2 и методе аутентификации jwt. oauth2 — это механизм авторизации, который определяет полный процесс авторизации и аутентификации. Полное имя JWT – веб-токен JSON, который представляет собой реализацию аутентификации, включающую информацию об аутентификации в токен. В механизме авторизации oauth2 jwt можно использовать как конкретный метод реализации для аутентификации.

2. Особая роль Struts


struts — это уровень управления в когда-то очень популярной веб-композиции ssh. Мы знаем, что веб-сервисы обычно строятся с использованием многоуровневой модели MVC, то есть уровень модели отвечает за внутреннюю модель данных, контроллер отвечает за управление распределением запросов, а уровень представления отвечает за возврат отображаемого представления. пользователю. Чего достигает Struts, так это роли уровня управления.

Struts реализован фильтром, который перехватывает классы и создает действие для каждого запроса. Комбинация SSH с использованием struts постепенно была заменена комбинацией SSM с использованием springMVC, то есть комбинацией Spring-MVC+Spring+MyBatis, С одной стороны, причина в том, что из-за обработки нескольких уязвимостей безопасности с помощью struts, пострадало всеобщее доверие к struts; с другой стороны, springmvc более гибкий, не требует дополнительной настройки, не имеет таких проблем, как интеграция со spring, и более удобен в использовании, поэтому рекомендуется сосредоточиться на обучении каркаса SSM.

Ⅲ. Распространенная структура ORM.


ORM — это объектно-реляционное сопоставление, которое должно решить проблему несоответствия между объектно-ориентированными и реляционными базами данных. Проще говоря, это преобразование данных в реляционной базе данных в объекты в объектно-ориентированной программе.

Обычно используемыми фреймворками ORM являются Hibernate и MyBatis, которые представляют собой h и m в комбинации ssh и ssm.

Их особенности и отличия заключаются в следующем.:

Hibernate обеспечивает полную инкапсуляцию структуры базы данных, реализует сопоставление между объектами POJO и таблицами базы данных и может автоматически генерировать и выполнять операторы SQL. Пока отношение отображения между POJO и таблицами базы данных определено, операции с базой данных могут выполняться с помощью методов, предоставляемых Hibernate. Hibernate соответствует спецификации JPA, которая представляет собой API Java Persistence Layer.

Mybatis сопоставляет параметры, требуемые SQL, и возвращаемые поля результатов с указанными объектами через файл конфигурации сопоставления.Mybatis не генерирует SQL автоматически, и ему необходимо определить оператор SQL самостоятельно, но его удобнее оптимизировать.

подвести итог:

  1. Конфигурация hibernate намного сложнее, чем у mybatis, а стоимость обучения выше, чем у mybatis. mybatis, простой, эффективный и гибкий, но вам нужно самостоятельно поддерживать sql;
  2. Hibernate является мощным, полностью автоматическим и адаптируемым к различным базам данных, но очень сложным и менее гибким.

Ⅳ. Знакомство с Нетти


Netty — это высокопроизводительная асинхронная управляемая событиями среда сетевого взаимодействия.Netty инкапсулирует собственный NIO JDK, что упрощает разработку сетевых сервисов. Это будет подробно объяснено ниже

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

V. Служба RPC


Motan, Dubbo и gRPC — это широко используемые высокопроизводительные платформы rpc, которые могут предоставить полные возможности управления службами Уровень связи версии java основан на вышеупомянутой реализации Netty. Их характеристики описаны позже.

Ⅵ、Другие часто используемые фреймворки


И jersy, и restEasy — это фреймворки, с помощью которых можно быстро разрабатывать сервисы отдыха.

По сравнению с springmvc эти две платформы основаны на стандарте jax-rs, тогда как springmvcs основан на сервлете и использует собственный встроенный API, который является двумя разными стандартами.

Платформа shiro — это среда управления правами с открытым исходным кодом, аналогичная безопасности Spring для авторизации доступа, аутентификации, шифрования и управления сеансами. Может поддерживать автономное и распределенное управление сеансами.

По сравнению с безопасностью сиро проще в использовании.

2. Очки знаний Spring — подробное объяснение


Ⅰ Основная концепция весны


Sping中的基本概念

Процессы и реализации, описанные в этой статье, по умолчанию основаны на последней версии 5.x.

Вот несколько важных концепций весны:

1.IOC

IOC — это инверсия контроля.Например, в крайнем левом углу возьмем в качестве примера позицию по подбору персонала в компании:

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

В Spring свойства объекта создаются самим объектом, что является прямым процессом, если свойства не создаются объектами, а автоматически собираются Spring, это инверсия управления. DI здесь также является внедрением зависимостей, что является способом достижения инверсии управления. Прямой процесс приводит к сильной связи между объектами и объектами, IOC может решить проблему связи объектов, что способствует повторному использованию функций и может сделать структуру программы очень гибкой.

2.контекстный контекст и компоненты

Spring использует две концепции для реализации IOC: контекст и bean-компоненты.

Как показано на средней диаграмме, все объекты, управляемые Spring и созданные Spring для внедрения зависимостей, называются bean-компонентами. После того, как Spring создаст и завершит внедрение зависимостей, все bean-компоненты управляются в контексте, называемом context.

3.AOP

АОП — это аспектно-ориентированное программирование. Как показано на рисунке справа, общий процесс выполнения программы заключается в вызове уровня службы с уровня контроллера, затем уровень службы вызывает уровень DAO для доступа к данным и, наконец, слой за слоем возвращает результаты.

Это вертикальная обработка в порядке выполнения программы, как показано стрелкой вниз на рисунке. Однако в системе будет несколько различных сервисов, таких как пользовательские сервисы, сервисы информации о товарах и т. д. Уровень контроллера каждого сервиса должен проверять параметры и обрабатывать исключения. Вертикальный поток обработки сквозной, а общие функции завершено на каждом аспекте, таком как аутентификация личности, параметры проверки, обработка исключений и т. д., так что одну и ту же логику не нужно писать в каждой службе, это решение идеи АОП Проблема.

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

Ⅱ, пружинный каркас


Spring框架组件

На приведенном выше рисунке перечислены основные компоненты пружинного каркаса. Эта картинка из документации spring4.x. Компонент портлета справа в последней версии 5.x устарел, и был добавлен компонент WebFlux для асинхронной реактивной обработки.

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

Красная рамка на рисунке — более важный компонент.Основной компонент — это ядро ​​всех компонентов Spring, bean-компонент и контекстный компонент, о которых я только что упомянул, являются основой для реализации IOC и внедрения зависимостей, AOP-компоненты используются для реализации аспектно-ориентированное программирование, веб-компоненты включают springmvc — это реализация уровня управления веб-службами.

Ⅲ. Механизм Spring и реализация


1.AOP

Реализация АОП осуществляется через режим прокси, когда вызывается метод объекта, выполняется вставленная логика аспекта. Путь реализации — динамический прокси, также называемый расширением времени выполнения, например jdk proxy, CGLIB; статический прокси — переплетение во время компиляции или загрузки класса, например AspectJ.

Что касается АОП, вам также необходимо знать соответствующий Аспект, точку, совет и другие аннотации и особенности использования.

2.динамическая замена placeHolder

Основная необходимость знать, когда происходит замена, — это после создания определения компонента и до его инициализации путем реализацииBeanFactoryPostProcessorреализован интерфейс. Основными методами реализации являютсяPropertyPlaceholderConfigurerиPropertySourcesPlaceholderConfigurer. Логика реализации этих двух классов отличается, Spring Boot используетPropertySourcesPlaceholderConfigurerвыполнить.

3. Дела

Вам необходимо понимать тип изоляции и тип распространения транзакций, указанные для транзакций в spring. Чтобы знать, что уровень изоляции транзакции реализуется конкретной базой данных, я подробно расскажу об этом в разделе базы данных.

Тип распространения транзакции, вы можете сосредоточиться на наиболее часто используемых типах REQUIRED и SUPPORTS.

4. Основной класс интерфейса

  • ApplicationContext сохраняет весь контекст приложения ioc, и вы можете получить любой bean-компонент через beanfactory в нем;
  • Основная функция BeanFactory заключается в создании определенных bean-компонентов в соответствии с определением bean-компонента;
  • BeanWrapper — это оболочка для bean-компонентов, которая обычно используется внутри Spring ioc.Он предоставляет такие функции, как доступ к значениям свойств bean-компонентов, регистрация редактора свойств и преобразование типов, чтобы контейнер ioc мог обращаться к свойствам bean-компонентов унифицированным способом;
  • FactoryBean возвращает фактический объект bean через метод getObject.Например, динамический прокси реферера к сервису во фреймворке motan реализуется через FactoryBean.

5.Scope

Область действия компонента относится к области действия компонента.По умолчанию это одноэлементный режим, который также является наиболее часто используемым методом; многоэкземплярный режим, то есть каждый раз, когда компонент получается из beanFactory, будет создан новый бин.

Запрос, сеанс и глобальный сеанс — это области, используемые в веб-службах. Запрос создает экземпляр для каждого запроса. Сеанс гарантированно имеет только один экземпляр в цикле сеанса.

Глобальный сеанс больше не используется в версии 5.x, и добавлены две области, Application и Websocket, чтобы гарантировать, что только один экземпляр создается в ServletContext и WebSocket соответственно.

6. Механизм событий

Механизм событий Spring должен знать пять стандартных событий, определенных Spring.Конкретные события можно увидеть на рисунке выше, чтобы узнать, как настраивать события и реализовывать соответствующий applicationListener для обработки пользовательских событий.

Ⅳ. Spring приложение, связанное с


1. Общие примечания

А. Введите аннотации класса:

Аннотации классов типов включают контроллер, службу и т. д., которые необходимо понимать.

Разница между компонентными и bean-аннотациями заключается в следующем:

  • Использование аннотации @Component для класса указывает, что класс является классом компонентов и требует, чтобы Spring создал bean-компоненты для этого класса.
  • Аннотация @Bean используется в методе, чтобы сообщить Spring, что этот метод вернет объект Bean, и возвращаемый объект должен быть зарегистрирован в контексте приложения Spring.

Б. Установить аннотации класса

Сосредоточьтесь на понимании @Autowire и @Qualifier и различных механизмов автоматического связывания, таких как bytype и byname.

аннотация класса c.web

В основном сосредоточьтесь на понимании, обратите внимание на аннотации сопоставления путей, такие как @RequestMapping, @GetMapping, @PostMapping, и аннотации получения параметров, такие как @PathVariable и @RequestParam.

г. Аннотации функциональных классов

Включая эталонную конфигурацию @ImportResource, автоматическое сканирование аннотации @ComponentScan, аннотацию транзакции @Transactional и т. д., я не буду вводить их здесь по отдельности.

2. Метод конфигурации

Вам нужно понять несколько способов настройки spring, конфигурации файла xml, конфигурации аннотаций и конфигурации с использованием API.

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

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

V. Процесс инициализации контекста Spring


Spring Context初始化流程

В левом верхнем углу рисунка показаны три типа контекста, контекст конфигурации xml, контекст springboot и контекст веб-сервисов. Независимо от контекста, после создания будет вызываться метод обновления класса AbstractApplicationContext, который и находится в центре внимания нашего анализа.

В методе обновления операция разделена на 13 шагов.:

шаг 1: подготовка к обновлению, включая настройку времени начала, настройку состояния активации и инициализацию заполнителей в контекстной среде.Это действие выполняется подклассом в соответствии с потребностями подкласса, а затем проверяется, отсутствуют ли необходимые свойства ;

Шаг 2: обновить и получить внутреннюю фабрику компонентов;

Шаг 3: Подготовить фабрику компонентов, например, настроить загрузчики классов и постпроцессоры, настроить типы, которые не подключаются автоматически, и зарегистрировать компоненты среды по умолчанию;

Шаг 4: Предоставляет возможность расширения фабрики компонентов постобработки для подклассов контекста. Если подкласс хочет выполнить некоторую специальную логику после загрузки определения компонента и до начала инициализации контекста, он может переопределить этот метод;

Шаг 5, выполнить процессор суффиксов фабрики компонентов, зарегистрированный в контексте;

Примечание. Здесь есть два постпроцессора: один — постпроцессор, который может регистрировать bean-компоненты, а другой — постпроцессор, обрабатывающий фабрику bean-компонентов. Порядок выполнения таков, что процессор для регистрируемого компонента выполняется в соответствии с приоритетом, а процессор для beanfactory выполняется в соответствии с приоритетом.

Для Springboot этот шаг будет анализировать определение bean-компонента аннотации. Процесс показан в маленьком поле справа, он запущен ConfigurationClassPostProcessor, проанализирован ClassPathBeanDefinitionScanner и зарегистрирован в фабрике компонентов.

Шаг 6: Зарегистрируйте процессор суффикса компонента в beanfactory в порядке приоритета, и постпроцессор компонента может выполнять обработку до и после инициализации компонента;

Шаг 7: Инициализировать источник сообщения, который используется для поддержки интернационализации сообщения;

Шаг 8: Инициализирует передатчик событий приложения. Распространитель событий используется для уведомления applicationListener о событиях, генерируемых различными приложениями, что является стандартным шаблоном наблюдателя;

Шаг 9: это шаг расширения, зарезервированный для подклассов, позволяющий определенным контекстным подклассам инициализировать другие компоненты;

Шаг 10: Зарегистрируйте bean-компонент, который реализует ApplicationListener, в вещателе событий и уведомляйте о ранних нерассылаемых событиях в вещателе;

Шаг 11: Заморозить все изменения информации описания компонентов и создать экземпляры одноэлементных компонентов без ленивой загрузки;

Шаг 12: завершите обновление контекста, вызовите метод onFresh() класса LifecycleProcessor и опубликуйте событие ContextRefreshedEvent;

Шаг 13: Наконец, выполните тринадцатый шаг, чтобы сбросить общедоступный кеш, такой как кеш в ReflectionUtils, кеш в AnnotationUtils и т. д.;

На этом инициализация контекста spring завершена. Здесь представлен только основной основной процесс.Рекомендуется прочитать исходный код после урока, чтобы просмотреть этот пункт знаний и уточнить детали.

Ⅵ、Жизненный цикл фасоли весной


Spring中bean的生命周期

Жизненный цикл бобов часто спрашивают в интервью, сначала посмотрите на зеленую часть, процесс создания бобов.:

шаг 1: вызвать конструктор компонента для создания компонента;

Шаг 2: внедрение зависимостей свойств путем вызова метода установки через отражение;

Шаг 3: если реализован интерфейс BeanNameAware, будет установлено имя бина;

Шаг 4: если BeanFactoryAware реализован, фабрика компонентов будет установлена ​​на компонент;

Шаг 5: если реализован ApplicationContextAware, для компонента будет установлен ApplicationContext;

Шаг 6: если реализован интерфейс BeanPostProcessor, выполняется метод предварительной обработки;

Шаг 7: если интерфейс InitializingBean реализован, выполните метод afterPropertiesSet;

Шаг 8: выполнить пользовательский метод инициализации;

Шаг 9: выполнить метод постобработки интерфейса BeanPostProcessor.

На этом процесс создания бина завершен.

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

В этой части также рекомендуется прочитать исходный код, чтобы углубить ваше понимание.

VII. Интерфейс расширения Spring


Spring扩展接口

При настройке расширения функции Spring вы можете выбрать следующие точки расширения:

1.BeanFactoryPostProcessor

Это постпроцессор beanFactory, который поддерживает некоторую дополнительную обработку фабрики компонентов после завершения стандартной инициализации фабрики компонентов. Я представил его, когда говорил о процессе инициализации контекста.На данный момент вся информация описания компонента загружена, но инициализация компонента еще не выполнена. Например, вышеупомянутый PropertyPlaceholderConfigurer заменяет заполнители в свойствах компонента в этой точке расширения.

2.BeanDefinitionRegistryPostProcessor

Он расширяется от BeanFactoryPostProcessor и предоставляет возможность добавлять определения bean-компонентов перед выполнением функций BeanFactoryPostProcessor, позволяя регистрировать дополнительные bean-компоненты перед инициализацией обычных bean-компонентов. Например, здесь можно создать новый прокси-компонент на основе области действия компонента.

3.BeanPostProcessor

Предоставляет возможность вставлять пользовательскую логику до и после инициализации компонента. Отличие BeanFactoryPostProcessor в том, что обрабатываются разные объекты: BeanFactoryPostProcessor обрабатывает beanfactory, а BeanPostProcessor обрабатывает bean-компоненты.

Примечание. Для указанных выше трех точек расширения порядок выполнения можно указать путем реализации интерфейсов Ordered и PriorityOrdered. Процессоры, реализующие интерфейс PriorityOrdered, будут выполняться перед реализацией интерфейса Ordered.

4.ApplicationContextAware

Вы можете получить ApplicationContext и bean-компоненты в нем.Когда вам нужно динамически получать bean-компоненты в коде, вы можете добиться этого, реализовав этот интерфейс.

5.InitializingBean

Вы можете выполнить определенную логику после завершения инициализации компонента и установки всех свойств, таких как проверка свойств для автоматического связывания и т.д.

6.DisposableBean

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

7.ApplicationListener

Используется для прослушивания стандартных событий приложения Spring или пользовательских событий.

VIII.Опыты знаний, связанные с springboot


1. Запустите процесс

Основные шаги — сначала настроить среду, а затем подготовить контекст контекста, включая выполнение постобработки applicationContext, инициализацию инициализатора и уведомление слушателя об обработке событий contextPrepared и contextLoaded. Наконец, выполните refreshContext — метод обновления класса AbstractApplicationContext, представленный ранее.

2. Файл конфигурации

Тогда вам нужно знать, что в Spring Boot есть два контекста: один — начальная загрузка, а другой — приложение.

Bootstrap — это родительский контекст приложения, что означает, что bootstrap будет загружен до приложения. Bootstrap в основном используется для загрузки информации о конфигурации из дополнительных ресурсов, а также может расшифровывать свойства в локальных внешних файлах конфигурации. Свойства в начальной загрузке будут загружены первыми и не могут быть переопределены той же локальной конфигурацией по умолчанию.

3. Аннотация

@SpringBootApplication содержит три аннотации: @ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration.

Аннотация @SpringBootConfiguration содержит аннотацию @Configuration. То есть функция автоматической настройки springboot.

Аннотация @Conditional — это аннотация, которая управляет действующими условиями автоматической настройки, такими как конфигурация, когда bean-компонент или класс существует или не существует, конфигурация, когда выполняются условия, и так далее.

4. Рекомендуемые модули

  • Starter — это способ бесшовной интеграции функции, предоставляемой springboot.При использовании определенной функции разработчикам не нужно обращать внимание на обработку различных зависимых библиотек и не требуется конкретная информация о конфигурации.Spring Boot автоматически настраивает создание bean-компонентов. Например, когда вам нужно использовать веб-функцию, вам нужно всего лишь добавить в зависимость spring-boot-starter-web.
  • Актуатор используется для мониторинга и управления приложением, а также для мониторинга, аудита и сбора данных о работе приложения с помощью запросов API для отдыха.
  • Devtools обеспечивает поддержку ряда инструментов разработки для повышения эффективности разработки. Например, возможности горячего развертывания и т. д.
  • CLI — это интерфейс командной строки, инструмент командной строки, который поддерживает использование сценариев Groovy и позволяет быстро создавать проекты прототипов Spring.

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

Преимущества читателя:

Делитесь бесплатными учебными материалами

Для программистов Java я здесь, чтобы подготовить бесплатные учебные материалы по архитектуре Java (включая высокую доступность, высокую степень параллелизма, высокую производительность и распределенность, настройку производительности JVM, MyBatis, Netty, Redis, Kafka, Mysql, Zookeeper, Tomcat, данные архитектуры с множеством знаний точки, такие как Docker, Dubbo, Nginx и т. д.)

Почему некоторые люди всегда лучше вас, так это потому, что они сами превосходны и продолжают стремиться стать лучше, а вы по-прежнему довольны существующим положением дел и втайне радуетесь! Я надеюсь, что вы сможете поставить большой палец вверх и подписаться на меня после прочтения этого, и я обновлю техническую галантерейную продукцию в будущем.Спасибо за вашу поддержку!

Метод сбора данных: присоединитесь к группе обмена технологиями Java.963944895,Нажмите, чтобы присоединиться к групповому чату, администратор личного сообщения может получить его бесплатно

Как улучшить качество кода? —— Резюме опыта исследований и разработок от архитекторов Alibaba P8

Alibaba P8 разделяет маршрут обучения архитекторов Java, шестой пункт особенно важен

Восемь инструментов, которые должен знать каждый Java-разработчик

Хотите пройти собеседование на Java-архитектора? Вы знаете все эти основные вещи?

Нарисуйте картину, чтобы найти свою основную конкурентоспособность и превратить кризис среднего возраста в заправочную станцию.

Кризис среднего возраста не бывает, это просто план

Увольнение не является целью холодной зимы, основное внимание уделяется тому, как преодолеть узкое место в карьере.