Автор: Брат Сяофу
Блог:bugstack.cn
Осаждайте, делитесь, растите и позвольте себе и другим что-то получить! 😄
👨💻 Даже читать код, написанный коллегами, тяжело, а вы до сих пор читаете Spring? 咋的,Spring 很难读!
Эта Весна, которая ладит с нами день и ночь, как невестка, спящая рядом с тобой, Ты знаешь, что тебе нужно найти ее для еды, питья, карманных денег и кожи. Но вы не знаете, сколько зерна у нее на складе, и вы не знаете, купила ли она управление состоянием или положила его в банк.🍑 Шучу, в следующий раз буду серьезен!
1. Почему Spring трудно читать?
Почему Spring используется каждый день, но так сложно читать исходный код! потому чтоJava和J2EE开发领域的专家
Rod JohnsonФреймворк Spring, который был предложен в 2002 году и впоследствии создан, до сих пор становился все больше и больше с развитием версий JDK и потребностями рынка!
Когда вы прочитаете его исходный код, вы почувствуете:
- Почему этот код прыгает? Это не то же самое, что писать код самостоятельно.
单纯
- Почему существует так много интерфейсов и наследования интерфейсов, класс B, наследуемый классом A, также реализует интерфейс X, реализованный классом A
- Простая фабрика, фабричный метод, режим прокси, режим наблюдателя, как использовать так много режимов проектирования
- Это загрузка ресурсов, контекст приложения, IOC, АОП и цикл объявления bean-компонента.С чего начать с фрагментов кода?
как, это список вопросов, которые у вас возникают при чтении Spring, верно? На самом деле, не только вы даже можете сказать, что пока вы являетесь фермером кода в этой отрасли, если вы захотите прочитать исходный код Spring, вы почувствуете, что не знаете, с чего начать. Поэтому я придумал способ, поскольку Spring слишком велик, чтобы его понять, я пытаюсь начать с маленького Spring,мастурбируетРеализация Spring непонятным образом лучше, не говоря уже о том, что эффект действительно хорош,在花了将近2个月的时间,实现一个简单版本的 Spring 后
Теперь мое понимание Spring значительно улучшилось, и я также могу читать исходный код Spring.
2. Делитесь ручной пружиной
Написав упрощенную версию, подобную этойВесенний фреймворк, чтобы понять основные принципы Spring. В процессе написания исходный код Spring будет упрощен, основная логика в общей структуре будет извлечена, процесс реализации кода будет упрощен, а основные функции будут сохранены, такие как: IOC, AOP, Bean life. цикл, контекст, объем, обработка ресурсов и другая реализация контента.
исходный код:GitHub.com/заместитель комиссара/…
1. Реализуйте простой контейнер для компонентов
Любая конкретная реализация структуры данных, которая может хранить данные, может называться контейнером. Например: ArrayList, LinkedList, HashSet и т. д., но в контексте контейнера Spring Bean нам нужна структура данных, которую можно использовать для хранения и индексации имен, поэтому выбор HashMap является наиболее подходящим.
Ниже приводится краткое введение в HashMap. Его структура данных будет пытаться максимизировать сложность чтения всех данных между O (1) ~ O (Logn) ~ O (n), конечно, в крайних случаях будет O (n) поиск связанных списков с большим количеством данных. Однако после того, как функция возмущения переадресует проверочный тест 100 000 данных, данные будут равномерно хешированы для каждого индекса хеш-контейнера, поэтому HashMap очень подходит для контейнерной реализации Spring Bean.
Другая простая реализация контейнера Spring Bean требует трех основных шагов: определение Bean, регистрация и получение.Упрощенный дизайн выглядит следующим образом;
- Определение: BeanDefinition, возможно, это класс, который вы часто видите при просмотре исходного кода Spring, например, он будет включать синглтон, прототип, BeanClassName и т. д. Но в настоящее время наша первоначальная реализация будет проще и определит только тип объекта для хранения объектов.
- Регистрация: этот процесс эквивалентен сохранению данных в HashMap, но теперь HashMap хранит информацию об объекте определенного Bean.
- Получить: последний шаг — получить объект.Имя компонента является ключом.После того, как контейнер Spring инициализирует компонент, его можно получить напрямую.
2. Используйте шаблоны проектирования для определения, регистрации и получения Bean-компонентов.
Чтобы улучшить контейнер Spring Bean, первым и очень важным моментом является то, что при регистрации Bean-компонента регистрируется только одна информация о классе, а информация об экземпляре не регистрируется напрямую в контейнере Spring. Затем вам нужно изменить атрибут Object в BeanDefinition на Class Следующее, что вам нужно сделать, это обработать операцию создания экземпляра объекта Bean и определить, был ли текущий одноэлементный объект кэширован в контейнере при получении объекта Bean. Общая конструкция показана на рис. 3-1.
- Прежде всего, нам нужно определить Bean Factory, такую как BeanFactory, которая предоставляет метод для получения Bean.
getBean(String name)
, а затем этот интерфейс Bean Factory реализуется абстрактным классом AbstractBeanFactory. использовать вот такРежим шаблонаМетод проектирования может унифицировать логику вызова и стандартное определение общего базового метода, а также хорошо контролировать, чтобы последующим разработчикам не нужно было заботиться о логике вызова и выполнять их унифицированным способом. Тогда наследнику класса нужно заботиться только о логической реализации конкретного метода. - Затем AbstractAutowireCapableBeanFactory, наследующий абстрактный класс AbstractBeanFactory, может реализовать соответствующие абстрактные методы.Поскольку сам AbstractAutowireCapableBeanFactory также является абстрактным классом, он может реализовывать только свои собственные абстрактные методы, а другие абстрактные методы реализуются классами, наследующими AbstractAutowireCapableBeanFactory. Это отражает различные роли в процессе реализации класса. Вам нужно заботиться только о содержимом, которое принадлежит вам, а не о вашем содержимом. Не участвуйте.
- Кроме того, здесь есть очень важная точка знаний, то есть реализация определения интерфейса синглтона SingletonBeanRegistry, и после того, как DefaultSingletonBeanRegistry реализует интерфейс, он будет унаследован абстрактным классом AbstractBeanFactory. Теперь AbstractBeanFactory является очень полным и мощным абстрактным классом, и он также может очень хорошо отражать свое абстрактное определение шаблона шаблона.
3. Реализация стратегии инстанцирования класса с помощью конструктора на основе Cglib
Технический дизайн заполнения этой дыры в основном рассматривает две части: первая — это то, где строковый процесс разумно передает информацию о входных параметрах конструктора в операцию создания экземпляра, а другая — как создать экземпляр объекта, содержащего конструктор.
- Обратитесь к реализации исходного кода контейнера Spring Bean и добавьте его в BeanFactory.
Object getBean(String name, Object... args)
интерфейс, так что информация о входных параметрах конструктора может быть передана при получении Bean. - Еще одно основное содержание — как создать объект Bean с помощью конструктора? Есть два способа выбора, один основан на методе, который поставляется с самой Java.
DeclaredConstructor
, другой — использовать Cglib для динамического создания объектов Bean.Cglib реализован на основе фреймворка байт-кода ASM, поэтому вы также можете создавать объекты напрямую через сценарий работы ASM.
4. Внедрить свойства для объектов Bean и реализовать функцию зависимых Bean-компонентов.
Учитывая, что в бине используется популяция свойствnewInstance
илиCglib
После создания начните заполнять атрибутивную информацию, затем вы сможетеAbstractAutowireCapableBeanFactory
Добавьте метод свойства завершения в метод createBean.В этой части вы также можете изучить исходный код Spring в процессе стажировки.Реализация здесь также является упрощенной версией Spring, и последующее сравнительное изучение будет легче для понимания.
- Заполнение атрибутов нужно создавать после инстанцирования класса, то есть оно должно быть в
AbstractAutowireCapableBeanFactory
в методе createBean добавитьapplyPropertyValues
работать. - Поскольку нам нужно заполнить операции со свойствами при создании бина, нам нужно добавить информацию PropertyValues в класс определения бина BeanDefinition.
- Кроме того, информация атрибута заполнения также включает тип объекта компонента, то есть необходимо определить BeanReference, который на самом деле является простым именем компонента, которое рекурсивно создается и заполняется во время конкретной операции создания экземпляра, что является тем же самым. как реализация исходного кода Spring.BeanReference — это интерфейс в исходном коде Spring.
5. Разработайте и внедрите загрузчик ресурсов, проанализируйте и зарегистрируйте объекты Bean из Spring.xml.
В соответствии с предысторией требований этой главы нам нужно добавить синтаксический анализатор ресурсов в существующий прототип среды Spring, то есть он может считывать содержимое конфигурации пути к классам, локальные файлы и облачные файлы. Это содержимое конфигурации похоже на файл Spring.xml, настроенный при использовании Spring, который будет включать описание и информацию об атрибутах объекта Bean. После прочтения информации файла конфигурации следующим шагом будет выполнение операции регистрации после анализа информации описания Bean в файле конфигурации и регистрация объекта Bean в контейнере Spring. Общая структура конструкции выглядит следующим образом:
- Загрузчик ресурсов является относительно независимой частью, находится в содержимом реализации ввода-вывода основного пакета среды Spring и в основном используется для обработки файловой информации в классах, локальных и облачных средах.
- Когда ресурс может быть загружен, следующим шагом будет анализ и регистрация компонента в Spring.Эта часть реализации должна быть объединена с основным классом DefaultListableBeanFactory, потому что все ваши проанализированные действия регистрации будут помещать информацию об определении компонента в этот класс. , середина.
- Затем при реализации спроектируйте иерархию реализации интерфейса, включая интерфейс чтения, который нам нужен для определения определения Bean.
BeanDefinitionReader
И хорошо поработайте над соответствующим классом реализации, и завершите синтаксический анализ и регистрацию объекта Bean в классе реализации.
6. Разработайте и внедрите загрузчик ресурсов, проанализируйте и зарегистрируйте объекты Bean из Spring.xml.
Для того, чтобы иметь возможность выполнять определяемые пользователем операции в процессе регистрации объекта bean-компонента для инстанцирования, необходимо вставлять интерфейсные классы в процесс определения и инициализации bean-компонента, а этот интерфейс имеет внешние сервисы для реализации собственных нужд. Затем в сочетании с возможностями обработки контекста среды Spring мы можем удовлетворить наши целевые требования. Общая структура конструкции выглядит следующим образом:
- Два интерфейса, которые удовлетворяются расширением объектов Bean, на самом деле являются двумя очень тяжелыми интерфейсами в среде Spring:
BeanFactoryPostProcess
иBeanPostProcessor
, которые являются почти двумя необходимыми интерфейсами, которые все используют среду Spring для добавления для разработки своих собственных требований. - BeanFactoryPostProcessor — это механизм расширения контейнера, предоставляемый средой Spring, который позволяет получать информацию об определении bean-компонента после того, как объект bean-компонента зарегистрирован, но не создан.
BeanDefinition
Выполните операцию модификации. - BeanPostProcessor также является механизмом расширения, предоставляемым Spring, но BeanPostProcessor изменяет объект Bean после создания экземпляра объекта Bean, а также может заменить объект Bean. Эта часть тесно связана с АОП, который будет реализован позже.
- В то же время, если вы просто добавите эти два интерфейса без какой-либо упаковки, это будет очень хлопотно для пользователей. Мы надеемся разработать класс контекстных операций Spring и интегрировать соответствующую загрузку XML, регистрацию, создание экземпляров, а также новые модификации и расширения, чтобы Spring мог автоматически сканировать наши новые службы для удобства пользователей.
7. Реализовать контекст приложения, автоматическую идентификацию, загрузку ресурсов и механизм расширения.
Перед лицом такой огромной платформы, как Spring, использование внешних определений интерфейса или конфигурации xml, а также ряд завершенных операций расширения делают структуру Spring загадочной. Фактически, для дополнительных операций обработки, добавленных в процессе инициализации bean-контейнера, это не что иное, как предварительное выполнение определенного метода интерфейса или отражение метода, настроенного в xml вызывающего класса. вы реализуете его в соответствии с определением интерфейса, будет Spring. Контейнер вызывается только во время обработки. Общая структура конструкции выглядит следующим образом:
- Добавить в конфигурацию spring.xml
init-method、destroy-method
Две аннотации в процессе загрузки файла конфигурации определяют конфигурацию аннотаций для свойств BeanDefinition. Таким образом, в проекте операции инициализации initializeBean информация о методе, сконфигурированная в атрибуте определения Bean, может быть вызвана путем отражения. Кроме того, если он реализован интерфейсом, вы можете напрямую вызвать метод, определенный соответствующим интерфейсом, через объект Bean.((InitializingBean) bean).afterPropertiesSet()
, эффект от двух методов одинаков. - В дополнение к операциям, выполняемым во время инициализации,
destroy-method
иDisposableBean
Определение интерфейса будет выполнять информацию о методе регистрации и уничтожения в атрибуте disposableBeans в классе DefaultSingletonBeanRegistry на этапе инициализации и завершения объекта bean, который предназначен для последующих унифицированных операций.Здесь также используются адаптеры, потому что вызовы отражения и прямые вызовы интерфейса — это два пути. Поэтому для упаковки необходимо использовать адаптер. См. конкретную реализацию DisposableBeanAdapter в объяснении кода ниже.
- Что касается метода уничтожения, операция должна быть выполнена до завершения работы виртуальной машины, поэтому здесь требуется зарегистрированная операция ловушки, например:Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("close!")));
С помощью этого кода вы можете выполнить тест, и, кроме того, вы можете закрыть контейнер, вручную вызвав метод ApplicationContext.close.
8. Зарегистрируйте хук на виртуальной машине для реализации методов инициализации и уничтожения объекта Bean.
Перед лицом такой огромной платформы, как Spring, использование внешних определений интерфейса или конфигурации xml, а также ряд завершенных операций расширения делают структуру Spring загадочной. Фактически, для дополнительных операций обработки, добавленных в процессе инициализации bean-контейнера, это не что иное, как предварительное выполнение определенного метода интерфейса или отражение метода, настроенного в xml вызывающего класса. вы реализуете его в соответствии с определением интерфейса, будет Spring. Контейнер вызывается только во время обработки. Общая структура конструкции выглядит следующим образом:
- Добавить в конфигурацию spring.xml
init-method、destroy-method
Две аннотации в процессе загрузки файла конфигурации определяют конфигурацию аннотаций для свойств BeanDefinition. Таким образом, в проекте операции инициализации initializeBean информация о методе, сконфигурированная в атрибуте определения Bean, может быть вызвана путем отражения. Кроме того, если он реализован интерфейсом, вы можете напрямую вызвать метод, определенный соответствующим интерфейсом, через объект Bean.((InitializingBean) bean).afterPropertiesSet()
, эффект от двух методов одинаков. - В дополнение к операциям, выполняемым во время инициализации,
destroy-method
иDisposableBean
Определение интерфейса будет выполнять информацию о методе регистрации и уничтожения в атрибуте disposableBeans в классе DefaultSingletonBeanRegistry на этапе инициализации и завершения объекта bean, который предназначен для последующих унифицированных операций.Здесь также используются адаптеры, потому что вызовы отражения и прямые вызовы интерфейса — это два пути. Поэтому для упаковки необходимо использовать адаптер. См. конкретную реализацию DisposableBeanAdapter в объяснении кода ниже.
- Что касается метода уничтожения, операция должна быть выполнена до завершения работы виртуальной машины, поэтому здесь требуется зарегистрированная операция ловушки, например:Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("close!")));
С помощью этого кода вы можете выполнить тест, и, кроме того, вы можете закрыть контейнер, вручную вызвав метод ApplicationContext.close.
9. Определите интерфейс Aware типа маркера для реализации объекта-контейнера осведомленности.
Если я хочу получить некоторые из ресурсов, предоставляемых в среде Spring, то мне нужно сначала подумать, как их получить, а затем как получить метод получения, который вы определили в среде Spring. расширить некоторые из необходимых вам возможностей, принадлежащих самой среде Spring.
На этапе создания экземпляра объекта Bean мы оперировали некоторыми дополнительными определениями, свойствами, операциями инициализации и уничтожения Фактически, если мы получим Spring, например BeanFactory и ApplicationContext, мы также можем реализовать его таким образом. Затем нам нужно определить отмеченный интерфейс, этот интерфейс не должен иметь методов, он имеет только функцию маркировки, а конкретные функции определяются другими функциональными интерфейсами, которые наследуют этот интерфейс, Наконец, этот интерфейс можно передать черезinstanceof
Делаются выводы и звонки. Общая структура конструкции выглядит следующим образом:
- Определите интерфейс Aware, который является своего рода интерфейсом маркера осведомленности в среде Spring, а определенные определения и реализации подклассов могут знать о связанных объектах в контейнере.То есть через этот мост контейнерные сервисы предоставляются конкретным классам реализации.
- Интерфейсы, которые наследуют Aware, включают: BeanFactoryAware, BeanClassLoaderAware, BeanNameAware и ApplicationContextAware.Конечно, в исходном коде Spring есть некоторые другие аннотации, но мы их пока не используем.
- В конкретном процессе реализации интерфейса вы можете видеть, что некоторые (BeanFactoryAware, BeanClassLoaderAware, BeanNameAware) в папке поддержки фабрики, а ApplicationContextAware — в поддержке контекста, потому что в разных пакетах нужно предоставлять разное получение контента. Поэтому в конкретной реализации AbstractApplicationContext будет использоваться добавление содержимого BeanPostProcessor в beanFactory.
ApplicationContextAwareProcessor
операция и, наконец, обработка соответствующей операции вызова, когда createBean создается с помощью AbstractAutowireCapableBeanFactory.Про applyBeanPostProcessorsBeforeInitialization было реализовано в предыдущей главе, если вы забыли, то можете идти дальше
10. Об области объекта Bean, а также о реализации и использовании FactoryBean
Что касается предоставления объекта Bean, который позволяет пользователям определять сложные объекты Bean, функциональная точка очень хороша, и значение также очень велико, потому что после этого предоставляется инкубатор экологических семян Spring, и любой фреймворк может завершить себя на этом стандарте. доступ к услугам.
Однако проектирование такой функциональной логики несложно, поскольку вся среда Spring уже предоставила различные возможности расширения в процессе разработки.接茬
, вам нужно только обеспечить последовательный вызов интерфейса обработки и соответствующую реализацию функциональной логики в соответствующем месте.Например, цель здесь состоит в том, чтобы предоставить функцию, которая может дважды получать объекты из метода getObject FactoryBean, поэтому все классы объектов, которые реализовать этот интерфейс может расширять свои собственные объектные функции.MyBatis реализует класс MapperFactoryBean, который предоставляет SqlSession в методе getObject для выполнения операции метода CRUD.Общая структура конструкции выглядит следующим образом:
- Весь процесс реализации состоит из двух частей: одна предназначена для решения объекта-одиночки или объекта-прототипа, а другая — для получения конкретного вызывающего объекта во время создания объекта типа FactoryBean.
getObject
работать. -
SCOPE_SINGLETON
,SCOPE_PROTOTYPE
, способ создания и приобретения типа объекта, основное отличие заключается вAbstractAutowireCapableBeanFactory#createBean
Помещать ли объект в память после его создания, если нет, то он будет пересоздаваться каждый раз при получении. - После того как createBean выполнит такие операции, как создание объекта, заполнение атрибутов, загрузка зависимостей, предварительная и постобработка, инициализация и т. д., он должен начать выполняться, чтобы определить, является ли весь объект объектом FactoryBean.
getObject
объект. В процессе getBean будет добавлено суждение о типе singleton.factory.isSingleton()
, который используется, чтобы решить, использовать ли память для хранения информации об объекте.
11. Реализация на основе наблюдателя, контейнерные события и прослушиватели событий
По сути, дизайн самого события является реализацией паттерна Observer, что ему необходимо решить, так это проблему уведомления других объектов об изменении состояния объекта, и оно должно учитывать простоту использования и низкую связанность с обеспечить высокий уровень сотрудничества.
Что касается реализации функций, нам необходимо определить классы событий, мониторинг событий и публикацию событий, а функции этих классов необходимо объединить с Spring AbstractApplicationContext#refresh() для облегчения операций инициализации событий и регистрации прослушивателей событий. Общая структура конструкции выглядит следующим образом:
- Во всем процессе реализации функции по-прежнему необходимо использовать ориентированный на пользователя контекст приложения в
AbstractApplicationContext
Добавьте соответствующее содержимое событий в , в том числе: инициализацию издателей событий, регистрацию прослушивателей событий и публикацию событий завершения обновления контейнера. - Используйте режим наблюдателя, чтобы определять классы событий, классы мониторинга и классы публикации.В то же время вам необходимо выполнить функцию вещателя.При получении push-уведомления о событии анализируйте и обрабатывайте события, представляющие интерес для события-слушателя. получатель, то есть использовать isAssignableFrom для оценки.
- isAssignableFrom похож на instanceof, но isAssignableFrom используется для определения отношения между подклассом и родительским классом или отношения между классом реализации и интерфейсом интерфейса.По умолчанию конечным родительским классом всех классов является Object. Если результат A.isAssignableFrom(B) истинен, это доказывает, что B можно преобразовать в A, то есть A можно преобразовать из B.
12. На основе JDK и динамического прокси-сервера Cglib реализованы основные функции АОП.
Прежде чем интегрировать весь дизайн аспектов АОП в Spring, нам нужно решить две проблемы, в том числе:如何给符合规则的方法做代理
,以及做完代理方法的案例后,把类的职责拆分出来
. Реализация этих двух функциональных точек спроектирована и разработана с мыслью об аспекте. Если вы не знаете, что такое АОП, вы можете понимать нарезку как нарезание лука-порея ножом.代理
) Соберите лук-порей в горсть и обработайте его различными приемами перехвата, такими как кухонный нож или топор. Программа фактически та же самая, за исключением того, что лук-порей стал методом, а кухонный нож стал методом перехвата. Общая структура конструкции выглядит следующим образом:
- Точно так же, как вы используете АОП Spring, просто обработайте некоторые методы, которые необходимо перехватить. После перехвата метода выполните операции расширения над методом.
- Затем нам нужно реализовать прокси, который может сначала проксировать метод.На самом деле, прокси-метод в основном использует вызов метода обработки класса перехватчика метода.
MethodInterceptor#invoke
, вместо прямого использования метода параметра Method в методе вызоваmethod.invoke(targetObj, args)
Эта часть является отличием при использовании повсюду. - В дополнение к вышеупомянутым основным функциям также необходимо использовать
org.aspectj.weaver.tools.PointcutParser
Обработка выражений перехвата"execution(* cn.bugstack.springframework.test.bean.IUserService.*(..))"
, с методом прокси и обработкой перехвата мы можем завершить разработку прототипа АОП.
13. Интегрируйте динамический прокси АОП в жизненный цикл компонента.
На самом деле, после реализации основных функций АОП интегрировать эту часть функциональных сервисов в Spring несложно, но есть несколько проблем, которые необходимо решить, в том числе: как интегрировать динамический прокси в жизненный цикл Бина через BeanPostProcessor, и Как собрать различные pointcuts, перехваты, предфункции и адаптировать соответствующие агенты. Общая структура конструкции выглядит следующим образом:
- Чтобы позволить прокси-объектам, сконфигурированным в xml, то есть некоторым объектам класса аспекта, создавать экземпляры в процессе создания объекта, необходимо использовать методы, предоставляемые BeanPostProcessor, потому что методы в этом классе могут использоваться для выполнить инициализацию с объектом Bean соответственно Расширенная информация об объектах, которые модифицируют bean до и после. Однако необходимо собрать новые интерфейсы и классы реализации в BeanPostProcessor, чтобы соответствующая информация о классе могла быть получена целевым образом.
- Однако, поскольку прокси-объект, созданный в предыдущем процессе, не является обычным объектом, нам необходимо заранее создать другие объекты, поэтому в фактическом процессе разработки нам необходимо сначала завершить оценку объекта Bean в AbstractAutowireCapableBeanFactory#createBean, требуется ли прокси. Если есть, прокси-объект возвращается напрямую.В исходном коде Spring будет разделение методов createBean и doCreateBean.
- Он также включает в себя определенные функции перехватчика метода, которые необходимо решить, и предоставляет некоторые реализации BeforeAdvice и AfterAdvice, чтобы пользователи могли использовать функцию аспекта более упрощенно. Кроме того, он также включает интеграцию выражений аспектов упаковки и методов перехвата, а также прокси-фабрик, которые предоставляют различные типы методов прокси для упаковки наших сервисов аспектов.
3. Инструкции по обучению
этот репозиторий кодаGitHub.com/заместитель комиссара/…Чтобы изучить исходный код Spring, уясните основные принципы Spring, написав упрощенную версию среды Spring.
В процессе написания исходный код Spring будет упрощен, основная логика в общей структуре будет извлечена, процесс реализации кода будет упрощен, а основные функции будут сохранены, такие как: IOC, AOP, Bean life. цикл, контекст, объем, обработка ресурсов и другая реализация контента.
-
Эта колонка представляет собой практическую информацию по кодированию.В процессе обучения необходимо объединять решаемые задачи в каждой главе текста.Цель, идея продолжениядизайн, в процесс практики кодирования. При обучении кодированию также лучше понять, почему эта часть контента реализована именно так, какой шаблон проектирования она использует и какое разделение обязанностей использует. Только благодаря такому обучению вы сможете лучше понять и освоить процесс реализации исходного кода Spring, а также это может помочь вам заложить прочную основу в процессе углубленного изучения и практического применения в будущем.
-
Кроме того, изучение содержания этой графы сочетается сШаблоны проектирования, следующее соответствуетПроектирование и разработка промежуточного программного обеспечения SpringBoot, поэтому читатели могут ознакомиться с соответствующими материалами, если в процессе обучения столкнутся с непонятными шаблонами проектирования.После изучения Spring они также могут попрактиковаться с содержимым промежуточного ПО.
-
исходный код: Исходный код, указанный в этом столбце, был интегрирован в текущий проект, который можно сопоставить с соответствующим исходным кодом случая в главе один за другим. Когда вы получите весь набор проектов, вы можете запустить их напрямую или открыть и запустить проекты с исходным кодом, соответствующие каждой главе отдельно.
-
Если вы столкнулись с какими-либо проблемами в процессе обучения, в том числе: невозможность запуска, комментарии по оптимизации, текстовые ошибки и т. д., вы можете отправить заявку
-
При написании содержания колонки в каждой главе представлены четкие чертежи дизайна и соответствующие диаграммы классов, поэтому в процессе обучения вы должны не только заботиться о том, как написан код, но, что более важно, понимать, откуда исходит содержание этих проектов. из.
😁 Хорошо, я надеюсь, что вы можете учиться с удовольствием!