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

Весенний пример AOP – Совет

– Весенний пример AOP – Совет

Структура Spring AOP ( Аспектно-ориентированное программирование ) используется для модуляции сквозных проблем в аспектах. Проще говоря, это просто перехватчик для перехвата некоторых процессов, например, когда выполняется метод, Spring AOP может перехватить метод выполнения и добавить дополнительные функции до или после выполнения метода.

В весеннем AOP поддерживаются 4 типа советов:

  • Перед советом – Запуск перед выполнением метода
  • После возврата рекомендации – Запуск после того, как метод вернет результат
  • После того, как бросил совет – Запуск после того, как метод выдаст исключение
  • Вокруг советов – Обегите выполнение метода, объедините все три совета выше.

Следующий пример покажет вам, как работает весенний совет AOP.

Простой пример весны

Создайте простой класс обслуживания клиентов с несколькими методами печати для демонстрации позже.

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 – Файл конфигурации компонента



	
		
		
	


Запустите его

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("customerService");

		System.out.println("*************************");
		cust.printName();
		System.out.println("*************************");
		cust.printURL();
		System.out.println("*************************");
		try {
			cust.printThrowException();
		} catch (Exception e) {

		}

	}
}

Выход

*************************
Customer name : Yong Mook Kim
*************************
Customer website : http://www.mkyong.com
*************************

Простой весенний проект, чтобы умереть бобом и вывести несколько строк.

Весенние советы AOP

Теперь приложите советы Spring AOP к вышеуказанному обслуживанию клиентов.

1. Перед советом

Он будет выполняться до выполнения метода. Создайте класс, реализующий интерфейс MethodBeforeAdvice.

package com.mkyong.aop;

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

public class HijackBeforeMethod implements MethodBeforeAdvice
{
	@Override
	public void before(Method method, Object[] args, Object target)
		throws Throwable {
	        System.out.println("HijackBeforeMethod : Before method hijacked!");
	}
}

В файле конфигурации компонента (Spring-Customer.xml), создайте компонент для Класс HijackBeforeMethod и новый прокси-объект с именем ” customerServiceProxy “.

  • “цель” – Определите, какой боб вы хотите захватить.
  • “Имена перехватчиков” – Определите, какой класс (совет) вы хотите применить к этому прокси/целевому объекту.


	
		
		
	

	

	

		

		
			
				hijackBeforeMethodBean
			
		
	

	
		cglib
		cglib
		2.2.2
	

Запустите его снова, теперь вы получите новый прокси-сервер службы поддержки клиентов bean вместо исходного служба поддержки клиентов been.

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) {

		}

	}
}

Выход

*************************
HijackBeforeMethod : Before method hijacked!
Customer name : Yong Mook Kim
*************************
HijackBeforeMethod : Before method hijacked!
Customer website : http://www.mkyong.com
*************************
HijackBeforeMethod : Before method hijacked!

Он будет запускать Метод Hijackbeforemethod перед() методом, перед выполнением методов каждой службы поддержки клиентов.

2. После возвращения совета

Он будет выполнен после того, как метод вернет результат. Создайте класс, который реализует интерфейс AfterReturningAdvice .

package com.mkyong.aop;

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;

public class HijackAfterMethod implements AfterReturningAdvice
{
	@Override
	public void afterReturning(Object returnValue, Method method,
		Object[] args, Object target) throws Throwable {
	        System.out.println("HijackAfterMethod : After method hijacked!");
	}
}

Файл конфигурации компонента



	
		
		
	

	

	

		

		
			
				hijackAfterMethodBean
			
		
	

Запустите его снова, Выведите

*************************
Customer name : Yong Mook Kim
HijackAfterMethod : After method hijacked!
*************************
Customer website : http://www.mkyong.com
HijackAfterMethod : After method hijacked!
*************************

Он будет запускать Захват после метода после возврата() метода, после каждого метода обслуживания клиентов, который возвращает результат.

3. После того, как бросил совет

Он будет выполняться после того, как метод создаст исключение. Создайте класс, реализующий интерфейс Throwsadvice, и создайте после создания метода для захвата исключения//IllegalArgumentException.

package com.mkyong.aop;

import org.springframework.aop.ThrowsAdvice;

public class HijackThrowException implements ThrowsAdvice {
	public void afterThrowing(IllegalArgumentException e) throws Throwable {
		System.out.println("HijackThrowException : Throw exception hijacked!");
	}
}

Файл конфигурации компонента



	
		
		
	

	

	

		

		
			
				hijackThrowExceptionBean
			
		
	

Запустите его снова, выведите

*************************
Customer name : Yong Mook Kim
*************************
Customer website : http://www.mkyong.com
*************************
HijackThrowException : Throw exception hijacked!

Он будет запускать Перехватывать исключение после метода Throwing() , если методы службы поддержки клиентов создают исключение.

4. Вокруг советов

Он сочетает в себе все три вышеприведенных совета и выполняется во время выполнения метода. Создайте класс, реализующий интерфейс MethodInterceptor . Вы должны вызвать вызов метода “.продолжить(); “чтобы продолжить выполнение исходного метода, иначе исходный метод не будет выполняться.

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()));

		// same with MethodBeforeAdvice
		System.out.println("HijackAroundMethod : Before method hijacked!");

		try {
			// proceed to original method call
			Object result = methodInvocation.proceed();

			// same with AfterReturningAdvice
			System.out.println("HijackAroundMethod : Before after hijacked!");

			return result;

		} catch (IllegalArgumentException e) {
			// same with ThrowsAdvice
			System.out.println("HijackAroundMethod : Throw exception hijacked!");
			throw e;
		}
	}
}

Файл конфигурации компонента



	
		
		
	

	

	

		

		
			
				hijackAroundMethodBean
			
		
	

Запустите его снова, выведите

*************************
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!

Он будет запускать Метод Hijackaroundmethod вызывает() метод после выполнения каждого метода обслуживания клиентов.

Вывод

Большинство разработчиков Spring просто реализуют “советы по всему”, поскольку они могут применять все типы советов, но лучшая практика должна выбирать наиболее подходящий тип советов для удовлетворения требований.

Скачать Исходный Код

Оригинал: “https://mkyong.com/spring/spring-aop-examples-advice/”