В этой статье в основном анализируется концепция дизайна костной архитектуры пружинной структуры Spring Framework. Зачем эти компоненты нужны эти компоненты? Как они объединяются вместе, чтобы сформировать скелетную архитектуру весеннего? Как функция Spring AOP использует эти основные скелетные архитектуры для работы? Какие дизайнерские модели используются весной для завершения этого дизайна? Каково его вдохновение в этой концепции дизайна в нашем будущем дизайне программного обеспечения? Эта статья подробно ответит на эти вопросы.
Весенняя скелетная архитектура
Весной более десятка компонентов, но есть только несколько реальных компонентов.
Рисунок 1. Общая архитектурная схема рамки
Из приведенного выше рисунка видно, что в рамках пружины есть только три основных компонента: ядро, контекст и бобы. Они строят всю весеннюю скелетную архитектуру. Без них невозможно иметь характеристики верхних слоев, таких как AOP и Интернет. Ниже также будет анализировать пружину в основном из этих трех компонентов.
Весенняя концепция дизайна
Как упоминалось ранее, три основных компонента пружины представлены. Бин - настоящий главный герой весной.
Роль Бин в весне похожа на смысл объекта в ООП. Так же, как этап производительности, но нет актеров. Почему роль боб или почему это так важно весной? Управляет файлом конфигурации, который является его механизмом впрыска зависимостей. И эти инъекционные отношения управляются в контейнере МОК, тогда какой объект контейнера МОК обернут фасолью. Весна является целью управления этими объектами и некоторыми дополнительными операциями путем упаковки объектов в бобах.
Его стратегия дизайна совершенно похожа на концепцию дизайна Java для реализации ООП. Эта среда в этой среде в соответствии с определенными правилами. Думая об этом, подумайте о других структурах, которые мы используем в большой аналогичной концепции дизайна.
Как работать вместе с основными компонентами
Как упоминалось ранее, Бин является ключевым фактором весны. Если вы являетесь актером в исполнении, контекст является сценическим фоном этой производительности, и ядро должно быть реквизитом производительности. Только когда они вместе могут иметь самое основное условие, которое может провести хорошее шоу. Конечно, самые основные условия не могут выделить эту производительность, и шоу, которое он выполняет, является достаточно захватывающим.
Мы знаем, что Бин упакован в объект, а объект должен иметь данные. их и поддерживать эти отношения. Таким образом, контекст - это сборник бобов. Так что же использует основной компонент? Фактически, ядро - это некоторые столбцы, необходимые для взаимосвязи между каждым фасолью, чтобы обнаружить, установить и поддерживать взаимосвязь между каждым бобом.
Они могут быть представлены на рисунке ниже:
Рисунок 2. Три отношения компонентов
Подробное объяснение основных компонентов
Здесь мы подробно рассмотрим иерархические отношения каждого компонента, а также порядок заказа во время выполнения. Мы должны обратить внимание на использование весны.
Компонент бобов
Важность компонента бобов для весны была объяснена ранее. Компоненты бобов упакованы в Spring's Org.springframework.beans. Все категории в этом пакете решают три вещи: определение Бин, создание Бин и анализ бобов. Для весенних пользователей единственное, что нужно заботиться, - это создание бобов.
Типичная заводская модель Springbean.
Рисунок 4. Взаимосвязь наследства фабрики
BeanFactory имеет три подкласса: SireftableBeanfactory, иерархический BeanFactory и Autowire, способный фабрика, фабрики. Но из приведенного выше рисунка мы можем обнаружить, что окончательный класс реализации по умолчанию является по умолчанию списковой BeanFactory, и он реализует все интерфейсы. Так зачем определять так много уровней интерфейсов? Проверьте исходный код и инструкции этих интерфейсов. процесс работы. Например, интерфейс SirefitableBeanfactory указывает, что эти бобы являются спискими, а иерархические byfactory означает, что эти бобы имеют отношения наследования, то есть у каждого боба может быть отцом бобов. Интерфейс AutoWireCapableBeanFactory определяет правила автоматической сборки Bean. Эти четыре интерфейса совместно определяют коллекцию бобов, взаимосвязь между фасолью и поведением бобов.
Определение Bean в основном включает в себя описание Beandefinition.
Рисунок 5. Диаграмма иерархической взаимосвязи классов, определяемая на основе
Определение бобов -это полное описание всей информации в узлах, которые вы определили в файле конфигурации пружины, включая различные подметки. Когда Spring успешно проанализировал узел, который вы определили, он был преобразован в объект Beandefinition в течение весны. Все операции будут выполнены для этого объекта в будущем.
Процесс анализа Бин очень сложный, и функция разделена на детали, поскольку здесь есть много мест, которые можно расширить, и они должны обеспечить достаточную гибкость, чтобы справиться с возможными изменениями. Анализ Бин в основном для анализа файла конфигурации пружины. Этот процесс анализа в основном завершен через класс на рисунке ниже:
Рисунок 6. Аналитический класс.
Конечно, есть также конкретный анализ тега.
Контекст компонент
Контекст упакован в Spring Org.springframework.context. Давайте посмотрим, как построена эта среда.
ApplicationContext - это ведущий родительский класс контекста. Ниже приведена структурная диаграмма контекста:
Рисунок 7. Контекст -связанная с диаграмма структуры классов
Из приведенного выше рисунка можно увидеть, что приложения Context наследует BeanFactory, что также показывает, что основным объектом пружинного контейнера является боб.
Подклассы ApplicationContext в основном включают в себя два аспекта:
ConfigUrableApplicationContext указывает, что контекст изменен, то есть пользователь может динамически добавить или изменить существующую информацию о конфигурации в контексте.
WebApplicationContext - это имя имени, которое является контекстом, подготовленным для Интернета.
Затем подразделение состоит в том, чтобы построить тип контекста, за которым следует способ доступа к контексту. Такой первый уровень уровня составляет полный уровень уровня контекста.
В целом, ApplicationContext должен завершить следующее:
◆ Сделайте среду приложения
◆ Используйте BeanFactory, чтобы создать объект бобов
◆ Сохранить таблицу отношений объекта
◆ Может захватить различные события
В качестве пружинного контейнера IOC контекст в основном интегрирует большинство функций Spring или является основой большинства функций.
Основной компонент
Основные компоненты, как основной компонент пружины, содержат много ключевых категорий. Таким образом, чтобы абстрагировать все ресурсы в интерфейс, стоит изучить в будущем дизайне. Давайте посмотрим на роль этой части весной.
Рисунок ниже представляет собой структурную диаграмму, связанную с связанными с ресурсами:
Рисунок 8. Диаграмма структуры класса, связанная с ней
На приведенном выше рисунке можно увидеть, что интерфейс ресурса инкапсулирует различные возможные типы ресурсов, то есть разница в типе файла блокируется для пользователей. Для поставщика ресурсов, как упаковывать ресурсы для других людей, также является проблемой. Таким образом, все ресурсы могут быть получены через класс InputStream, поэтому поставщик ресурсов также защищен. Другая проблема заключается в том, что проблема загрузки ресурсов, то есть погрузчик ресурсов должен быть объединен.
Давайте посмотрим, как контекст и ресурс установили отношения? Сначала посмотрите на диаграмму их отношений:
Рисунок 9. Схема взаимосвязи контекста и ресурса
Как видно из рисунка выше, контекст допускает работу по загрузке, анализу и описанию ресурсов в класс ресурса. Есть много похожих способов с основными компонентами.
Как работать в контейнере МОК
Как упоминалось ранее, структура и взаимозависимость основных компонентов, компонентов бобов и контекстных компонентов.
Как создать фабрику Beanfactory
Как описано на рисунке 2, контейнер IOC на самом деле представляет собой сеть взаимосвязи бобов в сочетании с двумя другими компонентами. Встроенный вход находится в методе обновления класса AbstractApplicationContext. Код этого метода заключается в следующем:
Список 1.AbStractApplicationContext.Refresh
Public void refresh () бросает Beansexception, allodalstateexception {synchronized (this.startupshutdownmon) {// Подготовка этого контекста для обновления. Контекст. Зарегистрируйте, что процессоры Подклассники. Catch (Beansexception ex) {// Уничтожение Alream Создано Singletons, чтобы избежать заглушки ();Этот метод состоит в том, чтобы создать полный код для всего процесса контейнера IOC и понять, что каждая строка кода внутри в основном понимает принципы и функции большинства пружины.
Этот код в основном содержит такие шаги:
◆ Стройте BeanFactory в порядке
◆ Мероприятие может быть заинтересован в регистрации
◆ Создать объект экземпляра боба
◆ Запускает события, слушая
Ниже в сочетании с анализом кода этих процессов.
Второе и третье предложение - создание и настройка BeanFactory. Это обновление, то есть обновить конфигурацию. Ниже приведен код метода для обновления BeanFactory:
Список 2. AbstractrefreshableApplicationContext
Охрана Final void refreshbeanfactory () бросает Beansexception {if (hasbeanfactory ()) {destrybean (); ;;Этот метод реализует абстрактный метод AbstractApplicationContext rebreshbeanfactory. Обратите внимание, что типы объектов Beanfactory имеют множество типов типов объектов. Оригинальный объект BeanFactory - это по умолчанию, который станет списком.
Рисунок 10. Диаграмма наследования класса.
В дополнение к классу, связанному с Beanfactory, было обнаружено, что он также был связан с реестрой бобов. В методе обновления существует линия Loadbeanditions (Beanfactory), которая найдет ответ. контейнеры.
Этот процесс можно объяснить на следующей последовательной карте:
Рисунок 11. Создайте временное предисловие BeanFactory
Процесс анализа и регистрации Бин следующим образом:
инжир
После создания BeanFactory добавьте некоторые классы инструментов, необходимые для самой пружины.
Следующие три кода в AbstractApplicationContext играют жизненно важную роль в расширении функции Spring. Первые две строки в основном имеют в основном изменение конфигурации встроенной -в BeanFactory. Таким образом, все они расширяют функцию пружины, поэтому мы должны научиться использовать эту часть использования пружины.
Среди них в методе InvokebeanFactoryPostProcessors в основном для реализации интерфейса BeanFactoryPostPostProcessor предназначен для реализации подклассов. И выполнить свой метод PostProcessBeansFactory, оператор этого метода заключается в следующем:
Листинг 3.BeanFactoryPostProcessor.PostProcessBeanFactory
Void postprocessbeanfactory (configurablelistablebeanfactory beanfactory) бросает Beansexception;
Его параметры являются BeanFactory, что указывает на то, что он может быть изменен с помощью BeanFactory. Данные пользователи изменяют их по желанию.
Метод RegisterBeanpostProcessors также может получить подкласс пользовательского определения интерфейса BeanpostProcessor и выполнить их с переменной BeanpostProcessors в объекте BeanFactory. Два метода объявлены в Beanpostprocessor: постпроцесс -рефинициализация и постпроцессафтеринилизация используются для выполнения во время инициализации объекта бобов. Может выполнить определенные пользовательские операции.
Последняя строка - это регистрация инициализации события мониторинга и других слушателей системы.
Как создать экземпляр боба и построить сеть отношений бобов
Ниже приведено созданный код бобов, который начинается с метода FinishBeanfactoryInity.
Листинг 4.AbstractApplicationContext.finishbeanFactoryInialization
Защищенная void-beanfectoryinialization (ConfigurulistableBeanfactory BeanFactory) {// Lazy-Init) Singletons.Можно найти, что экземпляр бобов можно найти в Beanfactory. Кодекс метода Preinstantiatesingletons заключается в следующем:
Список 5.defaultlistablebeanfactory.preinstantialsingletons
Public void preinstantiateSingletons () Throws Beansexception {if (this.logger.isinfoenabled ()) {this.logger.info («предварительный инстанции синглтонов в";} синхронизированный (this.beandefinitionmap) {для (строковый Beanmaname: это: это. BeandefinitionNames) {rootbeandefinition bd = getmergedlocalbeandefinition (beanname); IseAgerinit; IseAgerinit (); ;}}}}}}}}Здесь есть очень важная бобы. Он может определить метод генерации объекта экземпляра, если его метод GetObject реализован. Тем не менее, объект экземпляра этой бобов внутри весны является фабрикой. Объект Spring, получая саму фабрику, завершена и завершена.
Как создать объект экземпляра бобов и как построить ключ основного уровня в связанных отношениях между объектами экземпляра Бин, следующая блок -схема этого процесса.
Рисунок 13. Диаграмма потока создания экземпляра
Если это обычный боб, он напрямую создает свой экземпляр, вызывая метод GetBean. Ниже приводится последовательная карта времени создания экземпляра боба:
Рисунок 14. Секционная диаграмма создания экземпляра
Другая очень важная часть - установить отношения между экземплярами объекта бобов.
Рисунок 15. Объект объекта
Точка расширения контейнера МОК
Другая проблема заключается в том, как сделать эти объекты из бобов иметь определенную расширяемость, то есть некоторые операции могут быть добавлены. Так что же такое расширения? Как весна называется этими расширениями?
Для весеннего контейнера IOC их так много. BeanFactoryPostProcessor, Beanpostprocessor. Они называются при строительстве объектов Beanfactory и построения бобов. Есть инициализирующие подборы и одноразовые. Пользователи могут реализовать метод, определяемый в этих интерфейсах, и Spring позвонит им в соответствующее время. Другой - фабрика.
Эти точки расширения обычно используют пружину для выполнения наших конкретных задач. Полем Вы можете использовать следующую метафору, чтобы объяснить.
Мы сравниваем контейнер IOC с одной коробкой. Тогда их соответствующее отношение является BeanFactory - это модель, создавая машину, режим шарика - фасоль, а мяч режима шарика - это экземпляр бобов. Где ранее упоминались расширения? BeanFactoryPostProcessor соответствует созданию модели мяча, и у вас будет возможность сделать ее исправление, то есть он может помочь вам изменить режим мяча. Инициализация Bean и OndoableBean находятся в начале и в конце моделей мяча, и вы можете завершить некоторые препараты и хвостовые работы. BeanpostProcessor позволяет вам внести соответствующие исправления в режим мяча. Наконец, есть фабрика, которая является волшебной моделью мяча. Этот режим мяча не заранее, но вы определите его форму для него. шары, которые вы хотите
Как использовать для меня контейнер IOC
Предыдущее введение процесса строительства пружинного контейнера, что может сделать для нас Spring, и что может сделать контейнер IOC Spring? Сначала мы должны построить контейнер IOC, используя Spring.
IOC на самом деле создает для вас куб Rubik. Так как же мы участвуем? Это то, что я говорил ранее, чтобы понять некоторые расширения весной, и мы меняем общее поведение весны, достигая этих расширенных точек. Что касается того, как достичь точки расширения, чтобы получить результаты личности, которые мы хотим, то есть много примеров весной. используется для справки.
Подробное объяснение функций AOP весной
Принцип реализации динамического прокси -сервера
Чтобы понять AOP Spring, принцип динамического агентства должен быть понят в первую очередь, потому что AOP реализован на основе динамического прокси. Динамический агент должен начать с самого JDK.
В пакете JAVA.Lang.Lang.Reflet есть класс прокси, который является входом в класс агентства. Структура этого класса:
Рисунок 16. Структура структуры прокси
На картинке выше четыре публичных метода. Последний метод NewProxyInstance - это метод создания прокси -объектов. Исходный код этого метода заключается в следующем:
Список 6.proxy.newProxyInstance
Общественный статический объект NewProxyInstance (ClassLoader Loader, класс> [] Интерфейсы, InvocatchHandler H) Throws allogalAgumentException {if (h == null) {new new nullpointerexception ();} class cl = getProxyClass (загрузка, интерфейсы); = cl.getConstructor (ConstructorParams); );} Catch (instantiationException e) {бросить новый интернет (e.toString ());} поймать новый интернет (e.toString ());}}Этот метод требует трех параметров: ClassLoader, который используется для загрузки класса Proxy Class. Интерфейсы - это те интерфейсы, которые будут представлены. InvocationHandler, он используется для выполнения операции пользователей, настроенных пользователями в дополнение к методам в интерфейсе прокси. Пользователь вызывает целевой метод, представлен уникальным методом, определенным в классе InvacationHandler Invoke. Это будет объяснено подробно позже.
Давайте посмотрим, как прокси производит класс прокси. Это показано ниже.
Рисунок 17. Создание прокси -объектов
Фактически, на приведенном выше рисунке можно найти, что класс агента находится в методе генерируетпроксиц проксигенератора. Класс Proxygientor завершен Sun.misc.
Если есть такой интерфейс, следующим образом:
Список 7. SimpleProxy Class
Общественный интерфейс SimpleProxy {public void sizemethod1 ();Структура класса, сгенерированная агентом, выглядит следующим образом:
Список 8. $ Proxy2 Class
Общественный класс $ proxy2 расширяет Java.lang.rang.reflect.proxy реализует SimpleProxy {java.lang.reflect.method M0; Метод M3;Метод в этом классе будет вызывать метод Invoke of InvocationHandler, и каждый метод будет соответствовать переменной свойства. Так реализуется весь агент.
Как достичь Springaop
Из принципа предыдущего агента мы знаем, что цель прокси состоит в том, что когда целевой метод называется, мы можем выполнить метод Alloke из класса InvocationHandler, так как сделать статью на vocationHandler, является ключом к реализации AOP Полем
Реализация Spring AOP является соглашением соблюдать альянс AOP. В то же время пружина расширила его, добавив несколько интерфейсов, таких как Pointcut и Advisor, чтобы сделать его более гибким.
Ниже приведена классовая диаграмма динамического прокси JDK:
Рисунок 18.JDK Динамическая прокси -диаграмма класса прокси -сервера
На рисунке выше ясно показывает интерфейс, определяемый определением альянса AOP. Давайте не будем обсуждать, как Spring расширяет AOP Alliance.
Список 9. Настройте прокси -компонент
<bean id = "testbeansingleton"> <property name = "proxyinterfaces"> <value> org.springframework.ap.framework.prototypetetsts $ testbeanse> p roperty> <name = "target"> <ref local = "testbeantarget" > Ref> свойство> <свойство name = "singleton"> <value> trueValue> Свойство> <name = "intemportors"> <sist> <value> testInterceptorValue> <val ue> testinterceptor2value> list> Свойство> Bean>
В конфигурации см. В том, что интерфейс агента устанавливается, класс реализации интерфейса является целевым классом, а перехватчик вызывается перед выполнением целевого метода. Сущность
Давайте посмотрим, как Spring завершает агент и как вызвать перехватчика.
Как упоминалось ранее, Spring AOP также достигает собственной точки расширения, чтобы завершить эту функцию. Конечно, прокси -объект должен динамически генерироваться через класс прокси.
Ниже приведена таблица времени прокси -объекта, созданного весной:
Рисунок 19. Появление объекта объекта
После Spring создает прокси -объект, когда вы вызовыте метод на целевом объекте, вы будете представлены в методе Invoke в классе InvocationHandler, который был объяснен ранее. Здесь класс Jdkdynamicaopproxy реализует интерфейс InvocationHandler.
Давайте посмотрим, как Spring вызывает перехватчик.
Рисунок 20.Spring вызывает перехватчик
Приведенное выше - динамический агент JDK.
Анализ режима дизайна весной
Существует также много дизайнерских шаблонов, используемых в пружине, таких как заводский режим, сингл режима, шаблонный режим и т. Д., В «Системной архитектуре и проектировании модели Webx Framework», «Анализ системной архитектуры и дизайна режима Tomcat», это уже введено. Здесь мы в основном представляем режим агентства и режим стратегии.
Прокси -режим
Принцип прокси -режима
Прокси -режим состоит в том, чтобы создать прокси -объект для определенного объекта, а объект прокси управляет ссылкой на исходный объект, и создание этого прокси -объекта может добавить некоторые дополнительные операции в исходный объект. Ниже приведена структура прокси -режима:
Рисунок 21. Структура прокси -режима
Тема: Абстрактная тема, это интерфейс, чтобы реализовать реальный объект объекта агента.
ProxySubject: в дополнение к интерфейсу определения абстрактных тем, класс прокси также должен содержать ссылку на объект агента
RealSubject: класс агента является целевым объектом.
Как реализовать прокси -режим весной
Динамический агент JDK в Spring AOP достигается с помощью технологии агентства. В дополнение к интерфейсу прокси -объекта весной, также будет и org.springframework.aop.springproxy и org.springframework.apork.advise. Конструктор использования режима прокси в пружине выглядит следующим образом:
Рисунок 22. Структурная диаграмма прокси -режима используется при проводке
$ Proxy - это прокси -объект, созданный, и субъект является абстрактной темой, а объект прокси - это сохранение ссылки на целевой объект через InvocationHandler.
Реальная структура объекта прокси весной выглядит следующим образом:
Список 10 Proxy Object $ Proxy4
Public Class $ Proxy4 расширяет java.lang.reflect.proxy реализации org.springframework.ap.framework.prototytypetsts $ testbean. METOR. M9; .Method M26; java.lang.reflect.Method M6; java.lang.reflect.method m28; java.lang.reflethod m14; java.lang. Reflect.method m12; java . Lang.reflet.Method M27; java.lang .reflect.method m11; java.lang.reflect.method m22; java.lang.reflect.Method m3; java.lang.reflect.Method java.lang.reflect. Method m4; java.lang.reflet.method m19; java .lang.reflect.Method M7; java.lang.reflet.method m15; java.lang.reflet.method m20; left.Method M10; java. LANG.Reflect.Method M1; java.lang.reflect.Method M17; java .lang.reflect.Method M21; java.lang.reflect.Method m0; ava.lang.reflet.method m24; int HashCode (); int indexof (org.SpringFramework.aop.advisor); int interxof (org.aopalliance. aip.advice); ject); java.lang.string tostring (); void sayhello (); void dosomething (); void dosometHing2 (); java.lang.class getProxiedIndIndIndIndIndIndIRFACES (); ProxytargetClass (); Org.SpringFramework.aop .advisor; getadvisors (); void addvisor (int, org.springframework.aip.advisor) Throws org.SpringFramework.aP.framework.aPConfigeXception; void addadvisor (ORG.Sprin gframework.aop.advisor) Throws org.SpringFramework.aop. framework.aPConfigeXception; void SetTargetsource (ORG .springframework.aop.targetsource); ORG.SpringFramework.aop.Targetsource GetTARGETSource (); d (); Boolean IsinterfaceProxied (java.lang.class); Boolean Removeadvisor (org.SpringFramework.aP. advisor );; Boolean SOR, ORG.SpringFramework.aP.Advisor) Throws org.SpringFramework.aop.framework.aPConfigeXception; void addAdvice (ORG.AOPALLIANCE.AOP.ADVICE) Throws org.SpringFramework.aP.framework.aPConfigexception; void addvice (int, org.aopalliance.aop.advic e) Throws org.Springframework.aP.framework.aPConfigeXception; .aop.advice); java.lang.string toproxyconfigstring (); Boolean isfrozen (); void setexposeProxy (Boolean);
Стратегический режим
策略模式原理
策略模式顾名思义就是做某事的策略,这在编程上通常是指完成某个操作可能有多种方法,这些方法各有千秋,可能有不同的适应的场合,然而这些操作方法都有可能用到。各一个操作方法都当作一个实现策略,使用者可能根据需要选择合适的策略。
下面是策略模式的结构:
图23.策略模式的结构
Context:使用不同策略的环境,它可以根据自身的条件选择不同的策略实现类来完成所要的操作。它持有一个策略实例的引用。创建具体策略对象的方法也可以由他完成。
◆Strategy:抽象策略,定义每个策略都要实现的策略方法
◆ConcreteStrategy:具体策略实现类,实现抽象策略中定义的策略方法
◆Spring中策略模式的实现
◆Spring中策略模式使用有多个地方,如Bean定义对象的创建以及代理对象的创建等。这里主要看一下代理对象创建的策略模式的实现。
前面已经了解Spring的代理方式有两个Jdk动态代理和CGLIB代理。这两个代理方式的使用正是使用了策略模式。它的结构图如下所示:
图24.Spring中策略模式结构图
在上面结构图中与标准的策略模式结构稍微有点不同,这里抽象策略是AopProxy接口,Cglib2AopProxy和JdkDynamicAopProxy分别代表两种策略的实现方式,ProxyFactoryBean就是代表Context角色,它根据条件选择使用Jdk代理方式还是CGLIB方式,而另外三个类主要是来负责创建具体策略对象,ProxyFactoryBean是通过依赖的方法来关联具体策略对象的,它是通过调用策略对象的getProxy (ClassLoaderclassLoader)方法来完成操作。
Суммировать
本文通过从Spring的几个核心组件入手,试图找出构建Spring框架的骨骼架构,进而分析Spring在设计的一些设计理念,是否从中找出一些好的设计思想,对我们以后程序设计能提供一些思路。接着再详细分析了Spring中是如何实现这些理念的,以及在设计模式上是如何使用的。