Acri(全称Annotation Custom Request Interception)
一个注解即可实现请求的拦截处理或AOP增强
- 一个
@Acri
或者@Acries
注解搞定请求拦截 - 支持自定义拦截器扩展
- 一个
@AcriAspect
注解搞定AOP切面 - 支持自定义切面类、切面方法扩展
- 支持单个方法单拦截
- 支持单个方法多个拦截
- 支持多方法多拦截
- 支持类标注
@Acri
@Acries
注解 @Acri
@Acries
注解支持拦截覆盖和拦截合并
<dependency>
<groupId>cn.fntop</groupId>
<artifactId>acri-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
@Acri(value = AcriStopWatchProcessor.class, before = true, during = true, after = true)
@GetMapping("/login")
public String login() {
log.info("登录中");
return "登录成功";
}
@Acri(value = AcriStopWatchProcessor.class, before = true, during = true, after = true)
配置项 | 默认值 | 备注 |
---|---|---|
value | null | 具体拦截处理器,实现AcriProcessor并注入Spring容器 |
before | false | 是否处理请求前执行doBefore方法 |
during | false | 是否处理请求方法后执行doDuring方法 |
after | false | 是否在返回响应后执行doAfter方法 |
@Acries(acries = {@Acri(value = AcriStopWatchProcessor.class, before = true, after = true) , @Acri(value = CustomProcessor.class, before = true, after = true)})
如果存在@Acries
注解,则@Acri
注解不起作用
配置项 | 默认值 | 备注 |
---|---|---|
acries | null | 多@Acri拦截 |
@AcriAspect(fallback=Custom.class,before=true,beforeMethod="before")
注释事项:
任何自定义切面方法,方法的参数都是AcriContainer container
,可以从该容器中获取调用方法的返回值、参数、异常信息
配置项 | 默认值 | 备注 |
---|---|---|
fallback | null | 自定义切面类 |
before | false | 是否启用前置通知 |
around | false | 是否启用环绕通知 |
after | false | 是否启用后置通知 |
throwing | false | 是否启用异常通知 |
beforeMethod | before | 启用前置通知调用的默认方法名称 |
beforeAroundMethod | beforeAround | 启用环绕通知(前置环绕)调用的默认方法名称 |
afterAroundMethod | afterAround | 启用环绕通知(后置环绕)调用的默认方法名称 |
afterMethod | after | 启用后置通知调用的默认方法名称 |
throwingMethod | throwing | 启用异常通知调用的默认方法名称 |
@AcriAspect(fallback = TestController.class, around = true, throwing = true, before = true, after = true)
@RestController
@Slf4j
public class TestController {
//Acri AOP
@AcriAspect(fallback = TestController.class, around = true, throwing = true, before = true, after = true)
@GetMapping("/login")
public User login(User param) {
log.info("登录中,{}", param);
// int i = 1 / 0;
return new User();
}
//前置通知
public void before(AcriContainer container) {
log.info("before => {}", container.getParams() == null ? "" : container.getParams().toString());
}
//后置通知
public void after(AcriContainer container) {
log.info("after => {}", container.getResult() == null ? "" : container.getResult().toString());
log.info("after => {}", container.getParams() == null ? "" : container.getParams().toString());
}
//前置环绕
public void beforeAround(AcriContainer container) {
log.info("beforeAround => {}", container.getParams() == null ? "" : container.getParams().toString());
}
//后置环绕
public void afterAround(AcriContainer container) {
log.info("afterAround => {}", container.getResult() == null ? "" : container.getResult().toString());
log.info("afterAround => {}", container.getParams() == null ? "" : container.getParams().toString());
}
//异常通知
public void throwing(AcriContainer container) {
log.info("throwing => {}", container.getException() == null ? "" : container.getException().toString());
log.info("throwing => {}", container.getParams() == null ? "" : container.getParams().toString());
}
}
- 进群讨论
- 提issue 先搜索再提,看是否搜到相关的issue(问题)
- Fork 本项目
- 新建分支,如果是加新特性,分支名格式为feat_
issue的ID号
,如果是修改bug,则命名为fix_issue的ID号
。 - 本地自测,提交前请通过所有的单元测试,以及为您要解决的问题新增单元测试。
- 提交代码
- 新建 Pull Request
- 我会对您的PR进行验证和测试,如通过测试,我会合到dev分支上随新版本发布时再合到master分支上。
欢迎小伙伴们多提issue和PR,被接纳PR的小伙伴会列在贡献者列表中
697135336
gensui_