这边简单讲一下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>
- 设定应用场景:
我这边简单的规定了个页面 ; 输入邮件地址 和内容 ;可以发送邮件.在发送邮件的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 里面有个异常 ; 是为了做异常通知用的:
- 指定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可以给指定方法做一些增强 ; 或者就是做一些全局操作,.