博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring aop
阅读量:6156 次
发布时间:2019-06-21

本文共 1195 字,大约阅读时间需要 3 分钟。

  hot3.png

假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如

1

但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。

2

但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。

通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。

3

为了在指定位置执行这些横向的功能,需要知道指定的是什么地方

4

例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是

通知类型 简介
Before(前置通知) 目标方法调用之前执行
After(后置通知) 目标方法调用之后执行
After-returning(返回通知) 目标方法执行成功后执行
After-throwing(异常通知) 目标方法抛出异常后执行
Around(环绕通知) 相当于合并了前置和后置

把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:

@Aspect@Componentpublic class UserAspect {		@Before("execution(* com.aop.service.impl.UserServiceImpl.login(..))")	public void loginLog(){		System.out.println("user login");	}}

使用注解**@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution**表达式声明在这个切点,格式如下 5

第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,*号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是login,则是指定了该类中的login方法。然后最后一个参数是方法入参,因为java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。

至此,我们就可以使用spring aop,但是还有两点需要得到注意

  1. 将切面类声明为一个bean
  2. 切点指定的方法所在的类也同样需由spring注入才能生效。

转载于:https://my.oschina.net/idaren/blog/704872

你可能感兴趣的文章
Oracle11gR2在9x8hk..Windows18669144449 命名进入Oracle
查看>>
Chrome 被曝 0day 漏洞,可让黑客获取用户数据
查看>>
Django 模板
查看>>
gitbook
查看>>
约三分之二的 DDoS 攻击指向通信服务提供商
查看>>
阿里深度学习框架开源了!无缝对接TensorFlow、PyTorch
查看>>
蚂蚁金服井贤栋:区块链和人工智能是影响未来的关键技术
查看>>
MySQL 基础---数据库维护和性能提高
查看>>
Linux基础命令---fold
查看>>
jedis简单类图
查看>>
java 电子商务云平台b2b b2c o2o springmvc+mybatis+spring cloud+spring boot
查看>>
[Django青铜修炼手册] 初识Django
查看>>
Android Fragment懒加载
查看>>
给你一个K8S的“发行版”
查看>>
Nginx 合集
查看>>
使用PHPCS+GIT钩子保障团队开发中代码风格一致性实践
查看>>
LVS+KEEPALIVED+nginx 7
查看>>
简书风云榜
查看>>
JQuery课堂学习笔记
查看>>
Node.js 文件系统
查看>>