English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Рамка SpringРекомендуется использовать его на реализации AOP, основанной на старом стиле dtd Spring 1.2 Реализация AOP с помощью Spring AspectJЛегко использовать.
Есть два способа использования реализации Spring AOP AspectJ:
Через комментарии: мы изучим это здесь. Через конфигурацию xml (базирующуюся на шаблоне): мы изучим это на следующей странице.
Реализация AOP с помощью Spring AspectJ предоставляет了许多 комментариев:
@Aspect Объявите этот класс как аспект. @Pointcut Объявление выражения切入点.
Комментарии для создания совета таковы:
@Before Объявление before совета. Применяется до вызова фактического метода. @After Объявление after совета. Применяется после вызова фактического метода и до возвращения результата. @AfterReturning Объявление совета после возвращения. Применяется после вызова фактического метода и до возвращения результата, но вы можете получить значение результата в совете. @Around Объявление вокруг совета. Оно применяется до и после вызова фактического метода. @AfterThrowing Declared throws advice. If the actual method throws an exception, this method is applied.
Pointcut is a kind of expression language in Spring AOP.
@Pointcut > Comments are used to define pointcut expressions. We can also refer to pointcut expressions by name. Let's look at a simple example of a pointcut expression.
@Pointcut("execution(* Operation.*(..))") private void doSomething() {}
The pointcut expression is named doSomething(). It will be applied to all methods of the Operation class regardless of the return type.
Let's try to understand the pointcut expression through the following example:
@Pointcut("execution(public * *(..))")
It will be applied to all public methods.
@Pointcut("execution(public Operation.*(..))")
It will be applied to all public methods of the Operation class.
@Pointcut("execution(* Operation.*(..))")
It will be applied to all methods of the Operation class.
@Pointcut("execution(public Employee.set*(..))")
It will be applied to all public setter methods of the Employee class.
@Pointcut("execution(int Operation.*(..))")
It will be applied to all methods of the Operation class that return int values.
Apply AspectJ Before Advice before the actual business logic method. You can perform any operation here, such as transformation, authentication, etc.
создать класс, содержащий фактическую бизнес-логику.
Файл: Operation.java
package com.w3codebox; public class Operation{ public void msg(){System.out.println("msg method invoked");} public int m(){System.out.println("m method invoked");return 2;} public int k(){System.out.println("k method invoked");return 3;} }
Now, create an aspect class that contains the advice before.
Файл: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class TrackOperation{ @Pointcut("execution(* Operation.*(..))") public void k(){}//имя точек среза @Before("k()")//apply the pointcut on the before notification public void myadvice(JoinPoint jp)//it is advice (before advice) { System.out.println("additional concern"); //System.out.println("Подпись метода: " + jp.getSignature()); } }
Теперь создайте файл applicationContext.xml, в котором определяются beans.
Файл: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackMyBean" class="com.w3codebox.TrackOperation"></bean> <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"></bean> </beans>
Теперь назовем это реальным методом.
Файл: Test.java
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("Вызов msg..."); e.msg(); System.out.println("вызов m..."); e.m(); System.out.println("вызов k..."); e.k(); } }
Вывод
вызов msg... Дополнительная проблема method msg() вызван вызов m... Дополнительная проблема метод m() вызван вызов k... Дополнительная проблема метод k() вызван
Как вы видите, перед вызовом методов msg(), m() и k() также будут отображаться другие вопросы.
Теперь, если вы измените выражение切入点 следующим образом:
@Pointcut("execution(* Operation.m*(..))")
Теперь мы будем больше внимания уделять методам, начинающимся на 'm' в классе Operation. Вывод будет выглядеть следующим образом:
вызов msg... Дополнительная проблема method msg() вызван вызов m... Дополнительная проблема метод m() вызван вызов k... метод k() вызван
Теперь вы можете видеть, что до вызова метода k() не было напечатано других вопросов.
После вызова реального бизнес-логического метода применяется после совета AspectJ. Его можно использовать для ведения журналов, безопасности, уведомлений и т.д.
Здесь мы предполагаем Operation.java , applicationContext.xml и Test.java файл такой же, как и в примере @Before.
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Pointcut; @Aspect public class TrackOperation{ @Pointcut("execution(* Operation.*(..))") public void k(){}//имя точек среза @After("k()")// применив точку среза после совета public void myadvice(JoinPoint jp)//это совет (после совета) { System.out.println("additional concern"); //System.out.println("Подпись метода: " + jp.getSignature()); } }
Вывод
вызов msg... method msg() вызван Дополнительная проблема вызов m... метод m() вызван Дополнительная проблема вызов k... метод k() вызван Дополнительная проблема
Вы можете видеть, что после вызова методов msg(), m() и k()出现其他问题。
Используя его после возвращения совета, мы можем получить результат в совете.
Создать класс бизнес-логики, содержащий следующее.
Файл: Operation.java
package com.w3codebox; public class Operation{ public int m(){System.out.println("запуск метода m()");return 2;} public int k(){System.out.println("запуск метода k()");return 3;} }
Создать класс аспекта, содержащий возвращаемый совет.
Файл: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; @Aspect public class TrackOperation{ @AfterReturning( pointcut = "execution(* Operation.*(..))", returning = "result") public void myadvice(JoinPoint jp, Object result)//это совет (после возвращения совета) { System.out.println("additional concern"); System.out.println("Method Signature: " + jp.getSignature()); System.out.println("Результат в совете: " + result); System.out.println("конец после возвращения совета..."); } }
Файл: applicationContext.xml
как указано в примере с советом @Before
Файл: Test.java
Создается класс Test для вызова реального метода.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("вызов m..."); System.out.println(e.m()); System.out.println("вызов k..."); System.out.println(e.k()); } }
Вывод
вызов m... метод m() вызван Дополнительная проблема Подпись метода: int com.w3codebox.Operation.m() Результат в совете: 2 конец после возвращения совета... 2 вызов k... метод k() вызван Дополнительная проблема Подпись метода: int com.w3codebox.Operation.k() Результат в совете: 3 конец после возвращения совета... 3
вы можете видеть, что значение возвращается дважды, один раз отпечатан классом TrackOperation,第二次 классом Test.
AspectJ вокруг уведомления применяется до и после вызова фактической бизнес-логики.
здесь мы предполагаем applicationContext.xml файл такой же, как и в примере @Before.
создать класс, содержащий фактическую бизнес-логику.
Файл: Operation.java
package com.w3codebox; public class Operation{ public void msg(){System.out.println("msg() is invoked");} public void display(){System.out.println("display() is invoked");} }
создать класс, содержащий аспект с окружающими советами.
вам нужно передать в метод advice PreceedingJoinPoint использование, чтобы мы могли через вызов proce выполнить метод запроса().
Файл: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public class TrackOperation { @Pointcut("execution(* Operation.*(..))") public void abcPointcut(){} @Around("abcPointcut()") public Object myadvice(ProceedingJoinPoint pjp) throws Throwable { System.out.println("Дополнительное внимание перед вызовом реального метода"); Object obj=pjp.proceed(); System.out.println("Дополнительное внимание после вызова реального метода"); return obj; } }
Файл: Test.java
Создается класс Test для вызова реального метода.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new classPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); op.msg(); op.display(); } }
Вывод
Дополнительное внимание перед вызовом реального метода Вызван msg() Дополнительное внимание после вызова реального метода Дополнительное внимание перед вызовом реального метода Вызван display() Дополнительное внимание после вызова реального метода
Вы можете видеть, что перед вызовом msg() и отображением метода также печатаются другие вопросы.
Используя совет after throw, мы можем напечатать исключение в классе TrackOperation. Давайте посмотрим на пример совета AspectJ AfterThrowing.
Создать класс, содержащий бизнес-логику.
Файл: Operation.java
package com.w3codebox; public class Operation{ public void validate(int age) throws Exception{ if(age<18){ throw new ArithmeticException("Неправильный возраст"); } else{ System.out.println("Спасибо за голосование"); } } }
Создается класс аспекта, который содержит аспект после抛出 совета.
Здесь нам также нужно передать ссылку на Throwable, чтобы мы могли перехватывать исключения здесь.
Файл: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; @Aspect public class TrackOperation{ @AfterThrowing( pointcut = "execution(* Operation.*(..))", throwing = "error") public void myadvice(JoinPoint jp, Throwable error)//it is advice { System.out.println("additional concern"); System.out.println("Method Signature: " + jp.getSignature()); System.out.println("Exception is: " + error); System.out.println("end of after throwing advice..."); } }
Файл: applicationContext.xml
как указано в примере с советом @Before
Файл: Test.java
Создается класс Test для вызова реального метода.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); System.out.println("Вызов validate..."); try{ op.validate(19); catch(Exception e){System.out.println(e);} System.out.println("Заново вызов validate again..."); try{ op.validate(11); catch(Exception e){System.out.println(e);} } }
Вывод
Вызов validate... Спасибо за голосование Заново вызов validate... Дополнительная проблема Подпись метода: void com.w3codebox.Operation.validate(int) Исключение: java.lang.ArithmeticException: Неvalidный возраст Конец after throwing advice... java.lang.ArithmeticException: Неvalidный возраст