springboot 中aop的用法 快来打我* 2022-05-27 00:52 163阅读 0赞 这边简单讲一下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 ![这里写图片描述][70] 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可以给指定方法做一些增强 ; 或者就是做一些全局操作,. [70]: /images/20220527/2ad52ff4fd9f412da996d111b88fc998.png
还没有评论,来说两句吧...