springboot 中aop的用法

这边简单讲一下springboot中 ; aop的用法.
1. 追根溯源 & 引入jar包
其实我们在spring的框架中,就知道用只要引入aop的相关依赖就可以使用aop的思想来做些事情了 ; springboot 帮我们引入了开箱即用的依赖; spring-boot-starter-aop ; 想要在springboot 中,使用这个功能, 第一步肯定是引入jar 包.

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
  1. 设定应用场景:
    我这边简单的规定了个页面 ; 输入邮件地址 和内容 ;可以发送邮件.在发送邮件的impl类的方法中加入aop
    这里写图片描述

index.html页面代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>邮件测试</title>
</head>
<body>
<form action="http://127.0.0.1:8080/send_mail" method="post">
    输入您的邮箱地址: <input type="text" name="toaddr" />
    <br/>
    文件内容:<input type="text" name="content" />\
    <br/>
    <input type="submit" value="Submit" />
</form>
</body>
</html>

返回的页面代码result.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>result</title>
</head>
<body>
    <h1>发送邮件成功</h1>
</body>
</html>

controller代码:

@Controller
@Slf4j
public class IndexController {
    @Autowired
    private MailService mailService;
    @PostMapping("/send_mail")
    public String sendMail(AutoMail mailInfo) {
        log.info("addr:{},content:{}",mailInfo.getToaddr(),mailInfo.getContent());
        mailService.sentMail(mailInfo.getToaddr(),mailInfo.getContent());
        return "result";
    }

    @GetMapping("/test")
    public ModelAndView testSkip(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("123");
        return mv;
    }

}

注意:我这边的@slf4j 是采用lombok的注解; 如果你们引用报错 ; 可以去掉

service && serviceimpl : 重点 这边为了跳转更迅速 ; 不用等邮件信息返回 ; 改用了异步操作,在impl上增加了@Async注解 ; 如果要这么用 ; 在springboot启动类上; 要加入:@EnableAsync 注解

public interface MailService {
    void sentMail(String toaddr, String content);
}
@Service
@Async
public class MailServiceImpl implements MailService {
    @Autowired
    private JavaMailSender javaMailSender;
    @Value("${spring.mail.username}")
    private String username;

    @Override
    public void sentMail(String toaddr, String content) {
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(toaddr);
            message.setFrom(username);
            int i = 1/0;
            message.setSubject("测试邮件(邮件主题)");
            message.setText(content);
            javaMailSender.send(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意: 这边我impl 里面有个异常 ; 是为了做异常通知用的:

  1. 指定aop
    我这边定义了一个aop 类, 叫做 DemoAspect:
@Component //告诉spring这是个组件,要扫描
@Aspect // 告诉spring, 这是个切面
public class DemoAspect {

    //自定义切入点:就是我们的serviceImpl
    @Pointcut(value = "execution(public * com.ding.service.impl.MailServiceImpl.*(..))")
    public void publicMethod(){}

    //在调用之前就可以 获得request 信息 ; 一般用于对controller之前的通知; service无用, 这边只是做记录 ,告诉大家有这个操作
/*@Before("publicMethod()")
    public void testAsp(JoinPoint joinPoint){
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        System.out.println("URL : " + request.getRequestURL().toString());
        System.out.println("HTTP_METHOD : " + request.getMethod());
        System.out.println("IP : " + request.getRemoteAddr());
        System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs()));
        System.out.println(123);
    }*/

    //出现异常了, 也可以记录下异常信息
    @AfterThrowing( pointcut = "publicMethod()",throwing = "e")
    public void testThrowing(Exception e){
        for (StackTraceElement stackTraceElement : e.getStackTrace()) {
            System.out.println("stackTraceElement==========:"+stackTraceElement);
        }
    }

    //在返回之前可以记录下返回值 ; 当然我们这边没有也走不到返回值这一步; 因为前面出现了异常
    @AfterReturning(returning = "ret", pointcut = "publicMethod()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        System.out.println("方法的返回值 : " + ret);
    }
}

好了,大家可以启动项目做一下测试 ; 这边还引入了springboot 中的Mail模块 ; 如果有不清楚的同学; 可以 去看看 相关的东西 ;主要就是一些配置.

aop可以给指定方法做一些增强 ; 或者就是做一些全局操作,.

猜你喜欢

转载自blog.csdn.net/qq_14853889/article/details/79858688