В последних примерах рекомендаций AOP Spring все методы класса перехватываются автоматически. Но в большинстве случаев вам может просто понадобиться способ перехватить только один или два метода, для этого и нужен “Точечный удар”. Это позволяет вам перехватывать метод по его имени. Кроме того, “Точечный разрез” должен быть связан с “Консультантом”.
Весной AOP поставляется с тремя очень техническими терминами – Советы, Точечный рисунок, Советник , изложите это неофициальным способом…
- Совет – Укажите действие, которое необходимо предпринять до или после выполнения метода.
- Точечный разрез – указывает, какой метод следует перехватывать, по имени метода или шаблону регулярного выражения.
- Советник – Сгруппируйте “Советы” и “Точки” в один блок и передайте его объекту прокси-фабрики.
Просмотрите последние Весенние примеры рекомендаций AOP еще раз.
Файл: CustomerService.java
package com.mkyong.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.mkyong.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.mkyong.common; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.mkyong.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.mkyong.com HijackAroundMethod : Before after hijacked! ************************* Method name : printThrowException Method arguments : [] HijackAroundMethod : Before method hijacked! HijackAroundMethod : Throw exception hijacked!
Перехватываются все методы класса обслуживания клиентов. Позже мы покажем вам, как использовать ” точечные вырезы ” для перехвата только метода printName()
.
Пример точечных вырезов
Вы можете сопоставить этот метод следующими двумя способами:
- Совпадение имен
- Регулярный матч репрессий
1. Точечные вырезы – Пример совпадения имен
Перехватите метод printName() с помощью “pointcut” и “советника”. Создайте компонент namematchmethod pointcut pointcut и введите имя метода, которое вы хотите перехватить, в значение свойства ‘ Отображаемое имя ‘.
Создайте компонент DefaultPointcutAdvisor advisor и свяжите как совет, так и точечный вырез.
Замените “Имена перехватчиков” прокси-сервера на “Консультант по работе с клиентами” (это был “Метод захвата, который может быть советом”).
customerAdvisor
Полный файл конфигурации компонента
customerAdvisor
Запустите его снова, выведите
************************* Method name : printName Method arguments : [] HijackAroundMethod : Before method hijacked! Customer name : Yong Mook Kim HijackAroundMethod : Before after hijacked! ************************* Customer website : http://www.mkyong.com *************************
Теперь вы перехватываете только метод printName().
2. Точечный разрез – Пример регулярного выражения
Вы также можете сопоставить имя метода с помощью регулярного выражения pointcut – regexpmethod pointcutadvisor .
.*URL.*
Теперь он перехватывает метод, в имени которого есть слова “URL”. На практике вы можете использовать его для управления слоем DAO, где вы можете объявить ” .*DAO. * “для перехвата всех ваших классов DAO для поддержки транзакций.
Скачать Исходный Код
Оригинал: “https://mkyong.com/spring/spring-aop-example-pointcut-advisor/”