Работа с привязками
Привязки позволяют устанавливать и управлять связями между разными частями единой модели данных сервера, например, ячейками в таблице БД или переменными/функциями/событиями разных контекстов.
Несмотря на то, что привязки обычно не требуют кастомизации, есть возможность реализовать и использовать ваш собственный пользовательский движок с того момента, как соответсвующие классы стали частью API с открытым исходным кодом.
Движок привязки базируется на нескольких основных классах и интерфейсах:
BindingProcessorуправляет выполнением привязок и соответствующих потоков.BindingProviderопределяющий действия для выполнения привязок и использования их результата.Bindingопределяет саму привязку.
Реализация процессора привязок
Процессор привязок не требует кастомизации. Стандартный класс DefaultBindingProcessor может быть использован в большинстве сучаев.
Реализация поставщика привязок
В отличие от процессора, у поставщика привязок должны быть пользовательские реализации в каждом движке привязок.
Следующий минимальный набор методов должен быть переписан для кастомизации:
createBindings(), возвращающийMap<Binding, EvaluationOptions>с объектами привязок и их опциями вычисленияwriteReference(int method, Binding binding, Reference cause, Object value, ChangeCache cache), которые выполняют изменение целиbindingв предоставленноеvalue
Method должен быть одним из:
EvaluationOptions.STARTUPEvaluationOptions.EVENTEvaluationOptions.PERIODIC
Если пользовательская реализация не основывается на стандартном ContextBindingProvider, также будет важно реализовать методы, которые добавляют и удаляют слушателей ссылки, которые вызываются при изменении состояния выполнения определенной привязки. Методы следующие:
addReferenceListener(Reference ref, ReferenceListener<T> listener)removeReferenceListener(ReferenceListener<T> listener)
Пользовательский поставщик привязок должен информировать слушателей об определенном изменении, которое должно вызывать выполнение привязки с помощью события. Это происходит путем вызова метода referenceChanged(final Reference cause, final Map<String, Object> environment, ChangeCache cache, boolean asynchronousProcessing), ранее добавленного ReferenceListener.
Использование движка привязки
Использование пользовательского движка привязки является несложным:
- Первым делом должен быть создан
BindingProcessor. Он обычно принимает экземпляр пользовательскогоBindingProviderкак аргумент. Также пользовательский пул потоков используется для параллельно работающего процесса привязки, который может быть представлен аргументом конструктора. - Дальше процесс привязки должен быть инициирован путем вызова метода
start(). - Как только движок прерывается, метод процессора привязки
stop()должен быть применен.