Spring AOP

Spring AOP

摘要

Spring AOP,面向切面编程,是spring中的一个重要概念。

首先要具体地解释一些面向切面编程的具体内涵。然后结合spring,讲讲面向切面编程在spring中是干嘛的,以及面向切面编程的实现原理,即动态代理。会有相关的文章解释动态代理,以及用java动态代理模拟spring。

spring中两种动态代理的方式,一是默认Spring AOP,默认基于java动态代理,另一个是AspectJ方式。

面向切面编程

听起来很抽象。举个例子

很多时候, 我们需要在某些功能执行前后执行一些功能.

比如说说, 现在有个方法 login(), 实现了登陆的功能. 我们需要在这个方法前后加一些功能, 比如

​ 方法执行前: 检查权限

​ 方法执行中: 抓取日志

​ 方法执行后: 记录时间

要求是不改变login本身的方法体. 那么该怎么办?

我们很容易就想到代理. 比如

比如以下, 给登陆模块套一层, p.login()调用前后干我们想干的事.

class 登陆模块{
    login(){...}
}
class 登陆模块代理proxy{
	登陆模块 p;
    login(){
     	检查权限();
        p.login();
        记录时间();
    }
}

以上. 在web应用中, 像这种需求是普遍存在的, 而且是类似的, 比如检查权限这个功能, 可能会在所有方法前我都想调用, 记录时间这个功能, 可能在所有方法后我都想调用.

一个很形象的想象是, web应用是功能多个这样的小功能模块的整合

在这里插入图片描述

形象地, 权限检查模块和记录时间模块就是切面.

脱离spring来说, 面向切面编程就是编写这些贯穿所有核心业务的辅助业务框架, 而且其实大多数辅助业务都是可复用的, 所以对于我们来说, 在某种意义上仅仅需要关注, 核心业务的编写. 简化了开发.

再进一步, 面向切面编程, 实际上解决的就是我们想在核心业务(方法)前后批量地添加方法, 本质上就是上面提到的代理.

但问题在于, 我们不能一个核心业务就写一个代理吧, 那就太麻烦了. 所以----

Spring能不能自动帮我们做编写代理类?

从我们把创建对象, 初始化对象, 对象依赖建立交给spring之后, 这又进一步运用spring作为框架, 简化我们的开发. 目的是, 把辅助业务和核心业务的编织----生成proxy这件事交给spring, 我们只需要告诉它, 谁和谁要编制在一起就行了.

核心的原理是java的反射机制以及动态代理机制.

反射机制是?

反射机制说白了就是将创建, 调用等等行为封装成对象, 可能有点抽象, 其实就是完成这样一件事 : 用字符串的形式给出类名, 方法名, 从而新建对象和调用方法. 用处在于, 我们可以通过配置文件, 只声明类名, 方法名, 而使得某套代码使用该类该方法, 新建调用. 最终, 我们若想改变类, 改变方法, 仅需要动配置文件, 而不需要动代码.

这也就是解耦了. 还是不懂的话, 还得取看看反射机制, 很简单的, 也没什么, 但是被广泛使用. 总之就是使得"配置文件动态编程"这件事成为可能, 这也是几乎所有框架的基本逻辑.

动态代理是?

参考动态代理的两篇文章, 第一篇是动态代理设计模式本身. 第二篇是用java反射机制和动态代理机制模拟spring的一些工作. 参考<动态代理>, 及<用反射及动态代理模拟Spring>

Spring中的动态代理有两种实现, 一种是基于java动态代理的spring aop的实现, 另一种则是GCLIB. 两种其实差不多. 这里只详细描述java动态代理的原理, 及模拟实现.

Spring 中AOP

同样不谈demo, 只总结相关的重要概念的理解. 参考文章<Spring中AOP的相关概念>

Spring 中面向切面编程的实现主要两个, 一个是基于上述动态代理的Spring AOP, 也是默认实现, 另一个是AspectJ.

语法参考手册就好了, 编写spring我目前觉得重点就是对这些概念的理解.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值