zoukankan      html  css  js  c++  java
  • AOP相关

    静态代理、动态代理与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配置文件:

    View Code

    接口:

    View Code

    实现类:

    View Code

    例子:

    View Code

    例子:

    View Code

    例子:

    View Code

    例子:

    View Code

    例子:

    View Code
    View Code
    View Code

    配置切入点:

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

    图释:

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

    具体解释:

    实现:

    配置通知advice:

    图释:

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

    图释:

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

    例子:

    切面类:

    View Code

    业务类:

    View Code

    测试类:

    View Code

    xml配置:

    View Code

    引入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:

    例子:

    切面类:

    View Code

    service类:

    View Code

    测试类:

    View Code

    xml配置文件:

    View Code

    运行结果:

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

  • 相关阅读:
    java 后端博客系统文章系统——No5
    啃碎并发(11):内存模型之重排序
    java 后端博客系统文章系统——No4
    啃碎并发(10):内存模型之内部原理
    java 后端博客系统文章系统——No3
    啃碎并发(九):内存模型之基础概述
    啃碎并发(八):深入分析wait&notify原理 猿码架构
    快速平方根倒数算法
    查找:哈希表
    注意力机制论文 --- Crop leaf disease recognition based on Self-Attention convolutional neural network
  • 原文地址:https://www.cnblogs.com/cing/p/7452280.html
Copyright © 2011-2022 走看看