一、spring 切面的Advisor
顾问(Advisor) : 他将通知进行了包装,根据通知的不同类型,在不同的时间点,将切面织入到指定的目标对象的某些连接点(方法)。PointCutAdvisor是顾问的一种,它是一个接口,有两个实现:
* NameMatchMethodPointCutAdvisor 名称匹配方法 切入点顾问详见appliactionContext.xml AdvisorTest.testBeforeAdvisor();
* RegexpMethodPointCutAdvisor 正则表达式方法匹配切入点顾问
a: * 匹配前面的子表达式任意次 比如: ao* 能匹配 a ao aoo aoooooo
b: + 匹配前面的子表达式一次或者多次 比如: ao+ 能匹配 ao aoo aooo
c: . 匹配任意字符 除"\r\n"之外的
.* 代表任意的一个字符串 .*add.* 代表包含add字符的任意字符串
详见appliactionContext.xml , AdvisorTest.testAfterAdvisor();
因为上节中我们学习了advice通知,那么它也有缺点,比如,通知只能切入目标类的所有方法,不能指定某些方法,(那么我可以解决这个问题,通过顾问对通知的封装而实现.
注意aop的这个方法经典的方法在实际开发中很少用,但是对后面的xml配置以及AspectJ注解开发的理解非常有用
1.我们采用名称名称匹配的方法
首先创建一个applicationContext-advisor.xml的配置文件
创建测试方法
结果:
也可以在配置文件中以数组的方式也可以得到同样的效果
2.通过正则表达式配置切入点顾问
同样配置applicationContext-advisorxml
测试方法
结果:
3. Spring提供了自动代理生成器来解决要定义多个代理的问题 ,有如下两种方式:
DefaultAdvisorAutoProxyCreator 可代理所有Bean自动代理生成器
* 默认advisor自动代理生成器 (为配置文件里面所有的advisor自动生成代理)
详见AtuoProxyCreatorTest .java , appliactionContext.xml
注意:1 :为配置文件里面所有的advisor自动生成代理 /会代理配置文件里面所有注册的目标对象
BeanNameAutoProxyCreator 可选择某些切面自动代理生成器
* bean名称自动代理生成器
可以配置新的applicationContext-auto.xml
重新定义一个接口,IPersonDao,实现addStudent()和midify()方法,并注册该类
测试及结果:
也可以为指定的bean配置代理生成器
在这是userDao的bean没有personDao的bean,我们一起来看看结果
如果改为personDao则同理
4.总结:
以上的各种技术无非就是,将我们编写的切面的实现(通知/顾问)织入到某些类的某些方法当中.
这些都是帮助理解AOP的思想,对我们后面的注解有较好的理解.
下节我们继续学习AOP的AspectJ基于注解的开发(前三节都是铺垫)