Рубрики
Без рубрики

Пример весеннего AOP – Точечный разрез, советник

– Весенний пример AOP – Точечный разрез, Советник

В последних примерах рекомендаций 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. Совпадение имен
  2. Регулярный матч репрессий

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/”