关于aop的两种方式-基于注解和基于aspectj
spring的aop确实好用,能够在不影响业务功能的情况下,实现一些低耦合的功能。
而aop又有两种常用的实现方式,一种是用aspectj表达式去匹配,实现全局的配置,表达式还可以使用与或非符号去连接,从而达到一个aop应用于多个切面多个切点。
但是这样的用法不够灵活,不够插件化,最好的方式就是开箱即用,随用随加。基于这样的需求,aop基于注解的实现方式,才是最灵活的。
基本步骤
构建自定义注解
构建注解aop的编织类(aspectj)
在配置文件中声明编织类(应用于controller的注解一定要在springmvc的配置文件声明,其他类型的编织类可在spring的配置文件里声明)
在对应的controller上应用注解,让aop抓取到该切点
tips:
1自定义注解的范围是可选的,一般用于方法级别
2在环绕通知上,返回json类型,可加上@ResponseBody,返回json,符合RestFul
具体的代码暂时没必要贴,官方文档写的很清晰。
英文一般的可以看翻译文档
https://www.gitbook.com/book/linesh/spring-mvc-documentation-linesh-translation/details
tips:
1此处配置的时候,如果是使用了spring+springMVC的模式下,需要注意spring和springMVC父子容器的问题,如果我们的@Token是标注于Controller(被@Controller或者@RestController注解标记)层的话,由于controller层是由springMVC容器来管理的,若此时我们的TokenAspect是由Spring来管理的话,由于在方法调用的时候,spring无法获取子容器的管理对象,aop就不起作用,自然@Token注解也就失效了。 所以这儿我们的aop也需要配置再springMVC的配置文件中,由SpringMVC来管理。
代码备份:
自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Target指定注解的目标为方法级
* Retention指定注解可以在运行时被获取(利用反射)
* Created by huxingyue on 2017/8/22.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TokenAnnotation {
}
aop
import com.sftc.tools.api.APIUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import static com.sftc.tools.common.ControllerHelper.responseEntityBuilder;
import static com.sftc.tools.common.RequestHeaderUtils.getUserBySystemAccessToken;
/**
* 通过AOP来验证token
* Created by huxingyue on 2017/8/21.
*/
@Component
@Aspect
@Order(10) //构建执行顺序
public class TokenAOPHelper {
@Before("@annotation(com.sftc.tools.common.TokenAnnotation)")
public void beforeCheck() throws Throwable {
System.out.println("- -前置");
}
@Around(value = "@annotation(com.sftc.tools.common.TokenAnnotation)")
@ResponseBody
public Object aroundCheck(ProceedingJoinPoint pjp) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String system_access_token = request.getHeader("system_access_token");
if (system_access_token == null) return APIUtil.paramErrorResponse("system_access_token missing");
//判断system_access_token是否有效
boolean flag = (getUserBySystemAccessToken(system_access_token) == null);
if (flag) {
return responseEntityBuilder(APIUtil.unauthorizedResponse("Unauthorized"));
} else {//如果有效 则继续执行
System.out.println("方法参数列表:");
toString1(pjp.getArgs());
return pjp.proceed();
}
}
private void toString1(Object[] args) {
for (Object o : args) {
System.out.println(o.toString());
}
}
}
<!-- 启动Aspectj注解模式驱动AOP --> <aop:aspectj-autoproxy proxy-target-class="true"/>
关于aop的两种方式-基于注解和基于aspectj的更多相关文章
- springmvc配置AOP的两种方式
spingmvc配置AOP有两种方式,一种是利用注解的方式配置,另一种是XML配置实现. 应用注解的方式配置: 先在maven中引入AOP用到的依赖 <dependency> <gr ...
- 使用aspectJ实现Spring AOP的两种方式
方式一:基于aspectJ的XML配置 方式二:基于aspectJ的注解方式 基于aspectJ的XML配置 1) 引入相关jar包 2) 创建Spring核心配置文件,必须导 ...
- 在Spring整合aspectj实现aop的两种方式
-----------------------------基于XML配置方案目标对象接口1 public interface IUserService { public void add(); pub ...
- k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...
- k8s 创建资源的两种方式【转】
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...
- k8s创建资源的两种方式(5)
一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg ...
- kubernetes创建资源的两种方式
一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令行的方式直接创建,比如: kubectl run httpd-app --image ...
- 第5篇K8S创建资源的两种方式
一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=r ...
- k8s创建资源的两种方式及DaemonSet应用(5)
一.创建方式分类 Kubernetes 支持两种方式创建资源: (1)用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg.yunwei.com ...
随机推荐
- poj_1679: The Unique MST【次小生成树】
题目链接 参考博客 希望注释足够清楚..欢迎指出不足~ #include<cstdio> #include<cstring> #include<algorithm> ...
- python数据结构之链表
在程序中,经常需要将⼀组(通常是同为某个类型的)数据元素作为整体 管理和使⽤,需要创建这种元素组,⽤变量记录它们,传进传出函数等. ⼀组数据中包含的元素个数可能发⽣变化(可以增加或删除元素). 对于这 ...
- 全面理解SSD和NAND Flash
Flash Memory又叫做闪存,是一种非易失性存储器.非易失性是指断电之后数据不会丢失,这里就涉及到断电保护(后面详细讲解). 总体思路 1.NAND Flash的用途. 2.NAND Flash ...
- CloseHandle 函数--关闭一个句柄
CloseHandle函数 来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx 作用 ...
- iBatis一些非见用法(相当实用)
兼顾效率,iBatis一些非见用法(10条) 2009-09-18 10:33:03 标签:iBatis 休闲 职场 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声 ...
- ASP.NET MVC 开发微信支付H5(外置浏览器支付)
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付. 主要用于触屏版的手机浏览器请求微信支付的场景.可以方便的从外部浏览器 ...
- 【bzoj3772】精神污染
Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...
- AdPlayBanner:功能丰富、一键式使用的图片轮播插件
AdPlayBanner:功能丰富.一键式使用的图片轮播插件 AdPlayBanner是一个Android平台基于ViewPager实现的轮播图插件,主要用以自动或者手动地播放轮播图,提供了Fresc ...
- Django 1.9 admin 使用suit 小记
最近项目做到了后台管理的部分.Django虽然提供了后台管理,但是界面不咋好看.所以我使用了suit.官网http://djangosuit.com/ 步骤: 1,安装suit 项目settings. ...
- Swift学习之方法定义参数有默认值的时候
func testParms(first fir:String, options opt:JSONSerialization.ReadingOptions = []) -> Bool { ret ...