В этой статье объясняется , как использовать АОП фокус в 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 / конец, нашел следующие результаты
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";
}
Результаты таковы ,
а затем намеренно выброшен в контроллере
@RequestMapping("/hello")
public String hello() {
int i = 1/0;
return "hello";
}
Результаты таковы