предисловие
Только лысина может стать сильнее
Оглядываясь назад на фронт:
- Объясни своей девушке, что такое прокси-режим
- Режим упаковки так прост
- Сколько способов вы знаете шаблон singleton?
- Вы понимаете заводскую схему?
Потребовалось некоторое время, чтобы изучить шаблон singleton и шаблон factory, пока чистил книгу Spring, и в целом это того стоило!
Первоначально я хотел переписать статью IOC после того, как закончил главы IOC «Spring Combat (4-е издание)» и «Опыт разработки корпоративных приложений Spring 4.x» и прочитал вводную серию, которую я написал ранее.Достаточно начать работу с SpringиSpring [внедрение зависимостей] так просто. Самые важные моменты знаний уже были рассмотрены, поэтому я чувствую, что нет необходимости переписывать эти пункты знаний...
Я лично не люблю копировать написанное в новую статью, поэтому предлагаю вам сначала прочитать две вышеуказанные статьи, а потом прочитать эту (если вы не читали заводской образец, то обязательно для студентов, которые не читал)~~
- Для целостности пунктов знаний этой статьи важные пункты знаний (понимание концепции IOC, создание Bean, три метода внедрения и т. д.) по-прежнему будут появляться, но код двух вышеупомянутых сообщений в блоге не будет скопирован.
Эта статья в основномДополнить и укрепитьНекоторые из наиболее важных точек знаний, и мы разберем точки знаний о IOC в двух вышеупомянутых книгах и нарисуем их в карте ума, чтобы полностью понять точки знаний Spring IOC!
Тогда давайте начнем Если что-то не так, я надеюсь простить меня много, и не стесняйтесь поправлять меня в области комментариев!
1. Всестороннее понимание Spring IOC
Объединение глав IOC двух книг «Spring Combat (4th Edition)» и «Proficient in Spring 4.x Enterprise Application Development» для организации их знаний~
1.1 Обзор IOC и DI
Определение IOC в «Практике разработки корпоративных приложений Spring4.x» выглядит следующим образом:
IoC (инверсия управления) Инверсия управления включает два аспекта: 1. Управление. 2. Разворот
Мы можем просто думать, что:
- Контроль означает:Контроль текущего объекта над внутренними членами.
- Инверсия означает: этот контрольНе управляется текущим объектомИм управляют другие (классы, сторонние контейнеры).
IOC недостаточно, чтобы сразу перейти к делу, поэтому Мартин Фаулер предложил DI (внедрение зависимостей) для замены IoC, то есть зависимость вызывающего класса от класса реализации интерфейса внедряется третьей стороной (контейнером или совместным классом). для удаления вызывающего класса из определенного интерфейса Зависимости класса реализации интерфейса.
В «Весне в действии (4-е издание)» IOC не упоминается, но прямо упоминается DI:
Через DI зависимости объектов будут устанавливаться сторонним компонентом в системе, который отвечает за координацию каждого объекта при создании объектов.Объекты не должны создавать или управлять своими зависимостями сами по себе, и зависимости будут автоматически внедряться в объекты, которые в них нуждаются.
Мы также можем найти из книги: определение (разницу) IoC и DI не так просто сказать четко. здесь я будупростой отрывокнемного:
- Есть две основные реализации IoC (идея, шаблон проектирования): поиск зависимостей,внедрение зависимости.
- Внедрение зависимостей является более предпочтительным способом (способ его реализации)
Нам ведь и не надо так четко различать, и смешение не влияет на наше понимание...
Затем через то, что я написал вчераВы понимаете заводскую схему?, теперь мы можем ясно видеть, что на самом делеТак называемый контейнер IOC — это большая фабрика[Сторонний контейнер] (Функция, реализованная Spring, очень мощная! Она намного лучше, чем наша собственная рукописная фабрика).
Преимущества использования IOC (известные ответу @Intopass):
- Вам не нужно собирать его самостоятельно, просто используйте его.
- Наслаждайтесь преимуществами синглтона, который эффективен и не занимает много места.
- Он удобен для модульного тестирования и легко переключает фиктивные компоненты.
- Он удобен для выполнения АОП-операций и прозрачен для пользователя.
- Унифицированная конфигурация, легко модифицируемая.
Использованная литература:
- Ууху. Call.com/question/23…-- Каковы преимущества Spring IoC?
1.2 Принцип контейнера МОК
Из вышесказанного было сказано: контейнер IOC на самом деле является большой фабрикой, которая используется для управления всеми нашими объектами и зависимостями.
- Принцип через Javaтехнология отражениячтобы это произошло! Через отражение мы можем получить всю информацию о классе (переменные-члены, имя класса и т. д.)!
- Затем через конфигурационный файл (xml) или аннотацию кописыватьотношения между классами
- Мы можем использовать эту информацию о конфигурации и технологию отражения дляПостроитьИз соответствующих объектов и зависимостей!
Методы, описанные выше, может рассказать любой, кто немного изучил Java, и интервьюер может задать их совершенно неожиданно.ПростойДавайте посмотрим, как фактический контейнер Spring IOC реализует создание объектов и зависимости:
- Создайте реестр определений bean-компонентов внутри контейнера на основе информации о конфигурации bean-компонентов.
- Загрузите, создайте экземпляры bean-компонентов и установите зависимости между bean-компонентами в соответствии с реестром.
- Поместите эти готовые компоненты в пул кеша карты и дождитесь вызова приложения.
Контейнеры Spring (Bean factory) можно просто разделить на два типа:
- BeanFactory
- Это самый простой, ориентированный на Spring
- ApplicationContext
- Он основан на BeanFactory и предназначен для разработчиков, использующих среду Spring. Обеспечивает ряд функций!
почти все приложенияобаИспользуйте контекст приложения!
Система наследования BeanFactory:
Система наследования ApplicationContext:
Среди них есть еще один важный в подклассе ApplicationContext: WebApplicationContext.
- Специально подготовлен для веб-приложений
Слияние веб-приложений с Spring:
Давайте посмотрим на жизненный цикл BeanFactory:
Далее давайте посмотрим на жизненный цикл ApplicationContext:
Процесс инициализации относительно долгий, мы можемКлассификацияразобрать его:
- Собственные методы Бина: Например, вызов конструктора Bean для создания экземпляра Bean, вызов Setter для установки значения свойства Bean и методов, указанных init-method и destroy-method;
- Методы интерфейса жизненного цикла на уровне компонента: Такие интерфейсные методы, как BeanNameAware, BeanFactoryAware, InitializingBean и DisposableBean, напрямую реализуются классом Bean;
- Методы интерфейса жизненного цикла на уровне контейнера: шаги, отмеченные знаком «★» на приведенном выше рисунке, реализуются двумя интерфейсами InstantiationAwareBean PostProcessor и BeanPostProcessor, а их классы реализации обычно называются «»постпроцессор". Интерфейсы постпроцессора, как правило, не реализуются самим bean-компонентом, они независимы от bean-компонента, а класс реализации регистрируется в контейнере Spring в виде вложений контейнера и предварительно идентифицируется для контейнера Spring посредством отражения интерфейса. Когда контейнер Spring создает любой компонент, будут работать все постпроцессоры, поэтому влияние этих постпроцессоров является глобальным.Конечно, пользователи могут разумно писать постпроцессоры, чтобы они обрабатывали только интересующие компоненты.
ApplicationContext и BeanFactoryразницав:
- ApplicationContext будет использовать механизм отражения Java для автоматической идентификации BeanPostProcessor, InstantiationAwareBeanPostProcesso и BeanFactoryPostProcessor, определенных в файле конфигурации.задний,иавтоматически зарегистрировать их в приложенииНиже. И BeanFactory нужно передать кодвызов вручную
addBeanPostProcessor()
способ регистрации - ApplicationContext винициализацияПри применении контекстаПросто создайте экземпляры всех одноэкземплярных bean-компонентов. BeanFactory не создает экземпляр Bean при инициализации контейнера,до того какПри доступе к bean-компоненту в первый разталантСоздайте экземпляр целевого компонента.
С вышеуказанными очками знаний, давайте еще разподробныйДавайте посмотрим на процесс инициализации Bean:
Краткое содержание:
- BeanDefinitionReaderПрочитайте ресурс файла конфигурации, на который указывает ресурс, а затем проанализируйте файл конфигурации. каждый из файлов конфигурации
<bean>
разобрать наОбъект BeanDefinition,испастив BeanDefinitionRegistry; - Контейнер сканирует BeanDefinition в BeanDefinitionRegistry, вызывает InstantiationStrategy.Выполнение работы по созданию экземпляра bean-компонента;использоватьBeanWrapper завершает настройку свойств BeanРабота;
- Пул кэша одноэлементных компонентов: Spring предоставляет кэш для одноэлементных компонентов в классе DefaultSingletonBeanRegistry.регистр, который представляет собой кеш, реализованный с помощью HashMap, Bean-компонента с одним экземпляром.Сохраните в этом HashMap с beanName в качестве ключасередина.
1.3 Компонент сборки контейнера IOC
1.3.1 Метод сборки бобов
Spring 4.x запускает сборку контейнера IOC Bean с4 видаСпособ:
- XML-конфигурация
- аннотация
- JavaConfig
- На основе конфигурации Groovy DSL (это редко)
В общем: собираем Beans с XML конфигурацией + много аннотаций, среди которыхАннотация такова по большей части!
1.3.2 Метод внедрения зависимостей
Существует 3 способа внедрения зависимостей:
-
инъекция свойств--> пройти
setter()
метод инъекций - Внедрение конструктора
- заводской метод впрыска
Обычное использованиеинъекция свойствЭто более гибко и удобно, что является выбором большинства людей!
1.3.3 Связь между объектами
<bean>
Между объектами существует три отношения:
- Зависимость --> Очень редко используется (использование зависимости - это зависимость --> предварительная зависимость [текущий bean-компонент будет инициализирован только после того, как потребуется инициализировать зависимый bean-компонент])
- Наследование --> может быть использовано (укажите абстрактный и родительский для реализации отношения наследования)
- Ссылка --> наиболее распространенная (использование ref является ссылочной связью)
1.3.4 Область действия компонента
Объем компонента:
- Синглтон Синглтон
- несколько прототипов
- Область действия компонента, связанная со средой веб-приложения
- reqeust
- session
Если мы используем область действия bean-компонента, относящуюся к среде веб-приложения, нам необходимоНастройте прокси вручнуюда~
Причина также очень проста: поскольку наш bean-компонент по умолчанию является одноэлементным, чтобы адаптироваться к области bean-компонента, связанной со средой веб-приложения ---> для каждого запроса требуется объект, в настоящее время мывозвращает прокси-объектВыходите и выполняйте наши потребности!
Есть еще одна проблема при настройке bean-компонента как синглтона:
- Если наша конфигурация Bean является одноэлементной, а объект Bean внутриобъект-член, мы хотим быть более чем одним экземпляром. тогда что нам делать? ?
- По умолчанию наш Бин является одноэлементным, и возвращаемый объект-член также является одноэлементным по умолчанию (потому что существует только один объект)!
В этот момент нам нужно использоватьlookup
Инъекция метода также очень проста в использовании, просто посмотрите на пример, чтобы понять:
1.3.6 Обработка неоднозначностей автопроводки
Когда я вчера читал книгу, я только что увидел, что кто-то пригласил меня ответить на этот вопрос о Zhihu:
Объединив знания двух книг, можно свести к двум решениям:
- использовать
@Primary
Аннотация настроена напредпочтительныйИнъецированный боб - использовать
@Qualifier
Настройки аннотацииБин с определенным именемОграничить инъекцию!- Вы также можете использовать пользовательские аннотации для идентификации
1.3.7 Справочные файлы свойств и свойства компонента
При написании файла конфигурации ранее мы напрямую записывали в него информацию о конфигурации нашей базы данных:
На самом деле у нас естьболее элегантный подход: Запишите эту информацию о конфигурации в файл конфигурации (поскольку эта информация о конфигурации может измениться и на нее могут ссылаться несколько файлов конфигурации).
- Таким образом, мыМенять очень удобно.
Данные, ссылающиеся на файл конфигурации, используют${}
Помимо ссылки на данные в файле конфигурации, мы также можемАтрибуты ссылочного bean-компонента:
Свойства ссылочного bean-компонента используют#{}
Этот метод называется Spring EL в Spring in Action Fourth Edition, и он похож на выражения EL, которые мы изучали ранее. Основная функция указана выше. Для более глубокого понимания перейдите по следующей ссылке:
1.3.8 Комбинированный файл конфигурации
Комбинация файлов xml:
То, как xml и javaconfig сочетаются друг с другом:
public static void main(String[] args) {
//1.通过构造函数加载配置类
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);
//2.通过编码方式注册配置类
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(DaoConfig.class);
ctx.register(ServiceConfig.class);
ctx.refresh();
//3.通过XML组装@Configuration配置类所提供的配置信息
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/smart/conf/beans2.xml");
//4.通过@Configuration组装XML配置所提供的配置信息
ApplicationContext ctx = new AnnotationConfigApplicationContext(LogonAppConfig.class);
//5.@Configuration的配置类相互引用
ApplicationContext ctx = new AnnotationConfigApplicationContext(DaoConfig.class,ServiceConfig.class);
LogonService logonService = ctx.getBean(LogonService.class);
System.out.println((logonService.getLogDao() !=null));
logonService.printHelllo();
}
Первый пример:
Второй пример:
Третий пример:
Четвертый пример:
Пятый пример:
- Код можно увидеть выше
1.3.9 Сводка компонентов сборки
В общем, контейнер Spring IOC дает нам много способов реализации при создании bean-компонентов, включая множество настроек bean-компонентов~
Что касается кода руководства по внедрению, связанного с Bean, и упрощенной конфигурации (пространства имен p и c), я не буду объяснять их по одному, вы можете пойти и посмотретьДостаточно начать работу с SpringиSpring [внедрение зависимостей] так простоВот и все.
Общая сравнительная таблица:
Соответствующие сценарии применения:
Что касается некоторых небольших знаний:
- замена метода
- Замена метода компонента на метод другого компонента
- редактор свойств
- Способность Spring преобразовывать примитивные типы сводится к редактору свойств!
- глобализация
- Используйте операционные системы на разных языках (английский, китайский) для отображения разных языков
- профили и условные компоненты
- Компоненты инициализируются только при выполнении определенного условия, что может облегчить переключение между производственной средой и средой разработки~
- события контейнера
- Подобно нашему слушателю Servlet, за исключением того, что он реализован в Spring~
Вышеупомянутые маленькие точки знаний будут использоваться в редких случаях, поэтому я не буду их здесь объяснять. Я знаю, что есть такая штука, я воспользуюсь ею, когда проверю~~~
2. Весенние вопросы интервью, связанные с МОК
Разобравшись с соответствующими точками знаний SpringIOC, мы хотим знать, какие точки знаний более важны. Это очень просто, мы узнаем соответствующие вопросы интервью.Если вопросы интервью являются общими, то относительно важно объяснить этот пункт знаний!
Следующие вопросы интервью взяты из различных блогов, и будет указан источник более крупных выдержек~
2.1 Что такое весна?
Что такое весна?
Spring — это среда разработки с открытым исходным кодом для корпоративных приложений Java. Spring в основном используется для разработки Java-приложений, но некоторые расширения предназначены для создания веб-приложений на платформе J2EE. Весенний фреймворкЦель состоит в том, чтобы упростить разработку корпоративных приложений Java., и поощряйте хорошие привычки программирования с помощью модели программирования на основе POJO.
2.2 Каковы преимущества использования среды Spring?
Каковы преимущества использования фреймворка Spring?
- Легкий: Spring облегченный, базовая версия весит около 2 МБ.
- Инверсия контроля: Spring обеспечивает слабую связь за счет инверсии управления, объекты предоставляют свои зависимости вместо создания или поиска зависимых объектов.
- Аспектно-ориентированное программирование(АОП): Spring поддерживает аспектно-ориентированное программирование и отделяет бизнес-логику приложений от системных служб.
- контейнер: Spring содержит и управляет жизненным циклом и конфигурацией объектов в приложении.
- Фреймворк MVC: WEB-фреймворк Spring — хорошо спроектированный фреймворк и хорошая альтернатива Web-фреймворку.
- управление транзакциями: Spring предоставляет постоянный интерфейс управления транзакциями, который может быть расширен от локальных транзакций до глобальных транзакций (JTA).
- Обработка исключений: Spring предоставляет удобный API для преобразования специфических для технологии исключений (таких, которые создаются JDBC, Hibernate или JDO) в согласованные непроверенные исключения.
2.3 Из каких модулей состоит Spring?
Из каких модулей состоит Spring?
Его можно легко разделить на 6 модулей:
- Core
- AOP
- ORM
- DAO
- Web
- Spring EE
2.4 Пример реализации BeanFactory
Пример реализации BeanFactory
Bean factory — это реализация фабричного паттерна, обеспечивающая инверсию функции управления,Используется для отделения конфигурации и зависимостей приложения от реального кода приложения..
До весны 3.2 наиболее часто используемым был XmlBeanFactory, но теперь он устарел и заменен на: XmlBeanDefinitionReader и DefaultListableBeanFactory.
2.5 Что такое Spring Dependency Injection?
Что такое инъекция зависимостей Spring?
Внедрение зависимостей, аспект IOC, является общей концепцией, имеющей множество интерпретаций. Концепция заключается в том, что вы не создаете объект, вы просто описываете, как он создается. тыНе собирайте свои компоненты и сервисы прямо в коде, а опишите, каким компонентам какие сервисы нужны в конфигурационном файле., а затем за их сборку отвечает контейнер (контейнер IOC).
2.6 Какие существуют типы методов IOC (внедрения зависимостей)?
Каковы различные типы способов IOC (внедрения зависимостей)?
- Внедрение зависимостей конструктора: Внедрение зависимостей конструктора реализуется контейнером, запускающим конструктор класса, который имеет ряд параметров, каждый из которых представляет зависимость от других классов.
- Внедрение сеттер-метода: Внедрение метода установки заключается в том, что после того, как контейнер создает экземпляр компонента путем вызова конструктора без аргументов или статического фабричного метода без аргументов, вызывается метод установки компонента, то есть реализуется внедрение зависимостей на основе установки.
- Заводская инъекция: это наследие, которое больше не используется!
2.7 Какой метод внедрения зависимостей вы рекомендуете, внедрение конструктора или внедрение метода установки?
Какой метод внедрения зависимостей вы рекомендуете, внедрение конструктора или внедрение метода установки?
Вы можете использовать оба метода зависимостей, внедрение конструктора и внедрение метода установки. Лучшее решениеРеализуйте обязательные зависимости с параметрами конструктора и необязательные зависимости с помощью методов установки..
2.8 Что такое фасоль Spring?
Что такое весенние бобы?
Весенняя фасоль - этоJava-объекты, составляющие основу приложения Spring.. Они инициализируются, собираются и управляются контейнером Spring IOC. Эти bean-компоненты создаются из метаданных, настроенных в контейнере. Например, в файле XML<bean/>
определение формы.
Вот четыре важных подхода к контейнеру Spring.Предоставьте метаданные конфигурации.
- XML-файл конфигурации.
- Конфигурация на основе аннотаций.
- конфигурация на основе Java.
- Конфигурация Groovy DSL
2.9 Объясните жизненный цикл bean-компонентов в среде Spring
Объясните жизненный цикл bean-компонентов в среде Spring.
- Контейнер Spring считывает определение bean-компонента из XML-файла и создает экземпляр bean-компонента.
- Spring заполняет все свойства в соответствии с определением компонента.
- Если компонент реализует интерфейс BeanNameAware, Spring передает идентификатор компонента в метод setBeanName.
- Если bean-компонент реализует интерфейс BeanFactoryAware, Spring передает beanfactory методу setBeanFactory.
- Если с компонентом связаны какие-либо BeanPostProcessors, Spring вызывает их в методе postProcesserBeforeInitialization().
- Если компонент реализует IntializingBean, вызывается его метод afterPropertySet, а если компонент объявляет метод инициализации, вызывается этот метод инициализации.
- Если с компонентом связаны BeanPostProcessors, будет вызван метод postProcessAfterInitialization() этих компонентов.
- Если компонент реализует DisposableBean, он вызовет метод destroy().
2.10 Объясните различные способы автоматического подключения
Автовайринг объясняют по-разному
- no: по умолчанию не выполняется автоматическое связывание, а связывание осуществляется путем явной установки атрибута ref.
- byName: через имя параметра autowire контейнер Spring обнаруживает, что для свойства bean-компонента autowire установлено значение byname в файле конфигурации, а затем контейнер пытается сопоставить, собрать, и свойство bean-компонента имеет то же имя, что и bean-компонент.
- byType: с помощью автоматического связывания типа параметра контейнер Spring обнаруживает, что для свойства bean-компонента autowire установлено значение byType в файле конфигурации, а затем контейнер пытается сопоставить, связать и сопоставить свойства bean-компонента с тем же типом bean-компонента. Выдает ошибку, если условию соответствует более одного компонента.
- конструктор: этот метод похож на byType, но его необходимо указать в параметре конструктора.Если нет определенного типа параметра конструктора с параметрами, будет выдано исключение.
- autodetect: сначала попробуйте использовать конструктор для автоподключения, если он не работает, используйте метод byType.
При использовании только аннотацийАннотации используют byType по умолчанию!
2.11 Каковы преимущества МОК?
Каковы преимущества МОК?
IOC или Dependency Injection минимизирует размер кода приложения. Это упрощает тестирование приложения, для модульного тестирования больше не требуется механизм поиска singleton и JNDI.Слабая связь достигается с минимальными усилиями и минимальным вмешательством. Поддержка контейнера IOC при загрузке сервисовГолодная инициализация и ленивая загрузка.
2.12 Каковы важные методы жизненного цикла компонентов? Можно ли их перегрузить?
Каковы важные методы жизненного цикла компонентов? Можно ли их перегрузить?
Существует два важных метода жизненного цикла компонента.setup
, который вызывается, когда контейнер загружает компонент. Второй методteardown
Он вызывается, когда контейнер выгружает класс.
Тег bean имеет два важных свойства (init-method
иdestroy-method
). С их помощью вы можете самостоятельно настроить методы инициализации и выхода из системы. Они также имеют соответствующие аннотации (@PostConstruct
и@PreDestroy
).
2.13 Как ответить интервьюеру: Что вы понимаете под Spring?
Как ответить интервьюеру: Как вы понимаете Spring?
источник:
Вот несколько моих ответов:
один,
два,
2.14 Являются ли одноэлементные компоненты в среде Spring потокобезопасными?
Являются ли singleton bean-компоненты в среде Spring потокобезопасными?
Платформа Spring не выполняет многопоточную инкапсуляцию одноэлементных компонентов. Вопросы безопасности потоков и параллелизма одноэлементных компонентов должны решаться самими разработчиками. Но на самом деле большинство bean-компонентов Spring не имеют изменяемого состояния (например, классы View и DAO), поэтому одноэлементные bean-компоненты Spring в некоторой степени потокобезопасны.Если ваш компонент имеет несколько состояний(например, объекты View Model), простоНеобходимо обеспечить безопасность потока самостоятельно.
Наиболее очевидным решением является изменение области действия полиморфного компонента с «singleton» на «prototype».
2.15 В чем разница между FileSystemResource и ClassPathResource?
В чем разница между FileSystemResource и ClassPathResource?
В FileSystemResource вам нужно указать относительный или абсолютный путь к файлу spring-config.xml в вашем проекте. В ClassPathResource Spring будет автоматически искать файлы конфигурации в ClassPath, поэтому файл ClassPathResource должен быть помещен в ClassPath.
Если вы сохраните spring-config.xml в папке src, просто укажите имя файла конфигурации, потому что папка src используется по умолчанию.
короче,ClassPathResource читает файлы конфигурации в переменных среды, FileSystemResource читает файлы конфигурации в файлах конфигурации.
3. Резюме
Я нарисовал ментальную карту, чтобы обобщить основные моменты этой статьи.При изучении АОП эта ментальная карта будет дополняться~~~
Использованная литература:
- «Весна в действии»
- «Знание практики разработки корпоративных приложений Spring4.x»
- zhuanlan.zhihu.com/p/29344811--Сводка принципов Spring IOC
- blog.CSDN.net/U014079773/…--- Сборник вопросов для интервью по Java (7) -- Общие вопросы для интервью Spring
- zhuanlan.zhihu.com/p/31527327--69 классических весенних интервью: вопросы и ответы
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y.
Проект с открытым исходным кодом, охватывающий все точки знаний о бэкэнде Java (уже 6 тысяч звезд):GitHub.com/Zhongf UC очень…
если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, поищите в WeChat.Java3y.
Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).