Аспектно-ориентированное программирование. Основы

Аспектно-ориентированное программирование. Основы

334
ПОДЕЛИТЬСЯ

AspectJ — дитя Xerox PARC, сейчас совершеннолетнее и живущее в Eclipse Foundation. Продолжим тему, начатую в прошлой слесарно-программистской статье про AspectJ и open source расширение для данной библиотеки aspectj-scripting. В данной заметке разглядим какие задачки решает аспектно-направленное программирование (AOP) на примере и синтаксисе самой известной библиотеки посреди адептов данной методологии.

(фото из статьи на lurkmore про евроремонт)

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

Disclaimer: Я не теоретик, потому рассказанное в статье субъективно, пропущено через призму опыта.

Новейший синтаксис, какие-то нюансы, срезы(pointcut) — ведь все в итоге преобразуется в те же аннотации выполняемые jvm. Для чего все эти трудности, иной подход к проектированию систем, когда есть объектно-направленное программирование?

Но при переводе в частотное представление просто отфильтровать шумы определенной частоты, выделить нотки в мелодии, усилить звук голоса и т.п. Нюансы — это дополнение к ООП програмкам, иная парадигма при разработке и проектировании программ, не противоречащая использованию объектной модели в приложении. При опытном применении AOP помогает «распутать» «запутанный» код программы. Вопросец в удобстве разработки, легкости модификации, тестирования и стоимости поддержки системы. В временной области с начальным сигналом трудно выполнить обработку и анализ. Так же и нюансы разрешают просто работать со почти всеми задачками в другом представлении программы и выделить сквозную функциональность в виде нюанса. Аналогия, которая сходу приходит на разум — анализ звуковых данных.

Сиим не ограничивается перечень того, для чего же может быть комфортно AOP. Возникает возможность убрать аннотации ведения журнальчика операций(логгинга) и обработки системных ошибок из бизнес-логики приложения, уменьшить количество бойлерплейт кода, инспектировать права доступа юзера при обращении к определенным способам либо полям класса, декларативно управлять транзакциями базы данных, делать свое инструментирующее профилирование интересующего вас участка кода, в котором учитывается не лишь факт вызова и время выполнения операции но и некий контекст, кеширование «тяжелых» операций бизнес логики раз у их нет побочного эффекта, поиск мест программы в которых конструирование объектов определенного типа. К примеру, в проекте на работе, я применяю нюансы для тестирования распределенного приложения, сбора метрик в нем, имитации ошибок базы данных и таймаутов снутри jdbc драйвера oracle и сетевых взаимодействий.

Начнем с понятия что такое advice в AspectJ — это то как будет применяться нюанс в срезе кода(pointcut): перед срезом (BEFORE), опосля (AFTER), опосля удачного возврата (AFTER RETURNING), в случае ошибки в точке среза (AFTER THROWING), либо полный контроль над ситуацией (AROUND) где без помощи других нужно вызывать начальный код в срезе, передавать характеристики и обрабатывать ошибки выполнения в точке среза.

Так же не все мыслимые точки среза можно указать декларативно, что время от времени просит анализа контекста вызова в коде реализации нюанса. Синтаксис довольно обеспеченный и дозволяет обрисовать сложные правила, определяющие точки среза. Pointcut либо срез — это описание того, где мы будем внедрять в начальную програмку нюанс. Естественно, волшебства в программировании нет, что добавляет ограничения на то что инлайнится в б коде и не доступно в pointcut. + логические операции в синтаксисе pointcut. К примеру, конструирование объекта, блоки статической инициализации, вызов конструктора, доступ к полям объекта на чтение/запись, конструирование объекта, блок catch, способы с какой-или аннотацией, вызов способа с параметрами определенного типа, имя способа по маске и т.п.

В случае с AROUND advice здесь же можно выполнить фактический вызов, поменять его характеристики и получить возращаемое значение либо обработать ошибку. Параметр точки соединения (join point) в нюансе дозволяет получить значения аргументов, выяснить место где практически произошел вызов нюанса в срезе, получить this объекта и т.п.

Все то, что на 1-ый взор кажется мистикой, в AspectJ или реализуется плагином во время сборки проекта (weaving to bytecode), или java агентом с помощью модификации б кода программы во время загрузки классов(load-time weaving). AspectJ — зрелый AOP фреймворк с большущим комьюнити, обилием публикаций про него, неплохой документацией, довольно стабильный, встроенный в различные системы сборки, интеграция в Spring, с неплохой поддержкой в IDE.

Код доступен на github, а агент в центральном репозитарии. В прошлой публикации употреблял эту библиотеку для модификации поведения maven plugin Про остальные примеры использования аспектно-нацеленного программирования в практике, расскажу в последующих статьях. В aspectj-scripting (расширении AspectJ java агента) есть возможность для качеств во время выполнения загружать классы из maven репозитария, считывать конфигурацию агента не лишь из файла и classpath, но и с http сервера. Это может сильно посодействовать в тестировании, профилировании и модификации распределенного java приложения.

Как вишенка на тортике украшает его и делает наиболее вкусным, так же и аспектно-направленное программирование в объектно-направленной програмке упрощает разработку, модификацию и тестирование. Принципиально не увлекаться применением AOP в проекте — чтоб не вышла кастрюля вишни с ложкой крема сверху!

habrahabr.ru