Введение
Расширение для аспектно-ориентированного программирования на Java
AspectJ — это расширение для языка программирования Java, реализующее аспектно-ориентированное программирование (AOP) и разработанное в PARC. Оно доступно в проектах Eclipse Foundation с открытым исходным кодом как в виде самостоятельного продукта, так и интегрированное в Eclipse. AspectJ стал широко используемым фактическим стандартом для AOP, делая акцент на простоте и удобстве использования для конечных пользователей. Он использует синтаксис, близкий к Java, и включает интеграцию со средами разработки (IDE) для отображения сквозной структуры с момента своего первого публичного релиза в 2001 году.
Совместимость и реализация
AspectJ может быть реализован множеством способов, включая вплетение исходного кода или байт-кода, а также непосредственно в виртуальной машине (ВМ). Во всех случаях программа AspectJ становится корректной программой Java, работающей в Java VM. Классы, затронутые аспектами, остаются бинарно совместимыми с незатронутыми классами (для сохранения совместимости с классами, скомпилированными из исходных версий). Поддержка различных реализаций позволяет языку развиваться вместе с технологическими изменениями, а совместимость с Java гарантирует кроссплатформенность. Ключом к успеху стали инженерные и языковые решения, обеспечивающие удобство использования языка и возможность развертывания программ. Изначальная реализация AspectJ от Xerox использовала вплетение исходного кода, что требовало доступа к исходному коду. Когда Xerox передала код в Eclipse, AspectJ был перереализован с использованием компилятора Eclipse Java и вплетателя байт-кода на основе BCEL, что позволило разработчикам писать аспекты для кода в двоичном формате (.class). В то время язык AspectJ был ограничен поддержкой модели "по классу", необходимой для инкрементальной компиляции и вплетения во время загрузки. Это обеспечило такую же отзывчивость интеграций IDE, как и у их Java-аналогов, и позволило разработчикам развертывать аспекты без изменения процесса сборки. Это привело к увеличению популярности, поскольку AspectJ стал доступен для нетерпеливых Java-программистов и корпоративных развертываний. С тех пор команда Eclipse повысила производительность и надежность, обновила язык AspectJ для поддержки функций Java 5, таких как обобщения и аннотации, и интегрировала аспекты Java в стиле аннотаций из AspectWerkz. Проект Eclipse поддерживает как интерфейс командной строки, так и Ant. Связанный проект Eclipse постоянно улучшает поддержку AspectJ в Eclipse IDE (под названием AspectJ Development Tools (AJDT)) и других средств обеспечения сквозной функциональности. Поддержка IDE для Emacs, NetBeans и JBuilder прекратилась после того, как Xerox сделала их открытыми, но поддержка JDeveloper от Oracle была реализована. Поддержка IDE сыграла ключевую роль в использовании AspectJ программистами Java и понимании сквозных задач. BEA предлагала ограниченную поддержку VM для расширений, ориентированных на аспекты, но для расширений, поддерживаемых во всех Java VM, требовалось бы согласование через Java Community Process от Sun (см. также пакет java.lang.instrument, доступный начиная с Java SE 5, который является общей платформой для инструментации JVM во время загрузки). Академический интерес к семантике и реализации языков, ориентированных на аспекты, сопровождал AspectJ с момента его выпуска. Ведущей исследовательской реализацией AspectJ является компилятор AspectBench, или abc; он поддерживает расширения для изменения синтаксиса и семантики языка и служит основой для многих экспериментов AOP, которые команда AspectJ больше не может поддерживать, учитывая широкую пользовательскую базу. Многие программисты открывают для себя AspectJ как технологию, расширяющую возможности других проектов, в частности Spring AOP. Вспомогательный проект Spring, Spring Roo, автоматически поддерживает объявления межтиповых связей AspectJ в качестве основного результата генерации кода.
История и авторы
Грегор Кицалес основал и возглавил команду Xerox PARC, которая в конечном итоге разработала AspectJ. Он ввел термин "сквозная функциональность". Четвертым в команде Крис Мейда ввел термин "аспектно-ориентированное программирование". Джим Хугунин и Эрик Хилсдейл (члены команды Xerox PARC № 12 и 13) были первоначальными разработчиками компилятора и инструмента для переплетения кода, Мик Керстен реализовал интеграцию со средой разработки и начал проект Eclipse AJDT вместе с Адрианом Кольером и Эндрю Клементом. После Адриана Кольера Эндрю Клемент стал руководителем проекта и основным разработчиком AspectJ. AJDT впоследствии был прекращен как отдельный проект и интегрирован в проект Eclipse AspectJ для упрощения обслуживания. Однако, как AspectJ, так и AJDT по-прежнему поддерживаются в отдельных репозиториях исходного кода. В 2021 году Александр Кригиш присоединился к проекту, сначала как участник, затем как коммиттер и сопровождающий. С марта 2021 года он фактически является единственным сопровождающим. С 2024 года он также официально является руководителем проектов AspectJ и AJDT. Компилятор AspectBench был разработан и поддерживается совместными усилиями группы разработки инструментов программирования в Оксфордской университетской вычислительной лаборатории, исследовательской группы Sable в Университете МакГилла и Института фундаментальных исследований в области компьютерных наук (BRICS).
AspectWerkz (Объект работы)
AspectWerkz был динамичным, легковесным и высокопроизводительным AOP/AOSD-фреймворком для Java. Он был объединен с проектом AspectJ, который поддерживает функциональность AspectWerkz, начиная с версии AspectJ 5. Джонас Бонер и Алекс Вассер разработали проект AspectWerkz и впоследствии внесли вклад в проект AspectJ при интеграции стиля аннотаций AspectWerkz и поддержки внедрения во время загрузки классов. В отличие от AspectJ до версии 5, AspectWerkz не добавлял никаких новых языковых конструкций в Java, а поддерживал объявление аспектов с помощью аннотаций Java. Он использует модификацию байт-кода для внедрения аспектов на этапе сборки проекта, загрузки классов и во время выполнения. Стандартизированные аспекты могут быть определены с использованием аннотаций Java (представленных в Java 5), пользовательского doclet для Java 1.3/1.4 или простого XML-файла определения. AspectWerkz предоставляет API для использования одних и тех же аспектов для прокси, обеспечивая прозрачность и плавный переход для пользователей, знакомых с прокси. AspectWerkz является свободным программным обеспечением. Лицензия, совместимая с LGPL, позволяет использовать AspectWerkz 2.0 как в коммерческих, так и в проектах с открытым исходным кодом.