关于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 ...
随机推荐
- 计算幂 51Nod 1046 A^B Mod C
给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^ ...
- JSON的详细介绍
JSON的语法可以表示以下三种类型的值: 简单值:可以表示字符串,数值,布尔值,null,但不支持undefined. 对象(Object):对象作为一种复杂数据类型,表示的是一组无序的键值对儿. 数 ...
- XRouter-像Retrofit一样使用阿里开源路由中间件
XRouter 一种基于Arouter的使用封装方案,实现对ARouter的Retrofit式使用. ARouter是阿里巴巴开源的Android平台中对页面.服务提供路由功能的中间件,没用过的务必点 ...
- super 与 this 同时使用问题
大家都知道this 和 super 调用构造函数时都必须放在第一句,今天同学问我的一个问题有点意思. 那么:我怎么在子类中 显式的用 super 初始化父类同时用 this 初始化子类? ------ ...
- 小白读iOS冗余资源扫描脚本
随着公司项目的不断功能迭代,项目的体积越来越大,各种瘦身策略迫在眉睫.由于平时使用Linux高级命令和 shell脚本的机会不多,之前学的知识一下子想起来很难.所有趁着这次看脚本,重新温习一下. 本文 ...
- ASP.NET Core MVC – Caching Tag Helpers
简介 缓存可以大大提高应用程序加载时间和响应速度.我们可以使用缓存Tag Helpers缓存不会频繁更改的HTML内容. 在上一篇文章中,我们谈到了Tag Helpers,演示Tag Helpers能 ...
- git分支管理之Feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来. 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合 ...
- oAuth 认证
这段时间公司开发项目用到oAuth2协议,现在做一下梳理. CORS即Cross Origin Resouce Share,跨域资源共享:是W3C为防止脚本攻击,而制定的安全标准之一,它云溪浏览器向跨 ...
- swift UITextField光标聚焦以及光标颜色修改
光标聚焦闪烁: nick_textField.becomeFirstResponder() 光标颜色修改 nick_textField.tintColor = UIColor.red 备份:http: ...
- java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...