AspectJУстановить АспектJСкачать AspectJКонфигурация переменной средыНастройте AspectJ в IDEAАктивировать плагин поддержки AspectJДобавьте зависимость aspectjrt.jar или зависимость Maven.Использование компилятора AspectJ (ajc)Простой пример AspectJПример 1Пример 2журнал проблемиспользованная литература
AspectJ
AspectJ — это фреймворк АОП, основанный на языке Java, который предоставляет мощные функции АОП, и многие другие фреймворки АОП заимствовали или переняли некоторые из этих идей.
AspectJ — это АОП-реализация языка Java. В основном он состоит из двух частей: первая часть определяет, как выражать и определять спецификации синтаксиса в АОП-программировании. Благодаря этому набору языковых спецификаций мы можем легко использовать АОП для решения проблем в Java. язык.Есть перекрестные проблемы; другая часть - это часть инструментов, включая компиляторы, инструменты отладки и т. д.
AspectJ — одна из самых ранних и наиболее мощных реализаций АОП.В ней реализована хорошая реализация всего набора механизмов АОП.Реализации АОП на многих других языках также опираются или перенимают многие конструкции в AspectJ. В мире Java многие синтаксические конструкции AspectJ в основном стали стандартными в мире АОП.
Установить АспектJ
Скачать AspectJ
Чтобы установить AspectJ, сначала перейдите наОфициальный сайт AspectJЗагрузите исполняемый пакет Jar.
Вы можете загрузить его в исполняемый пакет JAR, я скачал аспект j-1.8.14.jar, используйтеjava -jar aspectj-1.8.14.jar
Заказ,
AspectJ можно успешно установить, несколько раз нажав кнопку «Далее» и выбрав соответствующий каталог установки.
После установки AspectJ в его установочном каталоге вы можете увидеть следующую файловую структуру:
├─bin // 该路径下存放了 aj、aj5、ajc、ajdoc、ajbrowser 等命令。
│ ├─aj.bat
│ ├─aj5.bat
│ ├─ajbrowser
│ ├─ajbrowser.bat
│ ├─ajc // 其中 ajc 命令最常用,它的作用类似于 javac,用于对普通 Java 类进行编译时增强。
│ ├─ajc.bat
│ ├─ajdoc
│ ├─ajdoc.bat
├─doc // 该路径下存放了AspectJ的使用说明、参考手册、API文档等文档。
├─lib // 该路径下的4个Jar文件是AspectJ的核心类库
│ ├─aspectjrt.jar
│ ├─aspectjtools.jar
│ ├─aspectjweaver.jar
│ ├─org.aspectj.matcher.jar
├─LICENSE-AspectJ.html 相关授权文件
└─README-AspectJ.html
Конфигурация переменной среды
CLASSPATH:.;D:\Java_About\Java_component\aspectj-1.8.14\lib\aspectjrt.jar;
Path:D:\Java_About\Java_component\aspectj-1.8.14\bin
Проверьте успешность установки с помощью команды ajc:
Настройте AspectJ в IDEA
Хотя AspectJ является проектом с открытым исходным кодом Eclipse Foundation и предоставляет подключаемый модуль AJDT (средства разработки AspectJ) для Eclipse для разработки приложений AspectJ, AspectJ разрабатывается не только в Eclipse. Поскольку я использую версию IntelliJ IDEA 2019.1.2, вот как разрабатывать AspectJ в IDEA.
Только Professional Edition (Ultimate) IntelliJ IDEA поддерживает разработку AspectJ, и IDEA также предоставляетофициальная документация.
Активировать плагин поддержки AspectJ
Для разработки AspectJ в профессиональной версии IDEA необходимо убедиться, что следующие плагины активированы:
- Spring AOP/@AspectJ
- AspectJ Support
Поскольку я использую версию IDEA 2019.1.3, это не то же самое, что онлайн-выписка.Конфигурация выглядит следующим образом:
Эти два плагина уже существуют в версии 2019 года, поэтому для их установки не требуется дополнительный поиск.
Добавьте зависимость aspectjrt.jar или зависимость Maven.
Добавить зависимость aspectjrt.jar
добавить в проектaspectjrt.jar
полагаться,aspectjrt.jar
то есть в каталоге установки AspectJlib
jar в каталоге.
Затем сделайте следующее, чтобы добавить пакет Jar в зависимости проекта:
- Открыть
Project Structure
Диалог (Ctrl+Shift+Alt+S). - В соответствии с созданием библиотеки уровня проекта или уровня IDE выберите «Библиотеки» или «Глобальные библиотеки» соответственно.
- Нажмите знак + и выберите java.
- Во всплывающем диалоговом окне выберите файл aspectjrt.jar в каталоге lib, который мы только что добавили в проект.
- Наконец, нажмите кнопку ОК.
Добавить зависимости Maven
Если вы используете Maven для управления проектом, вы можете добавить связанные зависимости в файл pom.xml.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.msdn</groupId>
<artifactId>spring_aop</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.14</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.14</version>
</dependency>
</dependencies>
</project>
Оба вышеперечисленных метода позволяют добиться одинакового эффекта.
Использование компилятора AspectJ (ajc)
IDEA использует по умолчаниюjavac
Компилятор, если вы хотите использовать компилятор AspectJajc
, вам нужно соответствующим образом настроить его в IDEA.
Открытьsettings
диалоговое окно, а затем выполните следующую настройку:
Простой пример AspectJ
На самом деле использование AspectJ очень простое, точно так же, как мы используем JDK для компиляции и запуска Java-программ. Ниже приведена простая программа для демонстрации использования AspectJ и анализа того, как AspectJ улучшается во время компиляции.
Пример 1
HelloWorld.java
public class HelloWorld {
public void sayHello(){
System.out.println("Hello AspectJ");
}
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
hello.sayHello();
}
}
EстьsayHello()
метод, который выводит предложение!
Допустим, теперь нам нужноsayHello()
Запустите транзакцию перед методом и закройте транзакцию, когда метод завершится, затем в традиционном режиме программирования мы должны вручную изменитьsayHello()
метод. И если мы используем AspectJ, нам не нужно изменять вышеуказанный метод, нам просто нужно добавить фасет.
TxAspect.aj
public aspect TxAspect {
void around():call(void HelloWorld.sayHello()){
System.out.println("开始事务。。。");
proceed();
System.out.println("结束事务。。。");
}
}
Приведенный выше TxAspect вообще не является классом Java, поэтому аспект не является ключевым словом, поддерживаемым Java, это просто ключевое слово, распознаваемое AspectJ. его суффикс.aj
, полное имя файлаTxAspect.aj
. Синтаксис аспекта толькоAspectJ
может распознавать и использовать его специальный компиляторajc
компилировать.
Этот код перехватываетHello.sayHello()
метод и запустить транзакцию до ее выполнения,proceed()
Метод представляет обратный вызов исходномуsayHello()
метод, который завершает транзакцию после выполнения.
Результат выполнения:
开始事务。。。
Hello AspectJ
结束事务。。。
По результатам вышеописанной операции мы можем совершенно ошибатьсяHelloWorld.java
Любая модификация класса вносит в него функцию управления транзакциями, что и является смыслом аспектно-ориентированного программирования. Из этого примера мы также можем оценить простые в освоении, использовании, неинвазивные (нет необходимости наследовать какие-либо классы и интерфейсы) функции AspectJ.
Пример 2
В дополнение к вышеперечисленным функциям управления транзакциями вы также можетеsayHello()
Функция логирования добавлена после метода. Давайте определим другой LogAspect,
LogAspect.aj
public aspect LogAspect {
// 定义一个 PointCut,其名为 logPointcut
// 该 PointCut 对应于指定 HelloWorld 对象的 sayHello 方法
pointcut logPointCut():execution(void HelloWorld.sayHello());
// 在 logPointcut 之后执行下面代码块
after():logPointCut(){
System.out.println("记录日志。。。。");
}
}
Вышеприведенный код определяет Pointcut: logPointcut — эквивалентно выполнению объекта HelloWorld.sayHello()
метод и указать, что простой блок кода выполняется после logPointcut, то есть после logPointcutsayHello()
Указанный блок кода выполняется после метода.
Результат выполнения:
开始事务。。。
Hello AspectJ
记录日志。。。。
结束事务。。。
Исходя из приведенных выше результатов, используя поддержку АОП, предоставляемую AspectJ, мы можем постоянно добавлять новые функции в метод sayHello().
Почему класс HelloWorld может постоянно и динамически добавлять новые функции без каких-либо изменений в классе HelloWorld? Кажется, это не соответствует основным правилам грамматики Java. Фактически, мы можем использовать инструмент декомпиляции Java для декомпиляции файла HelloWorld.class, сгенерированного предыдущей программой, и обнаружить, что код файла HelloWorld.class выглядит следующим образом:
public class HelloWorld {
public HelloWorld() {
}
public void sayHello() {
try {
System.out.println("Hello AspectJ");
} catch (Throwable var2) {
LogAspect.aspectOf().ajc$after$com_msdn_aspectj_LogAspect$1$9e12ed77();
throw var2;
}
LogAspect.aspectOf().ajc$after$com_msdn_aspectj_LogAspect$1$9e12ed77();
}
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
sayHello_aroundBody1$advice(hello, TxAspect.aspectOf(), (AroundClosure)null);
}
}
Нетрудно обнаружить, что файл HelloWorld.class не скомпилирован из исходного файла HelloWorld.java, в HelloWorld.class добавлено много контента, в метод sayHello() добавлена функция журнала, и к основному методу добавлена функция управления транзакциями. Это указывает на то, что AspectJ «автоматически» компилирует новый класс во время компиляции, что расширяет функциональные возможности исходного класса HelloWorld.java, поэтому AspectJ часто называют классом времени компиляции. расширенная структура АОП.
журнал проблем
В процессе проведения кейс-теста возник ряд проблем, которые можно резюмировать следующим образом:
1. При установке AspectJ я сначала установил версию aspectj-1.9.2, но в последующем собственно процессе тестирования код выполнялся некорректно из-за ошибки при настройке компилятора AspectJ в IDEA Ситуация, которую я настроил на тот момент такова показано на рисунке ниже:
По отметке красным прямоугольником на рисунке я думал, что нужно заполнить номер версии, но после выполнения кода будет выдано сообщение об ошибке:
Сообщение об ошибке:
Error:ajc: Compliance level '1.8' is incompatible with target level '9'. A compliance level '9' or better is required
Причина: Локально используется версия JDK 1.8.Если здесь настроена версия 1.9, конфигурация компилятора Javac также изменится, что приведет к ошибке.
Вот почему я вместо этого установил аспект j-1.8.14, я подумал, что его нужно унифицировать с версией JDK. Но на самом деле нет необходимости заполнять содержимое красной рамки на рисунке. Как показано ниже:
2. Во время выполнения возникает подобная ошибка, и сообщение об ошибке выглядит следующим образом:
Error: java: Compliance level '1.6' is incompatible with target level '1.8'. A compliance level '1.8' or better is required
Нажмите «Структура проекта» на вкладке «Файл», выберите «Настройки проекта» -> «Модули» и выберите уровень языка, соответствующий версии 1.8.