Весна Загрузочный вход дороги (11) --- использование АОП в Spring ботинке

Предупреждение: Данная статья является блоггером оригинальной статьи, следовать CC 4.0 BY-SA авторского соглашения, воспроизведенный, пожалуйста , приложите ссылку первоисточника и это утверждение.
Эта ссылка: https://blog.csdn.net/Geffin/article/details/100534556

В этой статье объясняется , как использовать АОП фокус в Spring Ботинок в не слишком много запутался в основах АОП, если студенты еще не знают , для АОП может смотреть на , прежде чем я написал эту статью АОП Подробный весной

1 вводится зависимость

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

После того, как мы вводим АОП зависимости, он не требует дополнительной настройки, потому что Spring загрузка помогает нам настроить.

2 Создание простого контроллера

package edu.szu.test.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
	
	@RequestMapping("/hello")
	public String hello() {
		return "hello";
	}
	
	@RequestMapping("/end")
	public String end() {
		return "end";
	}
}

3 Создать раздел класса

Здесь следует отметить, что для того, чтобы стать классом класса вырезать, вы должны добавить аннотации @Component и @Aspect.

package edu.szu.test.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
	
	private Logger logger = LoggerFactory.getLogger(LogAspect.class);
	
	// 配置切点
	@Pointcut("execution(* edu.szu.test.controller.*.*(..))")
	private void point(){};
	
	// 前置通知
	@Before("point()")
	public void doBefore(JoinPoint joinPoint){
		//获取通知的签名
		Signature signature = joinPoint.getSignature();
		//获取代理方法
		String name = signature.getName();
		//获取代理类
		String className = signature.getDeclaringTypeName();
		logger.info("这是一个前置通知:" + "代理方法为" + name + " 代理类为" + className);
	}
}

Здесь мы определяем точку отсечки для всех функций при edu.szu.test.controller.

Откройте браузер, чтобы войти Http: // Localhost: 8080 / привет, затем введите HTTP: // локальный: 8080 / конец, нашел следующие результаты
Здесь Insert Picture Описание

4 другие уведомления

package edu.szu.test.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
	
	private Logger logger = LoggerFactory.getLogger(LogAspect.class);
	
	// 配置切点
	@Pointcut("execution(* edu.szu.test.controller.*.*(..))")
	private void point(){};
	
	// 前置通知
	@Before("point()")
	public void doBefore(JoinPoint joinPoint){
		//获取通知的签名
		Signature signature = joinPoint.getSignature();
		//获取代理方法
		String name = signature.getName();
		//获取代理类
		String className = signature.getDeclaringTypeName();
		logger.info("这是一个前置通知:" + "代理方法为" + name + " 代理类为" + className);
	}
	
	// 环绕通知
	@Around("point()")
	public Object around(ProceedingJoinPoint proceedingJoinPoint) {
		//获取方法名
		String name = proceedingJoinPoint.getSignature().getName();
		logger.info("这是一个环绕通知:" + "代理方法为" + name);
		try {  
	        Object obj = proceedingJoinPoint.proceed();  
	        logger.info("这是一个环绕通知:方法已被执行");
	        return obj;  
	    } catch (Throwable throwable) {  
	        throwable.printStackTrace();
	        logger.error("这是一个环绕通知:出错了!");
	    }  
	    return null;  
	}
	
	// 后置通知
	@After("point()")
	public void after(JoinPoint joinPoint) {
		//获取通知的签名
		Signature signature = joinPoint.getSignature();
		//获取代理方法
		String name = signature.getName();
		//获取代理类
		String className = signature.getDeclaringTypeName();
		logger.info("这是一个后置通知:" + "代理方法为" + name + " 代理类为" + className);
	}
	
	// 后置返回通知,其中 keys 为返回值的信息
	@AfterReturning(value = "point()",returning = "keys")  
	public void afterReturning(JoinPoint joinPoint,Object keys){  
	    logger.info("这是一个后置返回通知:返回值为" + keys.toString());  
	}  
	
	// 后置异常通知
	@AfterThrowing(value = "point()",throwing = "exception")
	public void afterThrowing(JoinPoint joinPoint,Throwable exception){  
		//获取通知的签名
		Signature signature = joinPoint.getSignature();
		//获取代理方法
		String name = signature.getName();
		logger.error("这是一个后置异常通知:" + "代理方法为" + name);
	    logger.error("这是一个后置异常通知:" + exception); 
	}  
}

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

5 Test

Во-первых, чтобы проверить нормальный контроллер

	@RequestMapping("/hello")
	public String hello() {
		//int i = 1/0;
		return "hello";
	}

Результаты таковы ,
Здесь Insert Picture Описание
а затем намеренно выброшен в контроллере

	@RequestMapping("/hello")
	public String hello() {
		int i = 1/0;
		return "hello";
	}

Результаты таковы
Здесь Insert Picture Описание
Здесь Insert Picture Описание

рекомендация

отblog.csdn.net/Geffin/article/details/100534556