天天看点

第三章 AOP 通过Java API创建切面 3.4.1切点类型 3.4.2静态方法来匹配切面 3.4.3静态正则表达式方法配置切面 3.4.4动态切面 3.4.5流程切面 3.4.6复合切面 3.4.7引介切面

    在前面使用增强的时候,我们发现增强会被织入到目标类的所有的方法中。我们如果把增强织入到目标类的特定的方法中,需要使用切点进行目标连接点的定位。然后我们可以通过切点及增强生成一个切面了。

静态方法切点:org.springframework.aop.support.staticmethodmatcherpointcut

动态方法切点:org.springframework.aop.support.dynamicmethodmatcherpointcut

注解切点:org.springframework.aop.support.annotation.annotationmatchingpointcut

表达式切点:org.springframework.aop.support.expressionpointcut

流程切点:org.springframework.aop.support.controlflowpointcut

org.springframework.aop.support.staticmethodmatcherpointcutadvisor

在这里使用的是3.3.2的前置增强:

<a href="http://blog.csdn.net/p_3er/article/details/9239925">http://blog.csdn.net/p_3er/article/details/9239925</a>

只是userdaoimpl中有两个方法,save方法和delete方法。然后我们给save方法配置切面。

     这种方法不需要自己写切面类。

       org.springframework.aop.support.regexpmethodpointcutadvisor是正则表达式方法匹配的切面实现类。

1、.*set.*表示所有类中的以set为前缀的方法。如:com.abc.userdao.setname()。

2、com\.abc\.service\..*表示com.abc.service.包下所有的类的所有的方法。

com.abc.service.a.user.setname()

com.abc.service.userservice.save()

3、com\.abc\.service\..*service\..*表示com.abc.service包下以service结尾的类的所有的方法。如:com.abc.service.userservice.save()

4、com\.abc\.service\..*service\.save.+匹配所有以save为前缀的方法,而且save后必须拥有一个或多个字符。如:com.abc.service.userservice.saveuser()

org.springframework.aop.support.dynamicmethodmatcherpointcut类即有静态切点检查的方法,也有动态切点检查的方法。由于动态切点检查会对性能造成很大的影响,我们应当避免在运行时每次都对目标类的各个方法进行检查。

spring检查动态切点的机制:在创建代理时对目标类的每个连接点进行静态切点检查,如果仅静态切点检查就可以知道连接点是不匹配的,在运行期就不进行动态检查了;如果静态切点检查是匹配的,在运行期才进行动态方法检查。

动态切面通过defaultpointcutadvisor切面类与dynamicmethodmatcherpointcut切点结合起来生成。主要是针对连接点方法的参数。

在这里使用的是3.3.2的前置增强:

只是userdaoimpl中多了一个out方法,带一个参数。

一个类中的某一方法使用目标类的两个方法,那么我们可以使用流程切面给这两个方法都积入增强。

如:userserviceimpl类(使用类)operate方法中使用userdaoimpl(目标类)的两个方法。

流程切面使用controlflowpointcut与defaultpointcutadvisor结合形成。

在前面的例子中,我们所定义的切面都只有一个切点而已。有时候我们一个切面需要多个切点,也就是多个条件才能决定连接点。多个切点组成一个切点,这样的切点是复合切点。由复合切点加上增强形成的切面,称为复合切面。