静态代理、动态代理与AOP:

简单易懂:http://blog.csdn.net/hejingyuan6/article/details/36203505

补充:http://layznet.iteye.com/blog/1182924http://www.cnblogs.com/fingerboy/p/5335328.html

AOP:https://www.cnblogs.com/best/p/5679656.htmlhttps://www.cnblogs.com/hadoop-dev/p/7095464.html

Spring AOP常用的四种实现方式:http://www.360doc.com/content/10/1215/11/4957029_78291485.shtml

图解:

AOP有两种实现方式:预编译和动态代理。

例如事务处理:我们希望任何数据库操作的方法,尤其是insert,update需要做这种事务的处理,那我们肯定不希望在每一个方法上手动地开启事务,得到连接,提交事务,关闭连接,这样做成本很大,效率很低,所以我们希望有一种方式,对于开发人员是透明的,执行到某一个方法或是某种类型的方法,具有某种特点的方法,或者是某一层的类,比如说service或者以service结尾的类的时候,我们就可以开启事务控制,这就是一种实现统一维护的技术,实现方式有预编译和动态代理两种。

Spring没有提供AOP方式的日志系统,我们需要使用AOP(面向切面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。

配置切面:

实现:

图释:

将aBean这个bean作为一个切面来生命,id为myAspect

point概念及应用:

Spring没有提供AOP方式的日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。

图释:

这里的mappedNames就是要匹配的方法名的集合,这里<list>标签中的<value>也就是其中之一,这里sa*表示,映射的方法是以sa开头的所有的方法

例子:

xml配置文件:


接口:

实现类:

例子:

例子:

例子:

例子:

例子:

配置切入点:

在AOP中通知advice和一个切入点表达式相关联

图释:

上面的五个execution是Spring的AOP和AspectJ都支持的,下面的三个只有Spring的AOP支持的,

具体解释:

实现:

配置通知advice:

图释:

method是说明前置通知会调用哪个方法去执行,这个方法在aBean里进行实现

图释:

这里returning表示限制了method方法的返回值

例子:

切面类:

业务类:

测试类:

xml配置:

引入introductions:

Spring把引入当成一种特殊的通知,也就是一种特殊的包围通知,因为引入只能用在类这一等级上,所以我们使用引入时不能用切入点,引入为类增加了新的接口实现,而切入点定义一个通知涉及的那些方法。

introductions官方释义:允许一个切面声明一个实现指定接口的通知对象,并且提供一个接口实现类来代表这些对象。

例如:在xml配置文件中声明了一个before或者after,它们都会匹配到一个具体的实现类,如果使用declare-parents,它会给所有匹配的类型一个新的parent,也就是通过AOP的方式去给指定的匹配到的类型一个新的父类。

图释:

types-matching匹配什么样的类型,implement-interface具体使用哪一个接口,这也就是实现指定接口的通知对象,这个接口也就是通过implement-interface指定的,并且提供一个接口实现类来代表这个对象,接口实现类就是由default-impl来指定的。

我们在执行getBean之后,会把types-matching匹配的类强制转成下面声明的接口,为什么能强制转换,是因为declare-parents会用于声明所有匹配的类型拥有一个新的parent,也就是当前这个declare-parents匹配到了myService对应的这个类,所以它会给这个类指定一个新的parent,也就是UsageTracked,所以这里面改能做这种强制转换。

例子:

接口:

实现类:

xml配置文件:

测试类:

Advisors:

例子:

切面类:

service类:

测试类:

xml配置文件:

运行结果:

注意中间有一个空行,是测试类中执行了invoke方法之后再执行invokeException得到的。

最新文章

  1. win2003 64位系统IIS6.0 32位与64位间切换
  2. android中的万能适配器BaseAdapter的总结
  3. android TypedValue.applyDimension()的作用
  4. centos7 linux 安装jdk8
  5. 如何查看tensorflow版本与存储位置
  6. input子系统详解
  7. 很近没读书了,读书笔记之&lt;&lt;大道至简&gt;&gt;
  8. svn is already locked解决方案
  9. javascript类型系统之Array
  10. C#构架之基础学习----动态添加窗体和 控件
  11. SharePoint 内容部署-PowerShell
  12. N维法向量与N维超平面的关系的简单证明(日志二)
  13. 开发流程和Maven的配置
  14. bzoj 2302: [HAOI2011]Problem c
  15. Mysql 5.1的坑
  16. 配置服务器nginx 教程
  17. django模板语法
  18. update使用inner join
  19. css学习_css精灵技术、字体图标
  20. LeetCode题解之Linked List Cycle

热门文章

  1. 在阿里云上遇见更好的Oracle(三)
  2. Android之Audio和Video
  3. KMP板子+Trie板子
  4. CE-HTML简介
  5. java有几种对象(PO,VO,DAO,BO,POJO)
  6. Object empty value key filter
  7. oracle视图就是封装了一条写好的sql语句 可通过视图修改表结构 ; oracle需要手动创建序列
  8. BZOJ4321 queue2(动态规划)
  9. 【转】Win7装不上Office2010 提示MSXML 6.10.1129.0
  10. [洛谷P4779]【模板】单源最短路径(标准版)