Пример Spring AOP - Pointcut, Advisor
В последнемSpring AOP advice examples все методы класса перехватываются автоматически. Но в большинстве случаев вам может понадобиться способ перехвата только одного или двух методов, для этого и нужен «Pointcut». Это позволяет вам перехватить метод по имени метода. Кроме того, «Pointcut» должен быть связан с «Advisor».
В Spring AOP есть три очень технических термина -Advices, Pointcut , Advisor, выражаясь неофициально ...
-
Совет. Укажите действие, которое необходимо выполнить до или после выполнения метода.
-
Pointcut - Укажите, какой метод должен быть перехвачен, по имени метода или шаблону регулярного выражения.
-
Советник - сгруппируйте «Советы» и «Pointcut» в единое целое и передайте его объекту прокси-фабрики.
Просмотрите последнийSpring AOP advice examples еще раз.
Файл: CustomerService.java
package com.example.customer.services; public class CustomerService { private String name; private String url; public void setName(String name) { this.name = name; } public void setUrl(String url) { this.url = url; } public void printName(){ System.out.println("Customer name : " + this.name); } public void printURL(){ System.out.println("Customer website : " + this.url); } public void printThrowException(){ throw new IllegalArgumentException(); } }
Файл: Spring-Customer.xml
hijackAroundMethodBeanAdvice
Файл: HijackAroundMethod.java
package com.example.aop; import java.util.Arrays; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class HijackAroundMethod implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("Method name : " + methodInvocation.getMethod().getName()); System.out.println("Method arguments : " + Arrays.toString(methodInvocation.getArguments())); System.out.println("HijackAroundMethod : Before method hijacked!"); try { Object result = methodInvocation.proceed(); System.out.println("HijackAroundMethod : Before after hijacked!"); return result; } catch (IllegalArgumentException e) { System.out.println("HijackAroundMethod : Throw exception hijacked!"); throw e; } } }
Запустить его
package com.example.common; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.example.customer.services.CustomerService; public class App { public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext( new String[] { "Spring-Customer.xml" }); CustomerService cust = (CustomerService) appContext .getBean("customerServiceProxy"); System.out.println("*************************"); cust.printName(); System.out.println("*************************"); cust.printURL(); System.out.println("*************************"); try { cust.printThrowException(); } catch (Exception e) { } } }
Выход
************************* Method name : printName Method arguments : [] HijackAroundMethod : Before method hijacked! Customer name : Yong Mook Kim HijackAroundMethod : Before after hijacked! ************************* Method name : printURL Method arguments : [] HijackAroundMethod : Before method hijacked! Customer website : http://www.example.com HijackAroundMethod : Before after hijacked! ************************* Method name : printThrowException Method arguments : [] HijackAroundMethod : Before method hijacked! HijackAroundMethod : Throw exception hijacked!
Все методы класса обслуживания клиентов перехвачены. Позже мы покажем вам, как использовать «pointcuts» для перехвата только методаprintName()
.
Пример Pointcuts
Вы можете сопоставить метод двумя способами:
-
Название совпадения
-
Регулярный репрессивный матч
1. Pointcuts - пример соответствия имени
Перехватите метод printName () с помощью «pointcut» и «advisor». Создайте bean-компонент pointcutNameMatchMethodPointcut и поместите имя метода, который вы хотите перехватить, в значение свойства «mappedName».
Создайте bean-компонент AdvisorDefaultPointcutAdvisor и свяжите с ним advice и pointcut.
Замените «interceptorNames» прокси на «customerAdvisor» (это был «hijackAroundMethodBeanAdvice»).
customerAdvisor
Полный файл конфигурации бина
customerAdvisor
Запустите это снова, вывод
************************* Method name : printName Method arguments : [] HijackAroundMethod : Before method hijacked! Customer name : Yong Mook Kim HijackAroundMethod : Before after hijacked! ************************* Customer website : http://www.example.com *************************
Теперь вы только перехватываете метод printName ().
PointcutAdvisor
Spring поставляется с классомPointcutAdvisor, чтобы сохранить вашу работу по объявлению советника и pointcut в разных bean-компонентах, вы можете использоватьNameMatchMethodPointcutAdvisor, чтобы объединить оба компонента в один bean-компонент.
2. Pointcut - Пример регулярного выражения
Вы также можете сопоставить имя метода с помощью регулярного выражения pointcut -RegexpMethodPointcutAdvisor.
.*URL.*
Теперь он перехватывает метод, который содержит слова «URL» в имени метода. На практике вы можете использовать его для управления уровнем DAO, где вы можете объявить «.*DAO. *», чтобы перехватить все ваши классы DAO для поддержки транзакции.