在前面使用增强的时候,我们发现增强会被织入到目标类的所有的方法中。我们如果把增强织入到目标类的特定的方法中,需要使用切点进行目标连接点的定位。然后我们可以通过切点及增强生成一个切面了。
静态方法切点: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结合形成。
在前面的例子中,我们所定义的切面都只有一个切点而已。有时候我们一个切面需要多个切点,也就是多个条件才能决定连接点。多个切点组成一个切点,这样的切点是复合切点。由复合切点加上增强形成的切面,称为复合切面。