Spring3.AOP

来源:互联网 发布:清茶淘客软件 编辑:程序博客网 时间:2024/05/16 09:58
AOP(Aspect Oriented Programming)
AOP是什么
     面向方面(切面)编程
基本概念
  • 关注点(concern):对软件工程有意义的小的、可管理的、可描述的软件组成部分,一个关注点通常只同一个特定概念或目标相关联。
  • 主关注点(core concern):一个软件最主要的关注点。例如银行转账,我们需要事务,不然可能会出现钱被扣除了,但是对方没有收到等问题。这个时候既要写事务的处理,又要写转账的功能,所以不符合主关键点(转账的主关键点是转账的功能)。
  • 关注点分离(separation of concerns,SOC):标识、封装和操纵只与特定概念、目标相关联的软件组成部分的能力,即标识、封装和操纵关注点的能力。
  • 方法(method):用来描述、设计、实现一个给定关注点的软件构造单位。
  • 横切(crosscut):两个关注点相互横切,实现它们的方法存在交集。
  • 支配性分解(dominant decomposition):将软件分解成模块的主要方式。传统的程序设计语言是以一种线性的文本来描述软件的,只采用一种方式(比如:类)将软件分解成模块;这导致某些关注点比较好的被捕捉,容易进一步组合、扩展;但还有一些关注点没有被捕捉,弥散在整个软件内部。支配性分解一般是按主关注点进行模块分解的。
  • 横切关注点(crosscutting concerns):在传统的程序设计语言中,除了主关注点可以被支配性分解方式捕捉以外,还有许多没有被支配性分解方式捕捉到的关注点,这些关注点的实现会弥散在整个软件内部,这时这些关注点同主关注点是横切的。
  • 侧面(aspect):在支配性分解的基础上,提供的一种辅助的模块化机制,这种新的模块化机制可以捕捉横切关注点。
     从主关注点中分离出横切关注点是面向方面的程序设计的核心概念。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过侧面来封装、维护,这样原本分散在在整个应用程序中的变动就可以很好的管理起来。
     简单的说,我们可以将特定领域(如 访问控制、事务管理、性能检测)问题的代码从业务逻辑中分离出来,然后通过AOP来封装、维护,这样分散在整个应用程序中的变动就可以很好的管理起来。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术

通知和类型
     前置通知:方法执行前执行,实现MethodBeforeAdvice
     后置通知:方法执行后执行,实现
AfterReturningAdvice
     环绕通知:在方法执行前和执行后都会执行,实现
MethodInterceptor
     异常通知:发生异常后会执行,实现
ThrowsAdvice
     最终通知:类似于异常处理中的finally作用,一般用于释放资源,实现
AfterAdvice

了解AOP代理

public class SimplePojo implements Pojo {    public void foo() {        // this next method invocation is a direct call on the 'this' reference        this.bar();    }    public void bar() {        // some logic...    }}
我们有一个接口为Pojo,SimplePojo实现此接口。此时我们要调用SimplePojo类中的方法,操作方法如下
public class Main {    public static void main(String[] args) {        Pojo pojo = new SimplePojo();        // this is a direct method call on the 'pojo' reference        pojo.foo();    }}
首先我们要创建对象,然后通过对象名来调用我们想调用的方法。如下

当我们使用代理的方式调用的时候,变化如下

上图可以看出,是放到了一个代理容器中,调用方法如下
public class Main {    public static void main(String[] args) {        ProxyFactory factory = new ProxyFactory(new SimplePojo());        factory.addInterface(Pojo.class);        factory.addAdvice(new RetryAdvice());        Pojo pojo = (Pojo) factory.getProxy();        // this is a method call on the proxy!        pojo.foo();    }}
上面只是了解AOP代理,在实际代码中不用这么麻烦的。

通知

个人理解:当我们在Spring配置文件中配置了切入点,Spring就会动态的生成代理工厂,将我们的方法放到代理工厂中,以便我们在调用这些方法的时候,切入某些功能。
前置通知

public class CountingBeforeAdvice implements MethodBeforeAdvice {    private int count;    public void before(Method m, Object[] args, Object target) throws Throwable {        ++count;    }    public int getCount() {        return count;    }}
前置通知实现MethodBeforeAdvice接口,并重写before()方法。注意:上面的代码是我从官网拷贝的与下面的截图不一样
参数:
    m:调用的方法名
    args:参数列表
    target:类。该方法属于哪个类
前置通知配置:





其它的几个通知与前置通知配置方法一样,只是实现的接口不同而已

后置通知
public class CountingAfterReturningAdvice implements AfterReturningAdvice {    private int count;    public void afterReturning(Object returnValue, Method m, Object[] args, Object target)            throws Throwable {        ++count;    }    public int getCount() {        return count;    }}
参数:
    returnValue:返回值
    m:调用的方法名
    args:参数列表
    target:类。该方法属于哪个类

环绕通知

一定要注意你导入的包是否正确


异常通知

关于异常通知,此接口有点特殊,此接口下没有任何方法,但是我们使用的时候要注意以下几点
      1.方法名必须为afterThrowing
      2.方法中的参数只有最后一个是必须的,前三个都是可选的。注:前三个要么都提供,要么一个也不提供。





使用注解实现通知



注意:使用注解的方式来配置切入点要在Spring的配置文件中加入


测试代码与执行结果










0 0
原创粉丝点击