предисловие
После шлифовки долго, с помощью последней ночевки онлайн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
Большая дыра почти заполнена, и в будущем будет сделано несколько небольших итераций функций.
Друзья, кто еще не обратил внимание, быстро обращайте внимание на волну:
PS: Хотя реализация Spring IOC не была тщательно проанализирована, я считаю, что друзья, читающие эту статью, должны иметь некоторое представление о Spring IOC и SpringMVC.
Ваши лайки и репост - лучшая поддержка для меня