Разработка подключаемого контейнера IOC

задняя часть база данных Spring контейнер
Разработка подключаемого контейнера IOC

предисловие

После шлифовки долго, с помощью последней ночевки онлайнcicadaнаконец-то обновленv2.0.0Версия.

Причиной, по которой большой номер версии становится равным 2, действительно является обратная несовместимость, основными проявлениями которой являются:

  • Исправлено несколько отзывовbug.
  • Гибкая маршрутизация.
  • подключаемыйIOCВыбор контейнера.

Основное внимание уделяется последним двум.

новый маршрут

Давайте посмотрим на первый: обновление метода маршрутизации.

В предыдущих версиях, если вы хотите написать интерфейс, вы должны реализоватьWorkAction; И самое неприятное, что класс реализации может делать только один интерфейс.

Так мне друг тоже об этом говорилissue.


Таким образом, улучшенное использование выглядит следующим образом:

Это кажется немного знакомым 😊.

Как показано выше, нет необходимости реализовывать определенный интерфейс, просто используйте разные аннотации.

Также поддерживает пользовательскиеpojo, cicadaПараметры задаются во время вызова.

возьми этоgetUserВозьмем для примера интерфейс, при таком запросе эти параметры будут инкапсулированы вDemoReqсередина.

http://127.0.0.1:5688/cicada-example/routeAction/getUser?id=1234&name=zhangsan

Также получите ответ:

{"message":"hello =zhangsan"}

Процесс реализации также очень прост, и вы найдете его, когда посмотрите на исходный код; вот еще несколько основных шагов.

  • сканировать все использование@CicadaActionАннотированный класс.
  • сканировать все использование@CicadaRouteМетод аннотации.
  • хранить свои сопоставления вMapсередина.
  • по требованиюURLидти сMapНайдите это отношение в .
  • Отражение создает параметры и вызовы методов.

Сканировать классы и писать сопоставления


Запрашивать отношение сопоставления при запросе


вызывать эти методы через отражение

Нужен ли мне контейнер IOC

Приведенные выше шаги на самом деле написаны мной, но когда я пишу конкретный метод, я чувствую有点意思.

Все мы знаем, что метод вызова отражения имеет два важных параметра:

  • objЭкземпляр выполнения метода.
  • args..Естественно параметры метода.

Вот как я написал это в первый раз:

method.invoke(method.getDeclaringClass().newInstance(), object);

Потом тест, без проблем.

после того как я напишуreviewКод оказался неправильным: каждый раз будет создаваться новый экземпляр, а вызов отраженияnewInstance()Тоже не очень эффективно.

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

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

Это просто выполнит большую загрузку при запуске, но принесет пользу будущим поколениям.

Подключаемый контейнер IOC

Поэтому я решил реализовать такой bean-контейнер самостоятельно.

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

Лучше позволить пользователю выбрать решение реализации bean-контейнера.Вы можете использовать bean-контейнер или просто использовать предыдущий для создания нового экземпляра каждый раз, как область прототипа в Spring.

Вы даже можете настроить реализацию контейнера, например, хранить bean-компоненты в базе данных или Redis; конечно, большинство людей этого не делают.

а такжеSPIМеханизм чем-то похож.

Для достижения вышеуказанных требований примерно необходимы следующие шаги:

  • Общий интерфейс, включающий такие методы, как регистрация контейнеров и получение экземпляров из контейнеров.
  • BeanManagerкласс, который управляет конкретным использованиемIOCконтейнер.

Итак, сначала определите интерфейс;CicadaBeanFactory:

Содержит интерфейсы для регистрации и получения экземпляров.

При этом существует две разные схемы реализации контейнера.

реализация по умолчанию;CicadaDefaultBean:

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

Далее идет настоящий контейнер IOC;CicadaIoc:

Он хранит все экземпляры на карте.

Конечно же, упомянутоеCicadaBeanManager, он зарегистрирует все экземпляры вbeanв контейнере.

Фокус находится на части, отмеченной красным на рисунке:

  • должен быть создан в соответствии с выбором пользователяCicadaBeanFactoryинтерфейс.
  • Зарегистрируйте все экземпляры с помощью интерфейса CicadaBeanFactory.

Он также предоставляет метод для получения экземпляра:

это позвонить напрямуюCicadaBeanFactoryметоды интерфейса.


Тогда упомянутый выше метод вызова отражения становится следующим:

отbeanЭкземпляр получается из контейнера; процесс получения может заключаться в создании каждый раз нового объекта или в получении экземпляра непосредственно из контейнера. Это для звонящего сюдане волнует.

Так что это также делает то, что говорит заголовок:可拔插.

Чтобы добиться этого, я будуCicadaIocРеализация помещается в модуль отдельно, и реализация предоставляется в виде jar-пакета.

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

<dependency>
    <groupId>top.crossoverjie.opensource</groupId>
    <artifactId>cicada-ioc</artifactId>
    <version>2.0.0</version>
</dependency>

По умолчанию, если не используетсяCicadaDefaultBeanРеализация, то есть объект создается каждый раз.

В этом есть преимущество:

когда вы хотите добитьсяIOCконтейнер; нужно только реализоватьcicadaкоторый предоставилCicadaBeanFactoryинтерфейс и добавляйте только свойjarупаковка.

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

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

Суммировать

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

Друзья, кто еще не обратил внимание, быстро обращайте внимание на волну:

GitHub.com/вместе ОС/…

PS: Хотя реализация Spring IOC не была тщательно проанализирована, я считаю, что друзья, читающие эту статью, должны иметь некоторое представление о Spring IOC и SpringMVC.

Ваши лайки и репост - лучшая поддержка для меня