博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring in Action 入门之面向切面编程AOP
阅读量:6849 次
发布时间:2019-06-26

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

注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考。欢迎留言讨论,持续更新中~

(该部分是Spring的面向切面编程AOP)

第四章 通知Bean

在软件编程中,散布于程序中多个地点的函数被称为“交叉事务”(日志管理、权限控制等)。从概念上来说,它们一般是与程序业务逻辑分开的,但经常却是直接嵌入其中的。把这些交叉事务与业务逻辑分离开正式面向切面编程(AOP)的作用所在,由此引入面向切面编程...

Spring AOP的实现原理是:创建一个代理Bean,绑定通知者类(通知者类包含切面代码切点),匹配相应的方法,在目标代码中嵌入执行切面的代码。


 

1. 通过配置来详细说明下Spring AOP的流程:(为了弄清楚原理,所以从配置讲起,虽然目前这种方式已经不常用了,Spring 2.0提供了更加优雅的解决方案。)

代理Bean的配置,ProxyFactoryBean

  • target:这个属性告诉ProxyFactoryBean哪个Bean需要被代理,通俗点就是哪个Bean需要运用切面代码,target配置的就是目标代码。
  • interceptorNames:配置通知者,通知者可以按照如下方式配置:
//通知者Bean,主要包含切面代码,需要实现MethodBeforeAdvice等接口,用来表示在目标代码执行前、后、抛出异常时候的切面代码
//AspectJ的切点匹配表达式,用来监测当目标代码执行perform操作时候,触发切面代码
  • proxyInterfaces:应该代理目标代码中的哪个接口(这个属性其实有点重复,切点表达式基本可以匹配了,自动代理就是基于这个的升级)

2. AspectJ通过注解提供了另外一个把POJO类注解成切面的方式,比较简洁,直接在Java代码中写注解,额外的配置就是在Spring的上下文中声明一个自动代理的Bean,这样才能知道如何把@AspectJ注解的Bean转化为代理通知。

import org.aspectJ.lang.annotation.Aspect;@Aspect //声明切面public class Audience {@Pointcut("execution(* *.perform(..))") //定义切点public void performance() {}@Before("performance()")  //切点之前执行public ....      @AfterReturning("performance()")  //切点之后执行public ...@AfterThrowing("performance()")  //切点抛出异常后执行public ...}

3. Aspect这种切面声明的方式已经直接在代码中修改,如果要把一个普通的POJO转化成切面,那就必须获得源代码,然后改变源代码,这点是我们不希望看到的。有没有办法,让我们可以引用任何Bean,作为切面呢? Spring 2.0提供了<aop:aspect>,是一个把POJO转化为切面的优雅方案。

//切面代码Bean
//定义切点
//切面代码具体方法,在切点前执行(下同)

 


总结:虽然Spring AOP对于大多数切面程序来说是足够了,但Java的构造函数与普通方法是有区别的(不能被继承),这使得Spring基于代理的AOP不能实现对象创建过程的通知。AspectJ实现的切面控制独立于Spring,提供了Spring AOP不可能实现的多种切点类型,这方面特性一般也没用到,有需要的朋友可以深入研究。

 

 

转载地址:http://peeul.baihongyu.com/

你可能感兴趣的文章
基于C#实现的开源自动更新程序
查看>>
Hadoop 集群启动一直处于safemode解决方法
查看>>
poj 2503:Babelfish(字典树,经典题,字典翻译)
查看>>
【转】eclipse中egit插件使用
查看>>
underscore的封装和扩展
查看>>
Grunt + Bower—前端构建利器(转)
查看>>
xpath属性值的模糊匹配
查看>>
221. Maximal Square
查看>>
python --文本文件的输入输出
查看>>
Tslib的移植【转】
查看>>
iOS开发--音乐文件播放工具类的封装(包含了音效的封装)
查看>>
如何获取一个AlertDialog中的EditText中输入的内容
查看>>
OpenGL帧缓存对象(FBO:Frame Buffer Object) 【转】
查看>>
hihoCoder_二分&#183;归并排序之逆序对
查看>>
掩码计算工具netmask
查看>>
linux中内核的一个不错的参数somaxconn
查看>>
android自动更新软件版本
查看>>
Silverlight 引路蜂二维图形库示例:绘制各种几何图形
查看>>
浅谈HTTP中Get与Post的区别
查看>>
Sql建表和sql语句的注意事项
查看>>